springbean的加载过程及应用场景分析

 更新时间:2024年04月29日 14:17:40   作者:易秋之  
Bean已经被实例化、属性注入、初始化,并且注册到容器中,可以被其他Bean或应用程序使用,这篇文章主要介绍了springbean的加载过程以及应用场景,需要的朋友可以参考下

加载过程

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");
        }
    }
}

到此这篇关于springbean的加载过程以及应用场景的文章就介绍到这了,更多相关springbean加载过程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JAVA8 List<List<Integer>> list中再装一个list转成一个list操作

    JAVA8 List<List<Integer>> list中再装一个list转成一个list操

    这篇文章主要介绍了JAVA8 List<List<Integer>> list中再装一个list转成一个list操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Springboot项目升级2.2.x升至2.7.x的示例代码

    Springboot项目升级2.2.x升至2.7.x的示例代码

    本文主要介绍了Springboot项目升级2.2.x升至2.7.x的示例代码,会有很多的坑,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • Java 深入探讨设计模式之原型模式篇

    Java 深入探讨设计模式之原型模式篇

    设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性
    2021-10-10
  • 基于SpringBoot实现IP黑白名单的详细步骤

    基于SpringBoot实现IP黑白名单的详细步骤

    IP黑白名单是网络安全管理中常见的策略工具,用于控制网络访问权限,根据业务场景的不同,其应用范围广泛,比如比较容易被盗刷的短信接口、文件接口,都需要添加IP黑白名单加以限制,所以本文给大家介绍了基于SpringBoot实现IP黑白名单的详细步骤,需要的朋友可以参考下
    2024-01-01
  • Java中的transient关键字解析

    Java中的transient关键字解析

    这篇文章主要介绍了Java中的 transient关键字解析,有时候我们的一些敏感信息比如密码并不想序列化传输给对方,这个时候transient关键字就派上用场了,如果一个类的变量加上了transient关键字那么这个字段就不会被序列化,需要的朋友可以参考下
    2023-09-09
  • Java中上传图片压缩处理的方法示例

    Java中上传图片压缩处理的方法示例

    本篇文章主要介绍了Java中图片压缩处理的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Java中equals与==的用法和区别

    Java中equals与==的用法和区别

    这篇文章主要给大家介绍了关于Java中equals与==的用法和区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 一篇文章带你了解JAVA面对对象应用

    一篇文章带你了解JAVA面对对象应用

    Java是一门面向对象的语言。对象是Java程序中的基本实体。除了对象之外Java程序同样处理基本数据。下面这篇文章主要给大家总结了关于Java中面向对象的知识点,需要的朋友可以参考借鉴,下面来一起看看吧
    2021-08-08
  • spring @Scheduled注解的使用误区及解决

    spring @Scheduled注解的使用误区及解决

    这篇文章主要介绍了spring @Scheduled注解的使用误区及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • MybatisPlus字段自动填充&乐观锁的方法实现

    MybatisPlus字段自动填充&乐观锁的方法实现

    MyBatis-Plus提供了便捷的自动填充功能,可用于自动处理创建时间、更新时间等字段,本文来介绍一下MybatisPlus字段自动填充&乐观锁的方法实现,感兴趣的可以了解一下
    2025-08-08

最新评论