当前位置: 首页 > article >正文

简单实现Spring容器(二)

阶段2:

 // 1.编写自己的Spring容器,实现扫描包,得到bean的class对象.
 2.扫描将 bean 信息封装到 BeanDefinition对象,并放入到Map.

思路:

1.将 bean 信息封装到 BeanDefinition对象中,再将其放入到BeanDefinitionMap集合中,集合的结构大概是
key[beanName]–value[beanDefintion]
key--------->对应指定的名字,未指定则以类的首字母小写为其名字
value------->对应封装好的BeanDefintion对象

2.因为bean的作用域可能是singleton,也可能是prototype,所以Spring需要扫描到bean信息,保存到集合,这样当getBean()根据实际情况处理.

具体实现

1.加一个自定义Scope注解

package com.elf.spring.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author 45~
 * @version 1.0
 * Scope 可以指定一个Bean的作用范围[singleton,prototype]
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Scope {
    //通过value可以指定singleton,prototype
    String value() default "";
}

2.在MonsterService.java上加上@Scope多实例注解

package com.elf.spring.component;
import com.elf.spring.annotation.Component;
import com.elf.spring.annotation.Scope;

/**
 * @author 45~
 * @version 1.0
 * 说明 MonsterService 是一个Servic
 */
@Component //把MonsterService注入到我们自己的spring容器中
@Scope(value = "prototype")
public class MonsterService {

}

3.准备ioc包下写一个BeanDefinition.java 用于封装记录Bean信息.

package com.elf.spring.ioc;

/**
 * @author 45~
 * @version 1.0
 * BeanDefinition 用于封装和记录Bean的信息 [1.scope 2.存放bean对应的Class对象,反射可以生成对应的对象]
 *  2:因为将来getBean()时有可能是多实例,有可能是动态生成的,还要存放bean的class对象
 */
public class BeanDefinition {
    private String scope;
    private Class clazz;

    public String getScope() {
        return scope;
    }

    public void setScope(String scope) {
        this.scope = scope;
    }

    public Class getClazz() {
        return clazz;
    }

    public void setClazz(Class clazz) {
        this.clazz = clazz;
    }

    @Override
    public String toString() {
        return "BeanDefinition{" +
                "scope='" + scope + '\'' +
                ", clazz=" + clazz +
                '}';
    }
}


http://www.kler.cn/a/161376.html

相关文章:

  • 量化交易系统开发-实时行情自动化交易-3.4.2.2.Okex交易数据
  • Scala学习记录,case class,迭代器
  • 大模型时代,呼叫中心部门如何自建一套大模型在线客服?
  • INQUIRE:一个包含五百万张自然世界图像,涵盖10,000个不同物种的专为专家级文本到图像检索任务设计的新型基准数据集。
  • 除了 Mock.js,前端还有更方便的 Mock 数据工具吗?
  • 大语言模型:解锁自然语言处理的无限可能
  • linux远程桌面管理工具(xrdp)、向日葵
  • UE4 双屏分辨率设置
  • 浅聊JAVA开发下环境部署与使用工具的安装与部署
  • yml配置文件获取数值不一致
  • ASP.NET Core 使用IIS调试出现505.24错误
  • electron调用dll问题总汇
  • 插件原理与开发
  • Tap虚拟网卡
  • 如何使用 Oracle SQL Developer 连接 pgvector
  • 【蓝桥杯选拔赛真题73】Scratch烟花特效 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析
  • Linux 线程——信号量
  • c++实验多态程序设计
  • Linux下安装Docker与Docker Compose
  • 数据库的索引
  • 3D模型格式转换工具HOOPS Exchange的典型应用场景介绍
  • 深入了解Java Period类,对时间段的精确控制
  • 理解js中原型链的封装继承多态
  • ky10 server x86在线安装ffmpeg
  • 在安全环境中使用虚拟化进行隔离——Armv8.4上的安全世界软件架构
  • Python插件 - 动态 简单账表 通过SQL存储过程输出列实现动态展示