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

只列举最常用的

一、InitializingBean

方法:
afterPropertiesSet()

作用:
初始化Bean时(bean实例已经生成),修改Bean属性(需要类实现此接囗)

实际应用
springMVC的实现类AbstractHandlerMethodMapping,实现了InitializingBean,重写了afterPropertySet()方法:遍历容器中的bean,找出@Controller,@RequestMapping注解标记的方法,将类方法封装成HandlerMethod,与url做对映,保存在Map<T, HandlerMethod> mappingLookup中

二、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;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值