小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
19. spring容器启动时,为什么先加载BeanFactoryPostProcess
1.做扩展。因为BeanDefinition会在ioc容器加载的时候先注册,而BeanFactoryPostProcess就是在所有的BeanDefinition注册完后做扩展的,所以要先加载BeanFactoryPostProcess 2、解析配置类。解析配置类的组件它就实现BeanFactoryPostProcess,所以要先去加载BeanFactoryPostProcess
20. Spring BeanDefinition的注册顺序
- @Configuration
- @Component
- @Import
- @Bean
当然也可以通过@Order()设置优先级
21.Spring中配置Bean的三种方法
-
1.XML配置文件。
- a. spring xml 中配置 < bean>
-
2.基于注解的配置。Spring2.5+版本后
- a. spring xml中配置<component-scanbase-package=""/> 通过这些注解去使用 @Component @Autowired
-
3.基于java的配置。JavaConfig Spring 3、0+版本后 通过这些注解去使用 @Configuration @Bean
22.@Autowired注解的自动装配
- 在创建一个spring上下文的时候再构造函数中进行汪册 AutowiredAnnotationBeanPostProcessor,这类XXXBeanPostProcessor就是在执行初始化方法的前后进行一次后置处理。
- 在Bean的创建过程中进行解析
- 在实例化后进行预备解析@Autowired主的属性、方法比如:把属性的类型、名称、属性所在的类……元数据缓存起来)
- 在属性注入真正的解析(拿到上一步缓存的元数据去Ioc容器帮进行查找,并且返回注入)
- 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据,
- 如果询的结果不止一个,那么@Autowired首先会根据名称来直找,如果配置了 @Qualifle 会先其中配置去匹配;
- 如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false
23.@Configuration的作用和原理
没有 @Configuration 也是可以配 @Bean,但加了 @Configuration 会为配置类创建cglib动态代理(保证配置类 @Bean方法调用Bean的单例)进行获取,而 @Bean方法的调用就会通过容器的getBean方法去获取Bean。
原理:
- 创建Spring上下文的时候会注册一个解析配置的处理器 ConfigurationClassPostProcessor(实现BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor)
- 在调用invokeBeanFactoryPostProcessor,就会去调用ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry进行解析配置(解析配置类说白就是去解析各种注解(@Bean @Configuration @lmport @Component…就是注册BeanDefinition)
- ConfigurationCIassPostProcessor.postProcessBeanFactory去创建cglib动态代理