实例化:就是new 对象;
初始化:就是在new对象之后,给字段赋值
就是对这一段代码进行分析,注册bean后置处理器
registerBeanPostProcessors(beanFactory);
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
</dependencies>
public class A implements InitializingBean {
public A(){
System.out.println("A被实例化了,new对象了");
}
public void aa(int a){
System.out.println("属性赋值:"+a);
}
public void afterPropertiesSet() throws Exception {
System.out.println("set赋值之后调用");
}
}
@Component
public class B implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("bean初始化之前调用:"+beanName);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("bean初始化之后调用:"+beanName);
return bean;
}
}
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(TestConfig.class);
}
}
//扫描包 使得 使用@Component注解生效
@ComponentScan("com.dmg")
@Configuration
public class TestConfig {
@Bean
public A a(){
A a=new A();
a.aa(111);
return a;
}
}
跟着箭头走
![](https://img-blog.csdnimg.cn/img_convert/b0d8d660ecccd22f4a8815bcdecd5ee2.png)
![](https://img-blog.csdnimg.cn/img_convert/5d0aa0b670f3f96c6c4a74afd9a3494e.png)
![](https://img-blog.csdnimg.cn/img_convert/3794d9f24e5bcbc5fc2352d79f2ff549.png)
获取实现了BeanPostProcessor类的,所有后置处理器的名称
把BeanPostProcessorChecker添加到bean工厂的bean后置处理器中
循环后置处理器名称数组
判断是否是实现了优先级PriorityOrdered这个类,如果是,从bean工厂中,获取信息,然后放入优先级这个集合中
如果是MergedBeanDefinitionPostProcessor,那么放入internalPostProcessors集合中
如果是实现了有序的Ordered类,那么把ppName放入有序的集合中
否则把ppName放入其他集合中
对后置处理器进行排序
注册优先级bean后置处理器,到bean工厂中
![](https://img-blog.csdnimg.cn/img_convert/9131557990f07001cedbf57569e2e042.png)
![](https://img-blog.csdnimg.cn/img_convert/4092354047e68f97175bb5b5a53f9b17.png)
循环有序的后置处理器名称集合
从bean工厂中拿到对应的bean后置处理器
放入有序的后置处理器中
如果是实现了MergedBeanDefinitionPostProcessor,那么放入internalPostProcessors中
对有序的bean后置处理器,进行排序
然后把有序的bean后置处理器,添加到bean工厂中
![](https://img-blog.csdnimg.cn/img_convert/032669271b162cb6c50f4f24180c7046.png)
循环其他的后置处理器名称集合
从bean工厂中拿到对应的bean后置处理器
放入其他的后置处理器中
如果是实现了MergedBeanDefinitionPostProcessor,那么放入internalPostProcessors中
对其他的bean后置处理器,进行排序
然后把其他的bean后置处理器,添加到bean工厂中
然后把internalPostProcessors,添加到bean工厂中
![](https://img-blog.csdnimg.cn/img_convert/7cca122f2a4f04136a73a4f22d1ac2a0.png)
最后把ApplicationListenerDetector添加到bean工厂中
![](https://img-blog.csdnimg.cn/img_convert/3dffaf7c56a2ee7e1dba2ab8b3c10f7a.png)
等到所有的最后完成刷新bean工厂的时候
走到AbstractAutowireCapableBeanFactory类下面的2个方法
就会打印实现了BeanPostProcessor的2个方法
![](https://img-blog.csdnimg.cn/img_convert/7fc86cbe2d091386a2f4b03f77dd5da8.png)
![](https://img-blog.csdnimg.cn/img_convert/b64e6e754fee8cfec6031cb422c1f4f3.png)