bean的实例化和初始化
-
Instantiation:表示实例化,对象还未生成 Initialization:表示初始化,对象已经生成 InstantiationAwareBeanPostProcessor继承自BeanPostProcessor,它内部提供了3个方法,再加上BeanPostProcessor接口内部的2个方法,所以实现这个接口需要实现5个方法。
1.postProcessBeforeInstantiation()–自定义对象–>postProcessAfterInitialization();//一般不会走
2.postProcessBeforeInstantiation() -->postProcessAfterInstantiation–>postProcessBeforeInitialization()–>postProcessAfterInitialization() 我们看出:postProcessBeforeInstantiation一定执行, postProcessAfterInitialization一定执行.
1.InstantiationAwareBeanPostProcessor接口方法执行时机
实现该接口的常见类有CommonAnnotationBeanPostProcessor、AutowiredAnnotationBeanPostProcessor、AbstractAutoProxyCreator。
1.1 postProcessBeforeInstantiation()执行时机
AbstractAutowireCapableBeanFactory#createBean方法中的resolveBeforeInstantiation方法,doCreateBean方法之前。
-
AbstractAutoProxyCreator重写了该方法,作用是获取到切面类,在实例化第一个单例bean时,对所有我们自定义的切面类进行解析。然后放到缓存中,key是切面类name,value是advisor类型的数组,因为一个切面类可以有多个增强方法。
1.2 postProcessAfterInstantiation()执行时机
AbstractAutowireCapableBeanFactory#doCreateBean方法中的populateBean方法。
-
默认返回true。
1.3 postProcessProperties()执行时机
AbstractAutowireCapableBeanFactory#doCreateBean方法中的populateBean方法。postProcessAfterInstantiation()方法执行之后。
-
AutowiredAnnotationBeanPostProcessor重写了该方法,作用是获取到Autowired注解标注的字段(反射),然后调用getBean方法实例化,然后设置到引入它的bean中。 CommonAnnotationBeanPostProcessor重写了该方法,作用是获取到Resource注解标注的字段(反射),然后调用getBean方法实例化,然后设置到引入它的bean中。
2. BeanPostProcessor接口方法执行时机
2.1 postProcessBeforeInitialization()执行时机
AbstractAutowireCapableBeanFactory#doCreateBean方法中的initializeBean方法。
-
CommonAnnotationBeanPostProcessor继承的InitDestroyAnnotationBeanPostProcessor重写了该方法,作用是在每个类初始化时执行加了@PostConstruct注解的方法。做一些初始化工作。
2.2 postProcessAfterInitialization()执行时机
AbstractAutowireCapableBeanFactory#doCreateBean方法中的initializeBean方法。
-
AbstractAutoProxyCreator重写了该方法,作用是为aop类创建代理对象。