spring源码学习总结3-IOC-IOC常见扩展类
2021/4/13 14:25:20
本文主要是介绍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源码学习总结3-IOC-IOC常见扩展类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-04敏捷管理与看板工具:提升研发、设计、电商团队工作效率的利器
- 2025-01-04智慧养老管理工具如何重塑养老生态?
- 2025-01-04如何打造高绩效销售团队:工具与管理方法的结合
- 2025-01-04解决电商团队协作难题,在线文档工具助力高效沟通
- 2025-01-04春节超市管理工具:解锁高效运营与顾客满意度的双重密码
- 2025-01-046种主流销售预测模型:如何根据场景选用最佳方案
- 2025-01-04外贸服务透明化:增强客户信任与合作的最佳实践
- 2025-01-04重新定义电商团队协作:在线文档工具的战略作用
- 2025-01-04Easysearch Java SDK 2.0.x 使用指南(三)
- 2025-01-04百万架构师第八课:设计模式:设计模式容易混淆的几个对比|JavaGuide