Spring注解配置分析(一)——从启动到加载配置类

Spring是一个IOC容器,只要配置了bean之后在程序的其他地方可以自动注入实例,现在使用最多是注解配置,那么配置的那些 @Configuration、@EnableAutoConfiguration等注解是如何工作的呢?

  1. Spring是通过BeanFactory保存Bean的配置,那么BeanFactory如何创建?
    1. SpringApplication启动时在其run方法中会创建一个ApplicationContext的子类,以Servlet项目为例,会创建AnnotationConfigServletWebServerApplicationContext实例。
    2. 在创建AnnotationConfigServletWebServerApplicationContext实例时会通过父类GenericApplicationContext创建一个DefaultListableBeanFactory,这时的bean factory没有什么作用,后面会对这个bean factory进行修改。
  2. 如何发现有注解的类以及如何处理各种注解?
    1. 既然配置了注解,那么一定需要注解处理器来处理这些注解,所有首先加载的类应该是注解处理器。上面一个问题中已经知道会初始化一个AnnotationConfigServletWebServerApplicationContext 实例,它有两个重要属性 AnnotatedBeanDefinitionReader 和 ClassPathBeanDefinitionScanner。 AnnotatedBeanDefinitionReader 初始化时会通过 AnnotationConfigUtils 注入6个注解处理器,其中就包括处理 @Configuration 注解的 ConfigurationClassPostProcessor 。
    2. 注解处理器加载完成之后,就需要加载被注解的类。首先被加载的类是启动类,也就是通过run方法的参数传入的类型。通过 SpringApplication 的 prepareContext 方法将启动类添加到 bean factory 中。
    3. 经过前面两步 bean factory 中已经包含了注解处理器和带注解的启动类,在 AbstractApplicationContext 的 refresh 的过程中最终会调用 PostProcessorRegistrationDelegate 的 invokeBeanFactoryPostProcessors 方法,调用 BeanFactoryPostProcessor 的实现类(这里会循环调用,解析注解过程中产生的 BeanFactoryPostProcessor)。 ConfigurationClassPostProcessor 实现了 BeanDefinitionRegistryPostProcessor 间接实现了 BeanFactoryPostProcessor 接口,所以从调用 ConfigurationClassPostProcessor 开始,Bean 的注册工作就正式启动了。
  3. 前面的问题中只加载了启动类,其他有注解的类如何加载?

    首先可以肯定第一个处理的一定是启动类,在处理启动类的过程中,会解析启动类上的注解,这些注解通常都是用来声明需要加载哪些其他的类。例如 @ComponentScan 声明了需要加载的包, @Import 声明需要加载的一个或一组类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值