spring源码学习总结3-IOC-IOC常见扩展类

只列举最常用的

一、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;
	}
上一篇:Spring Bean生命周期


下一篇:Spring源码分析系列——bean创建过程分析(二)——有参构造方法创建bean