简单介绍一下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定义初始化/销毁的方法;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • ajaxpro 原理[通俗易懂]

    ajaxpro 原理[通俗易懂]应当承认我这人实在算不上弄潮儿,Ajax早已流行得一塌糊涂,我却始终没有来研究一下这个东东。上次做网站的时候,BOSS就跟我讲过,可以参考一下Ajax的技术,我嘴上答应,心里却不是十分的在乎。究其原因,一来是我这人比较固步自封,二来起初确实也没太相信Ajax真有BO

  • Http 405_android与服务器交互

    Http 405_android与服务器交互因为现在都用的spring配置的,很少用到servlet了,今天想写一个demo,结果报了一个405的错误…………………真的是打扰了…….405概念请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow头信息用以表示出当前资源能够接受的请求方法的列表。  鉴于PUT,DELETE方法会对服务器上的资源进行写操作,因而绝大部分的网页服…

    2022年10月31日
  • TTL门电路工作原理_TTL门电路和CMOS有什么特点

    TTL门电路工作原理_TTL门电路和CMOS有什么特点CMOS门电路、TTL门电路基础CMOS门电路简介MOS管简介合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入CMOS门电路简介CMOS门电路(ComplementaryMetal-Oxide-Semiconductor)是指利用P沟道

    2022年10月26日
  • php安装

    php安装

  • Jenkins(2)docker容器中安装python3「建议收藏」

    Jenkins(2)docker容器中安装python3「建议收藏」前言使用docker安装jenkins环境,jenkins构建的workspace目录默认是在容器里面构建的,如果我们想执行python3的代码,需进容器内部安装python3的环境。进jenki

  • 20亿以内哪个数的约数个数最多,个数是多少?

    20亿以内哪个数的约数个数最多,个数是多少?

发表回复

您的电子邮箱地址不会被公开。

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