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类创建代理对象。
经验分享 程序员 微信小程序 职场和发展