前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简单介绍一下spring bean的生命周期_java类的生命周期

简单介绍一下spring bean的生命周期_java类的生命周期

作者头像
全栈程序员站长
发布2022-09-29 11:28:05
4310
发布2022-09-29 11:28:05
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

1.spring bean生命周期

spring bean生命周期
spring bean生命周期

2.Aware接口

2.1.作用

一个标记,标记在spring容器初始化时需要获取上下文中当前的一些运行环境;

2.2.常用接口

  • ApplicationContextAware:获取ApplicationContext spring上下文;
  • ApplicationEventPublisherAware:获取ApplicationEventPublisher事件发布器;
  • BeanClassLoaderAware:获取当前的ClassLoader类加载器;
  • BeanFactoryAware:获取BeanFactory bean工厂;
  • BeanNameAware:获取bean的名称;
  • EnvironmentAware:获取Environment当前环境变量;
  • ImportAware:获取AnnotationMetadata注解元数据,需要与@Import注解配合使用,感觉功能与ImportSelector接口类似;
  • NotificationPublisherAware:获取NotificationPublisherJMX通知发布器;
  • ServletContextAware:获取ServletContext servlet上下文;

3.IOC扩展点

  • 作用:允许在spring对bean进行声明、注册 、实例化(Instantiation)、初始化(Initialization)和销毁的各个阶段,添加自定义的处理逻辑;

3.1.BeanFactoryPostProcessor接口

  • BeanFactory处理器。这时Bean已经注册,但还未创建,一般在这里修改Bean的属性;
代码语言:javascript
复制
/**
 *********************************************************
 ** @desc  : BeanFactoryPostProcessor示例
 **          BeanFactory扩展点,BeanFactory的后处理器。Bean已经注册,还没有创建,一般在这里修改Bean的属性
 ** @author  Pings
 ** @date    2020/7/25
 ** @version v1.0
 * *******************************************************
 */
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        //**获取user的BeanDefinition
        BeanDefinition beanDefinition = beanFactory.getBeanDefinition("user");
        //**获取user的属性
        MutablePropertyValues pv = beanDefinition.getPropertyValues();
        //**修改user的age属性
        pv.addPropertyValue("age", 88);
        //**设置为单例
        beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
    }
}

3.2.BeanDefinitionRegistryPostProcessor接口

  • BeanFactory处理器的子接口,会在BeanFactoryPostProcessor之前调用。这时所有BeanDefinition已经被加载;一般在这里注册Spirng无法自动注册的bean,比如第三方的bean;
代码语言:javascript
复制
/**
 *********************************************************
 ** @desc  : BeanDefinitionRegistryPostProcessor示例
 **           Bean注册处理器,BeanFactoryPostProcessor子接口。Bean已经注册,还没有创建,一般在这里注册的bean
 ** @author  Pings
 ** @date    2020/7/25
 ** @version v1.0
 * *******************************************************
 */
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

    //**注册MyClass对象
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        //**创建一个Bean
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(MyClass.class);
        //**设置班级名称
        builder.addPropertyValue("name", "118班");
        //**设置可通过@Autowire注解引用
        builder.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME);
        //**注册到BeanDefinitionRegistry
        registry.registerBeanDefinition("myClass", builder.getBeanDefinition());
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        //**与BeanFactoryPostProcessor相同
    }
}

3.3.BeanPostProcessor接口

  • Bean初始化处理器,包括前置处理器和后置处理器,在bean初始化前后定义处理逻辑,这时Bean已经创建;
代码语言:javascript
复制
/**
 *********************************************************
 ** @desc  : BeanPostProcessor示例
 **           Bean初始化处理器,包括前置处理器和后置处理器,在bean初始化前后定义处理逻辑,这时Bean已经创建
 ** @author  Pings
 ** @date    2020/7/27
 ** @version v1.0
 * *******************************************************
 */
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    //**初始化前置处理器,调用User的setName方法,修改User的name属性
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if(beanName.equals("user")) {
            System.out.println("初始化User前...");
            User entity = (User) bean;
            entity.setName("pings");
        }
        return bean;
    }

    //**初始化后置处理器
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if(beanName.equals("user")) System.out.println("初始化User后...");
        return bean;
    }
}

3.4.InstantiationAwareBeanPostProcessor接口

  • 实例化处理器,BeanPostProcessor初始化处理器的子接口,会在BeanPostProcessor之前调用。包括前置处理器和后置处理器,在bean实例化前后定义处理逻辑。前置处理时,已经注册,还未创建;后置处理时,已经创建;
