当前位置: 首页 > 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/news/161376.html

相关文章:

  • 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存储过程输出列实现动态展示
  • Apache Hive(部署+SQL+FineBI构建展示)
  • 【Element】el-table组件使用summary-method属性设置表格底部固定两行并动态赋值
  • SCI常用的连接词
  • SpringBoot自动重启
  • solidity案例详解(六)服务评价合约
  • 集成开发环境 PyCharm 的安装【侯小啾python基础领航计划 系列(二)】
  • ARM虚拟化与车联网安全应用
  • 第二十一章网络通信总结博客
  • 最全的DEM数据,我给你们处理好了
  • SpringBoot中MyBatis-Flex的集成和使用