spring中的重点

@Configration加与不加有什么区别?

加了这个注解以后会在spring中标识了Full属性,如果不标记的话会标记为lite,不过该类会继续解析@ComponentScan和@Implort等。

有个Full标记以后,就会根据当前这个类生成CGLib代理对象,返回的也是代理对象。

而且对于该类中的@Bean方法的返回结果进行缓存,代理对象会先使用“&方法名”的方式先获取对象看是否为FactoryBean,如果是的话,还要对getObject返回的对象继续做动态代理。而每次是否需要代理,是根据cglib增强了一个接口作为标识决定的,如果已经实现则已经代理完毕,直接返回。

这就是加了@Configration和不加的区别。

import有哪3中情况?

(1)第一种情况@Import(selector)类:这个时候会调用实现了ImportSelector接口的selector方法(该对象本身不会添加为bean),返回字符串并反射创建对象(该对象会被添加为bean),然后继续递归查看当前对象是否继续有@Import注解,继续解析,直到完毕,ps:注意使用这种接口接入的类型你无法参与beanDefinition的修改,只能是操作原有的对象

         项目:我们在这里扫描第三方的扩展jar包。

这种情况我们以AOP为例子,我们可以根据该注解添加情况,决定是否给某些bean添加代理。

(2)第二种情况@Import普通类,直接添加为bean。

(3)第三种情况@Import一个实现了ImportBeanDefinitionRegister接口的类。ps:这相当于把beanDefinition注册器提供给你,完全由你掌控。

         项目:这里我们举一个例子,我们oes环境vadp两个历史遗留环境需要初始化不同的数据源,我们在bi项目启动的时候让其@Import一个实现了ImportBeanDefinitionRegistrar接口的类型;spring在处理BeanDefinition的时候会回调我自定义的registerBeanDefinitions方法,我们会"手动定义一个数据源的beanDefinition"

Spring Bean后置处理器哪些接口?
(1)BeanPostProccess:能够插手Bean的实例化过程,在bean还没有放入容器之前,而该接口回调方法在“调用构造方法之后”调用的;

而该接口中的方法是由CommonAnnotationBeanProcessor类进行回调的。

(2)BeanFactoryPostProcess:

该回调接口会在每个bean创建之前进行回调。典型代表ConfigrationClassPostProcessor#postProcessBeanFactory方法会对标记了@Configration的类实现cglib代理,这是在BeanFactoryPostProcess层面做的事儿。

(3)BeanDefinitionRegistryPostProcessor:

BeanDefinitionRegistyPostProcessor是BeanFactoryPostProcess的子类,接口方法在BeanFactoryPostProcess的接口方法之前执行。在spring代码中有两个集合分别存放BeanDefinitionRegistyPostProcessor的实现和BeanFactoryPostProcess的实现,而优先会处理BeanDefinitionRegistyPostProcessor集合。

spring内部通过AnnotatedBeanDefinitionReader添加了ConfigrationClassPostProcessor类的定义,并实现;该类是spring的核心会去处理@Import以及@Bean,以及扫描所有的@Component类,最后形成spring bean。

原文地址:https://www.cnblogs.com/zzq-include/p/12157557.html