只列举最常用的
一、InitializingBean
方法:
afterPropertiesSet()
作用:
初始化Bean时(bean实例已经生成),修改Bean属性(需要类实现此接囗)
二、BeanPostProcessor
方法:
postProcessBeforeInitialization(Object bean, String beanName)
postProcessAfterInitialization(Object bean, String beanName)
作用:
1.处理Bean对应Java类中的注解信息或者创建Bean的代理对象
2.初始化Bean时(bean实例已经生成),修改Bean属性(对所有类都生效)
实际应用:
AOP的实现类AbstractAutoProxyCreator,实现了BeanPostProcessor,重写了postProcessAfterInitialization()方法
三、BeanFactoryPostProcessor
方法:
postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
作用:
1.修改BeanDefinnition(BeanDefinnition存在于map,而map存在BeanFactory中,所以传参为beanFactory)
2.修改的是BeanFactory的BeanDefinition(bean实例还未生成,此时只有BeanDefinition),从根本上改
四、BeanDefinitionRegistryPostProcessor
一个接口,继承了BeanFactoryPostProcessor
方法:
postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
作用:
可向BeanFactory中添加BeanDefinition
实际应用:
ConfigurationClassPostProcessor,实现了BeanDefinitionRegistryPostProcessor接囗,重写了postProcessBeanDefinitionRegistry方法,解析加了@Configuration的配置类,还会解析@ComponentScan、@ComponentScans注解扫描的包,以及解析@Import等注解
五、FactoryBean
一个接口
一个Bean实现了此接口,会变成一个Factory,通过getObject()将一个Object暴露出去
方法:
T getObject()
作用:
用于处理配置较为复杂或者由动态代理生成的Bean实例
实际应用:
MyBatis与Spring整合有使用到,用于创建Mapper的代理对象和SqlSessionFactory对象
springAop中有使用到,ProxyFactoryBean用于初始化和返回代理对象
注意:
beanfactory.getbean(“beanFactoryName”),获得factorybean中getObject中返回的对象
beanfactory.getbean("&beanFactoryName"),获得factorybean本身
六、对上一节Bean初始化流程中的第6点(对bean实例做一些初始化操作)做下补充
1.遍历BeanPostProcessor的所有实现类,执行其前初始化方法postProcessBeforeInitialization方法(注:针对全部Bean生效)
2.类是否实现了接囗InitializingBean,如果是,执行其afterPropertiesSet方法
3.遍历BeanPostProcessor的所有实现类,执行其后初始化方法postProcessAfterInitialization方法(注:针对全部Bean生效)
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object run() {
invokeAwareMethods(beanName, bean);
return null;
}
}, getAccessControlContext());
}
else {
invokeAwareMethods(beanName, bean);
}
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
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()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}