Spring源码解析_Spring组件注册

参考资料:<<Spring源码深度解析>>

一、给容器注册组件的三种方式:

  • xml包扫描+@Component/@Controller/@Service/@Repository
  • 配置@Bean,可以对第三放jar进行注入
  • @Import 方式注入
  • 使用Spring提供的FactoryBean(工厂bean)

1.默认获取到的是工厂bean调用 getObject 创建的对象
2.要获取工厂bean本身,需要给 id 前加一个 " & " 标识

二、 注解使用

1、配置文件注解@Configuration/@Bean:

  • 创建一个类,用@Configuration,可以将该类注册为配置类,等同于原来的.xml配置文件。
  • 在配置类中可以填充实体bean,创建一个返回值为实体bean的方法,并在方法体上用@Bean注解,其中方法名称为bean的默认id。


  • 在main()函数中如何调用,使用AnnotationConfigApplicationContext,将配置类传入调用。


2、包扫描注解@ComponentScan以及包扫描规则

  • 当添加了@ComponentScan注解后,

@Controller
@Service
@Compnent
@Repository
以上标签均可以在创建的相应类上使用

  • 在配置类上添加@ComponentScan注解,并定义需要扫描的包路径,如下图:


  • 指定需要扫描或者排除的组件


  • FilterType 指定规则

FilterType.ANNOTATION :指定过滤注解的组件
FilterType.ASSIGNABLE_TYPE:按照指定的类型
FilterType.CUSTOM:自定义过滤规则,需要实现 TypeFilter 接口

3、@Scope注解的使用

  • Spring默认添加的组件都是单实例的
  • 可以使用@Scope()注解,为注入的bean提供作用域的范围:

session:同一次session创建一个实例
request:同一个请求创建一个实例
prototype:多实例,ioc容器启动时候不会调用方法创建创建对象,而是在
每次获取的时候才会调用方法创建对象
singleton:单实例,ioc容器启动的时候就会调用方法创建对象放入ioc容器中,以后每次获取就直接从容器中拿


4、@Lazy懒加载

  • 单实例bean,默认容器启动的时候就创建对象,
  • 懒加载指的是,容器启动不创建对象,在第一次使用(获取)bean的时候,再去创建对象,并进行初始化


5、 @Conditional 按照条件给容器中注册bean

  • 按照一定的条件进行判断,满足条件给容器注册bean
  • 获取环境变量:os.name --> 操作系统 的key


  • 创建Conditional的实现类


  • 在实体bean前添加@Conditional注解,满足条件后,才能进行注入


6、@Import:快速的导入组件,id默认是组件的全类名

  • 直接在配置类上添加@Import(xxx.class),id默认是组件的全类名(使用spring4.0.0版本该注解调用有误,切换成4.3.12)


  • 实现 ImportSelector 接口,返回需要导入的组件的全类名数组



  • 实现 ImportBeanDefinitionRegistrar 接口,手动注册bean到容器中



7、FactoryBean工厂bean注入spring容器中

  • 实现 FactoryBean 接口,用户可定制化bean的逻辑

T getObject() 方法,返回由FactoryBean创建的bean实例,如果isSingleton()返回true,则该实例会放到Spring容器中单实例缓存池中;
boolean isSingleton():返回由BeanFactory创建的bean的作用域是singleton还是prototype;
Class<T> getObjectType():返回由FactotyBean创建的bean的类型。

  • 要获取工厂bean本身,需要给id前加一个 '&' 标识


  • BeanFactory 与 FactoryBean的区别
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容