bean后处理器和生命周期

bean后处理器

# 执行时机:bean实例化之后,存到单例池之前
# bean被实例化后,最终缓存到singletonObjects单例池之前,中间会经过bean的初始化过程,如:属性的填充,初始化方法执行等等
# 其中有一个对外的扩展点BeanPostProcessor,称为Bean后处理
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName+ ":::postProcessBeforeInitialization");
        return null;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName+ ":::postProcessAfterInitialization");
        return null;
    }
}
<bean class="cn.guet.main.MyBeanPostProcessor"/>
/**执行时机
无参构造....
userService:::postProcessBeforeInitialization
afterPropertiesSet...
initMethod.....
userService:::postProcessAfterInitialization
*/

在postProcessAfterInitialization中可以使用动态代理对目标bean进行增强,返回proxy对象,进而存储到单例池中。

bean的生命周期

# 从bean实例化之后(即反射创建出对象),到成为一个完整对象,最终存储到单例池中,这个过程称为bean的生命周期
# 实例化阶段(取出BeanDefinition的信息,进行一系列判断,最终实例化对象)
# 初始化阶段(依赖注入\属性填充,执行一些Aware接口方法,BeanPostProcessor方法,InitializingBean方法,初始化方法等等)
# 完成阶段:存储到单例池中
# 初始化阶段的几个过程:
# 1.bean实例的属性填充,BeanDefinition中有对当前bean的注入信息(propertyValues字段)
# 2.aware接口的属性注入,方法回调
# 3.BeanPostProcessor的before方法
# 4.InitializingBean接口的方法
# 5.自定义初始化方法
# 6.BeanPostProcessor的after方法

在这里插入图片描述
循环依赖问题

# Spring提供了三级缓存存储完整Bean实例和半成品Bean实例,用于解决循环引用问题
# 在DefaultListableBeanFactory的上四级父类DefaultSingletonBeanRegistry中提供了如下三个Map
# 存储最终单例bean的容器(一级缓存)
# private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);
# 早期bean单例池,存储半成品对象,存储的对象已经被其他对象引用了(二级缓存)
# private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap(16);
# 单例bean的工厂池,存储半成品对象,对象未被引用,使用时通过ObjectFactory的getObject方法返回bean(三级缓存)
# private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);
# demo
# UserService和UserDao循环依赖
# UserService实例化对象,但尚未执行初始化流程,将UserService存储到三级缓存
# 属性注入需要UserDao,找不到,实例化UserDao,存储到三级缓存,属性注入需要UserService,从三级缓存获取UserService
# UserService从三级缓存移到二级缓存,UserDao执行其他生命周期过程,最终成为一个完整Bean,存储到一级缓存,删除二三级缓存
# UserService注入UserDao,执行其他生命周期过程,最终成为一个完整bean,存储到一级缓存,删除二三级缓存

aware接口

// 常用的几个,Spring检测到会执行相应的回调方法
// ServletContextAware,BeanFactoryAware,BeanNameAware,ApplicationContextAware
public class UserServiceImpl implements BeanFactoryAware,ServletContextAware,ApplicationContextAware {
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
    }
    public void setServletContext(ServletContext servletContext) {
    }
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    }
}

循环依赖以及解决方案
aware的使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值