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

}

相关推荐

  1. springbean过程以及应用场景

    2024-04-28 14:04:01       38 阅读
  2. JVM学习——类以及过程

    2024-04-28 14:04:01       38 阅读
  3. 简单上手SpringBean整个装配过程

    2024-04-28 14:04:01       30 阅读
  4. 理解DOM树过程

    2024-04-28 14:04:01       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-28 14:04:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-28 14:04:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-28 14:04:01       82 阅读
  4. Python语言-面向对象

    2024-04-28 14:04:01       91 阅读

热门阅读

  1. Python构建学生信息管理系统:前端页面开发

    2024-04-28 14:04:01       35 阅读
  2. leetcode58 最后一个单词的长度

    2024-04-28 14:04:01       34 阅读
  3. MySQL商城数据表(50-59)

    2024-04-28 14:04:01       27 阅读
  4. fofa 是一个什么样的工具

    2024-04-28 14:04:01       37 阅读
  5. Android 开机流程

    2024-04-28 14:04:01       35 阅读
  6. 笨蛋学C++【C++基础第五弹-C++Demo练习题】

    2024-04-28 14:04:01       31 阅读
  7. 规范化-RESTful URL

    2024-04-28 14:04:01       38 阅读
  8. 企微魔盒V15.6独立版源码+搭建环境教程

    2024-04-28 14:04:01       37 阅读
  9. 情绪:本来无一物,何处惹尘埃

    2024-04-28 14:04:01       34 阅读
  10. AXI4---锁定访问

    2024-04-28 14:04:01       34 阅读