springbean的加载过程以及应用场景

本文详细解释了Spring框架中Bean的创建过程,包括BeanFactory和ApplicationContext的作用,以及如何通过自定义InstantiationAwareBeanPostProcessor如MyBeanPostProcessor进行实例化前后、依赖注入和初始化阶段的定制。特别关注了`lifeCycleBean`的处理情况。
摘要由CSDN通过智能技术生成

加载过程

  1. 加载配置文件

    spring在启动的时候会先创建BeanFactory的示例,BeanFactory是一个接口具体实现主要使用的是:ApplicationContext。它会读取XML的bean配置或者使用注解配置的类,将这个bean配置为BeanDefinition对象

  2. 实例化bean

    解析完成bean的定义后,会调用createBeanInstance() 方法创建bean的实例,相当于操作符 new

  3. 设置bean的属性

    在populateBean()方法中,Spring会使用AurowiredAnnotationBeanPostPrecessor等后置处理器,进行依赖注入,将bean的属性设置到Bean的实例中。

  4. 调用初始化方法

    这里会调用initializeBean()方法初始化。如果Bean实现了InitializingBean接口或配置了init-method,则会在这一步调用初始化方法。

  5. 注册bean

    完成初始化后,Spring会将Bean注册到BeanFactory的容器中,以便后续能够根据Bean的名称或类型获取到Bean实例。

  6. bean的后置处理器

    在Bean创建过程中,Spring会应用注册的BeanPostProcessor,如CommonAnnotationBeanPostProcessor等,来对Bean进行增强处理,例如AOP代理、事件发布等。

  7. 完成bean的创建
    Bean已经被实例化、属性注入、初始化,并且注册到容器中,可以被其他Bean或应用程序使用。

实际使用

  • 实现了InstantiationAwareBeanPostProcessor 对Bean的创建过程进行定制
    
@Component
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor, DestructionAwareBeanPostProcessor {
    private static final Logger log = LoggerFactory.getLogger(MyBeanPostProcessor.class);

    // 实例化之前
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean")) {
            log.info("初始化之前执行, 这里返回的bean会替换原版本的bean");
        }
        return null;
    }
    // 实例化之后
    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean")) {
            log.info("实例化之后执行, 这里返回false会跳过依赖注入阶段");
            //return false;
        }
        return true;
    }

    // 依赖注入阶段执行
    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        if(beanName.equals("lifeCycleBean")){
            log.info("依赖注入阶段执行, 如@Autowired, @Value, @Resource");
        }
        return pvs;
    }


    // 初始化之前
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if(beanName.equals("lifeCycleBean")){
            log.info("初始化之前执行, 这里返回的对象会替换原本的bean, 如@PostConstruct, @ConfigurationProperties");
        }
        return bean;
    }

    // 初始化之后执行
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean")) {
            log.info("初始化之后执行, 这里返回的对象会替换原本的bean, 如代理增强");
        }
        return bean;
    }


    // 销毁之前
    @Override
    public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
        if(beanName.equals("lifeCycleBean")){
            log.info("销毁之前执行, 如 @PreDestroy");
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值