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

简单介绍一下spring bean的生命周期_java类的生命周期1.springbean生命周期2.Aware接口2.1.作用一个标记,标记在spring容器初始化时需要获取上下文中当前的一些运行环境;2.2.常用接口ApplicationContextAware:获取ApplicationContextspring上下文;ApplicationEventPublisherAware:获取ApplicationEventPublisher事件发布器;BeanClassLoaderAware:获取当前的ClassLoader类加载器;BeanFac

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1.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的属性;
/**
 *********************************************************
 ** @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;
/**
 *********************************************************
 ** @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已经创建;
/**
 *********************************************************
 ** @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实例化前后定义处理逻辑。前置处理时,已经注册,还未创建;后置处理时,已经创建;
/**
 *********************************************************
 ** @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实例化处理器的子接口;
//**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初始化处理器的子接口;
//**合并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初始化处理器的子接口;
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.net/193526.html原文链接:https://javaforall.net

(0)
上一篇 2025年11月23日 下午7:22
下一篇 2025年11月23日 下午8:01


相关推荐

  • 瞄准AI落地实操,中关村北纬龙虾大赛发掘OpenClaw“实干虾”

    瞄准AI落地实操,中关村北纬龙虾大赛发掘OpenClaw“实干虾”

    2026年3月16日
    2
  • Brocade博科光纤交换机zone配置

    Brocade博科光纤交换机zone配置1、规划交换机端口用途DS6520B-A94存储模块1-195存储模块2-168DB1网卡1-169DB2网卡1-1DS6520B-B94存储模块1-295存储模块2-268DB1网卡1-269DB2网卡1-2…

    2022年5月21日
    45
  • Cadence License激活成功教程失败解决办法

    Cadence License激活成功教程失败解决办法问题1:UnabletorestartCadenceLicenseServerwiththenewlicensefile这个问题是在运行时可能遇到的。Cadence激活成功教程license,指定license文件时,提升下列的报错:UnabletorestartCadenceLicenseServer

    2022年7月26日
    14
  • 压缩 javascript文件js文件

    压缩 javascript文件js文件1 压缩单个 js 文件 npminstallug js g 安装 1 gt 压缩单个 js 文件打开 cmd 目录引到当前文件夹 cduglifyjsin js oinet min js 或者 uglifyjsinet js m oinet min js m 更小 m 参数所以就是把变量名变成 a b c d

    2026年3月19日
    2
  • select 函数详解

    select 函数详解Unix 系统下解释 函数原型 intselect intmaxfdp fd set readfds fd set writefds fd set errorfds structtimeva timeout select 函数的主要用途是什么 select 函数是一个监控函数 用来监控插口的状态 插口就是指的是文件描述符 Unix Linux 一切皆文件 select 函数能够监控插口状态 如下表 具体解释 select 的参数 先解释第五个参数 最后一个参数 st

    2026年3月17日
    3
  • w7设置双显示器_4K+144Hz 支持FreeSync Acer XV273K显示器评测

    w7设置双显示器_4K+144Hz 支持FreeSync Acer XV273K显示器评测2018年末,AMD宣布旗下FreeSync技术正式升级为RadeonFreeSync2HDR技术,带来了亮度、对比度、层次感更加完美的游戏画面,尤其是针对HDR游戏。而在随后的CES2019上,NVIDIA对G-Sync进行了重新分级,其中G-SyncCompatible标准正式开启FreeSync显示器兼容模式。两大“劲敌”的一系列动作意味着,未来FreeSync显示器或将成为更多游…

    2022年5月6日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号