简单介绍一下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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 域名ssl证书怎么弄_nginx配置https证书

    域名ssl证书怎么弄_nginx配置https证书越来越多的第三方接入需要使用https了,很多时候不止到证书到那里免费申请,申请后怎么配置。免费证书和收费证书主要的差别有几点免费证书收费证书支持绑定域名数少支持绑定域名数多无保险费用有保险费用一年需要更换两年或三年可选颁发机构少更多的颁发机构证书免费申请的几个大平台阿里云腾讯云…

    2022年10月1日
  • 什么是内连接、外连接?MySQL支持哪些外连接?_oracle内连接和外连接的区别

    什么是内连接、外连接?MySQL支持哪些外连接?_oracle内连接和外连接的区别图片与最后一部分来自:https://blog.csdn.net/plg17/article/details/78758593已有如下表rollcall数据表course数据表内链接innerjoin语句:select表1查询的字段,表2查询的字段from表1innerjoin表2on条件;如:mysql>selecta.*,b.*from…

    2022年8月30日
  • 数据库连接池的好处有哪些_计算机系统坏了怎么修复

    数据库连接池的好处有哪些_计算机系统坏了怎么修复对于一个简单的数据库应用,由于对于数据库的访问不是很频繁。这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销。但是对于一个复杂的数据库应用,情况就完全不同了。频繁的建立、关闭连接,会极大的减低系统的性能,因为对于连接的使用成了系统性能的瓶颈。    连接复用。通过建立一个数据库连接池以及一套连接使用管理策略,使得一个数据库连接可以得

    2022年9月15日
  • MATLAB插值函数interp1

    MATLAB插值函数interp1插值法    插值法又称“内插法”,是利用函数f(x)在某区间中已知的若干点的函数值,作出适当的特定函数,在区间的其他点上用这特定函数的值作为函数f(x)的近似值,这种方法称为插值法。如果这特定函数是多项式,就称它为插值多项式。线性插值法    线性插值法是指使用连接两个已知量的直线来确定在这两个已知量之间的一个未知量的值的方法。    

    2022年6月13日
  • 钩子函数介绍(vue11个钩子函数)

    钩子(hook)又称钩子函数,是在一个有序的周期中的某些特殊时刻,系统内部预先设置好的函数,当系统周期到达指定时刻会自动执行该’钩子’。钩子函数的函数体内容由开发者编写,这绐了幵发者在不同阶段做某些处理的机会。钩子是很多开发语言,前后端都会涉及的概念,是一种形象的说法,源于Windows的消息处理机制。通过设置钩子,应用程序在消息过去前将其钩住,阻止其传递,然后优先处理开发者的自定义内容,俗称’下个钩子’。系统:初始化..钩子ready()运行..钩子beforeEnd(…

    2022年4月12日
  • Random函数用法

    Random函数用法一、random模块简介Python标准库中的random函数,可以生成随机浮点数、整数、字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等。二、random模块重要函数1)、random()返回0<=n<1之间的随机实数n;2)、choice(seq)从序列seq中返回随机的元素;importrandoma=rand…

    2022年4月28日

发表回复

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

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