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。


    Spring源码解析_Spring组件注册_第1张图片
  • 在main()函数中如何调用,使用AnnotationConfigApplicationContext,将配置类传入调用。


    Spring源码解析_Spring组件注册_第2张图片

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

  • 当添加了@ComponentScan注解后,

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

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


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


    Spring源码解析_Spring组件注册_第3张图片
  • FilterType 指定规则

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

Spring源码解析_Spring组件注册_第4张图片

3、@Scope注解的使用

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

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


Spring源码解析_Spring组件注册_第5张图片

4、@Lazy懒加载

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


    Spring源码解析_Spring组件注册_第6张图片

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

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


    Spring源码解析_Spring组件注册_第7张图片
  • 创建Conditional的实现类


    Spring源码解析_Spring组件注册_第8张图片
  • 在实体bean前添加@Conditional注解,满足条件后,才能进行注入


    Spring源码解析_Spring组件注册_第9张图片

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

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


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


    Spring源码解析_Spring组件注册_第10张图片

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


    Spring源码解析_Spring组件注册_第11张图片

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

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

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

Spring源码解析_Spring组件注册_第12张图片
  • 要获取工厂bean本身,需要给id前加一个 '&' 标识


  • BeanFactory 与 FactoryBean的区别

你可能感兴趣的:(Spring源码解析_Spring组件注册)