首先,明确接口的概念;
InitializingBean接口是为了让 bean 在构建完毕后执行一些自定义的操作BeanPostProcessor是 spring 提供的整个容器级别的生命周期接口, 用来对容器内所有 bean 的初始化做回调- BeanPostProcessor 用来实现 AOP. AOP 因为要返回 bean 的代理对象, 而 BeanPostProcessor 的
postProcessAfterInitialization方法恰恰是在实例化后调用, 所以可以再这个方法内, 返回一个 bean 的代理对象, 从而实现 AOP AutowiredAnnotationBeanPostProcessor是 spring 内部的一个 BeanPostProcessor, 用来自动装配 bean 上的注解字段, setter 方法调用, 和任何其他的装配方法
- BeanPostProcessor 用来实现 AOP. AOP 因为要返回 bean 的代理对象, 而 BeanPostProcessor 的
生命周期顺序为:
aware接口BeanPostProcessor.postProcessBeforeInitialization()InitializingBean.afterPropertiesSetBeanPostProcessor.postProcessAfterInitialization()
这个顺序是 beanfactory 类里面调用的, 以 AbstractAutowireCapableBeanFactory 为例
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
invokeAwareMethods(beanName, bean);
return null;
}, getAccessControlContext());
}
else {
//若果Bean实现了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware则初始化Bean的属性值
invokeAwareMethods(beanName, bean);
}
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
//applyBeanPostProcessorsBeforeInitialization 方法内部主要是
//用来调用后置处理器BeanPostProcessor的postProcessBeforeInitialization方法
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
//Bean如果继承了InitializingBean类则会调用afterPropertiesSet方法,如果设置了init-method方法,
//则调用init-method方法,afterPropertiesSet方法在init-method方法之前调用
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex);
}
if (mbd == null || !mbd.isSynthetic()) {
//applyBeanPostProcessorsAfterInitialization 方法内部主要是,
//用来调用后置处理器BeanPostProcessor的postProcessAfterInitialization方法
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}
本文详细解析了InitializingBean接口的作用,BeanPostProcessor在Spring中的关键位置,以及它们在bean生命周期中的执行顺序。重点介绍了AutowiredAnnotationBeanPostProcessor如何实现自动装配,并通过实例阐述了各接口和方法的工作原理。
1万+

被折叠的 条评论
为什么被折叠?



