【小家Spring】Spring注解驱动开发---Spring Ioc容器中Bean的生命周期详解(BeanPostProcessor解析)(上)

简介: 【小家Spring】Spring注解驱动开发---Spring Ioc容器中Bean的生命周期详解(BeanPostProcessor解析)(上)

前言


bean的生命周期指的是bean创建—初始化到销毁的过程。


我们可以自定义初始化和销毁方法;容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法


单实例:在容器启动的时候创建对象

多实例:容器不会管理这个bean;容器不会调用销毁方法;

Bean生命周期初始化、销毁相关的4种方式


1、@Bean指定初始化方法和销毁方法 initMethod destroyMethod


initMethod 指定Bean创建后调用的初始化方法

destroyMethod 指定Bean在销毁后会调用的方法


栗子:略


2、实现InitializingBean和DisposableBean接口


将要创建指定初始化和销毁方法的类实现初始化接口InitializingBean,如果需要指定销毁方法实现DisposableBean接口

public class InitAndDisposableBean implements InitializingBean, DisposableBean {
    public InitAndDisposableBean() {
        System.out.println("InitAndDisposableBean创建完成。。。。。。。。。。。。");
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("InitAndDisposableBean容器销毁,实现DisposableBean接口调用销毁方法...........");
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitAndDisposableBean创建后实现InitializingBean调用初始化方法。。。。。。。。。。。。");
    }
}


3、使用JSR250规范:@PostContruct、@PreDestroy


在需要指定初始化和销毁方法的Bean里创建对应的初始化和销毁方法,使用对应注解标注即可。


使用@PostConstruct指定Bean的初始化方法

使用@PreDestroy指定Bean销毁方法


@Component
public class Student {
    @PostConstruct
    public void init(){
        System.out.println("Student postConstruct...");
    }
    @PreDestroy
    public void destroy(){
        System.out.println("Student preDestroy...");
    }
}


很多人迷糊@PostConstruct会在构造函数之前执行还是之后执行呢?其实从单词中也能见名知意(此处以servlet为例):

被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行

被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前


栗子:略


4、BeanPostProcessor接口

public interface BeanPostProcessor {
    //在任何初始化方法(例如上面的三种方式,定义的init方法,@PostConstruct,接口InitializingBean的方法)调用之前工作
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    //这个是在上面的初始化方法调用之后工作
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}


Bean的后置处理器,在bean初始化前后处理一些工作,就是在上面三种初始化(init,@PostConstruct,InitializingBean接口)调用的前后做一些工作的处理.。通过这个方法可以对bean进行一些包装和处理。


BeanPostProcessor在Spring中有大量的应用。它提供了功能相当于我们可以在Bean放进Ioc容器前后做些事情,比如包装、生成代理对象等一般都是通过此接口实现的。当把Bean放进去时,Spring会调用配置执行的所有的BeanPostProcessor。


比如解析@Async、@Autowired的AutowiredAnnotationBeanPostProcessor后置处理器


postProcessBeforeInitialization()在每个bean创建之后的初始化方法之前调用,

postProcessAfterInitialization在每个bean的初始化方法执行之后被调用,该方法通常用户修改预定义的bean的属性值,可以实现该接口进行覆盖。(该方法特别的重要,可以做一些全局统一处理的操作)


关于BeanPostProcessor的使用,后续必须还有专门的文章进行分析,此处制作简单的一个生命周期相关的讨论。

@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
    /**
     * 在每个bean创建之后的初始化方法之前调用
     * @param bean 当前实例化的bean
     * @param beanName bean的名称
     * @return 返回实例化的bean或者可以对对象进行再封装返回
     * @throws BeansException
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor的postProcessBeforeInitialization方法执行,当前bean【" + bean + "】");
        return bean;
    }
    /**
     * 在每个bean的初始化方法执行之后被调用
     * @param bean 当前实例化的bean
     * @param beanName bean的名称
     * @return 返回实例化的bean或者可以对对象进行再封装返回
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor的postProcessAfterInitialization方法执行,当前bean【" + bean + "】");
        return bean;
    }
}


需要注意的是:实现这个接口的类,需要放入IOC容器中才会生效


BeanPostProcessor总结


BeanPostProcessor它是Spring对开闭原则很好的实践。上面我们已经体会到了它的用处,它就像一个钩子,让我们可以参与到Spring Bean的生命周期的重要部分。下面简单来个总结:

image.png

从上图中我们可以看到一共有5个接口共10个回调方法,即十个扩展点


相关文章
|
3月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
3月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
491 2
|
11月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
815 26
|
8月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
11月前
|
XML Java 数据格式
Spring容器的本质
本文主要讨论Spring容器最核心的机制,用最少的代码讲清楚Spring容器的本质。
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
371 12
|
10月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1000 29
|
10月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
429 4
|
10月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~