代码语言:javascript
复制
/**
 *********************************************************
 ** @desc  : InstantiationAwareBeanPostProcessor示例
 **           实例化处理器,BeanPostProcessor初始化处理器的子接口,会在BeanPostProcessor之前调用
 **           包括前置处理器和后置处理器,在bean实例化前后定义处理逻辑
 **           前置处理时,已经注册,还未创建;后置处理时,已经创建
 ** @author  Pings
 ** @date    2020/7/28
 ** @version v1.0
 * *******************************************************
 */
@Component
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {

    /**
     * 实例化前置处理器,返回指定类的实例化对象,可在此处修改指定类在spring容器中的实例化对象
     * 返回值为null则创建指定类的默认实例
     * 返回值不为null则把返回值当做指定类的实例:
     *   1.跳过postProcessAfterInstantiation(实例化后置处理器)
     *   2.跳过postProcessBeforeInitialization(初始化前置处理器)
     *   3.执行postProcessAfterInitialization(初始化后置处理器)
     */
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        //**用Subject1的子类Subject2的实例替换Subject1的实例
        if(beanClass.equals(Subject1.class)) {
            System.out.println("实例化Subject1前...");
            return new Subject2();
        }

        return null;
    }

    //**实例化后置处理器
    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        return true;
    }

    /**
     * 修改对象属性值,这时属性值还未设置到对象中
     * 在postProcessAfterInstantiation()后调用,postProcessAfterInstantiation如果返回false,则会跳过此方法
     */
    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        return pvs;
    }
}

3.5.SmartInstantiationAwareBeanPostProcessor接口

  • 智能实例化处理器,InstantiationAwareBeanPostProcessor实例化处理器的子接口;
代码语言:javascript
复制
//**SmartInstantiationAwareBeanPostProcessor示例,InstantiationAwareBeanPostProcessor实例化处理器的子接口
public interface SmartInstantiationAwareBeanPostProcessor {

    //**预测bean类型
    default Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {
        return null;
    }

    //**选择合适的构造器
    default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException {
        return null;
    }

    //**获取提前暴露的bean引用,用来支持单例对象的循环引用
    default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

3.6.MergedBeanDefinitionPostProcessor接口

  • 合并Bean定义后置处理器,BeanPostProcessor初始化处理器的子接口;
代码语言:javascript
复制
//**合并BeanDefinition后置处理器,BeanPostProcessor初始化处理器的子接口
public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {

    //**bean实例化后调用,可修改merged BeanDefinition的属性或者缓存元数据
    void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);

    //**重置bean定义后的通知,此处应清除Bean的元数据
    default void resetBeanDefinition(String beanName) {
    }
}

3.7.DestructionAwareBeanPostProcessor接口

  • 对象销毁处理器,BeanPostProcessor初始化处理器的子接口;
代码语言:javascript
复制
public interface DestructionAwareBeanPostProcessor extends BeanPostProcessor {

    //**对象销毁处理
    void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;

    //**是否处理对象销毁
    default boolean requiresDestruction(Object bean) {
        return true;
    }
}

4.bean初始化/销毁

4.1.作用

  • 在某个bean初始化/销毁时添加自定义的处理逻辑;

4.2.方法

  • 接口:InitializingBean/DisposableBean接口定义初始化/销毁的方法;
  • 配置:init-method/destroy-method属性定义初始化/销毁的方法;
  • 注解:@PostConstruct/@PreDestroy定义初始化/销毁的方法;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/193526.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月15日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.spring bean生命周期
  • 2.Aware接口
    • 2.1.作用
      • 2.2.常用接口
      • 3.IOC扩展点
        • 3.1.BeanFactoryPostProcessor接口
          • 3.2.BeanDefinitionRegistryPostProcessor接口
            • 3.3.BeanPostProcessor接口
              • 3.4.InstantiationAwareBeanPostProcessor接口
                • 3.5.SmartInstantiationAwareBeanPostProcessor接口
                  • 3.6.MergedBeanDefinitionPostProcessor接口
                    • 3.7.DestructionAwareBeanPostProcessor接口
                    • 4.bean初始化/销毁
                      • 4.1.作用
                        • 4.2.方法
                        相关产品与服务
                        容器服务
                        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档