阿里大佬的Spring面试题知识点总结 (四)

226 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

19. spring容器启动时,为什么先加载BeanFactoryPostProcess

1.做扩展。因为BeanDefinition会在ioc容器加载的时候先注册,而BeanFactoryPostProcess就是在所有的BeanDefinition注册完后做扩展的,所以要先加载BeanFactoryPostProcess 2、解析配置类。解析配置类的组件它就实现BeanFactoryPostProcess,所以要先去加载BeanFactoryPostProcess

20. Spring BeanDefinition的注册顺序

  1. @Configuration
  2. @Component
  3. @Import
  4. @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注解的自动装配

  1. 在创建一个spring上下文的时候再构造函数中进行汪册 AutowiredAnnotationBeanPostProcessor,这类XXXBeanPostProcessor就是在执行初始化方法的前后进行一次后置处理。
  2. 在Bean的创建过程中进行解析
    1. 在实例化后进行预备解析@Autowired主的属性、方法比如:把属性的类型、名称、属性所在的类……元数据缓存起来)
    2. 在属性注入真正的解析(拿到上一步缓存的元数据去Ioc容器帮进行查找,并且返回注入)
      • 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据,
      • 如果询的结果不止一个,那么@Autowired首先会根据名称来直找,如果配置了 @Qualifle 会先其中配置去匹配;
      • 如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false

23.@Configuration的作用和原理

没有 @Configuration 也是可以配 @Bean,但加了 @Configuration 会为配置类创建cglib动态代理(保证配置类 @Bean方法调用Bean的单例)进行获取,而 @Bean方法的调用就会通过容器的getBean方法去获取Bean。

原理:

  1. 创建Spring上下文的时候会注册一个解析配置的处理器 ConfigurationClassPostProcessor(实现BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor)
  2. 在调用invokeBeanFactoryPostProcessor,就会去调用ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry进行解析配置(解析配置类说白就是去解析各种注解(@Bean @Configuration @lmport @Component…就是注册BeanDefinition)
  3. ConfigurationCIassPostProcessor.postProcessBeanFactory去创建cglib动态代理