返回顶部
首页 > 资讯 > 精选 >Bean自定义初始化和销毁方法是什么
  • 346
分享到

Bean自定义初始化和销毁方法是什么

2023-06-29 01:06:00 346人浏览 安东尼
摘要

今天小编给大家分享一下Bean自定义初始化和销毁方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Bean三种自定义初

今天小编给大家分享一下Bean自定义初始化和销毁方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

Bean三种自定义初始化和销毁

一. 三种方法概述

在配置类中指定 @Bean(initMethod = “init”,destroyMethod = “destory”)注解

实现InitializingBean接口并重写其afterPropertiesSet方法,实现DisposableBean接口并重写destroy方法

利用java的jsR250规范中的@PostConstruct标注在init方法上,@PreDestroy标注在destroy方法上

二. 方法详述

1. 方法1:配置类中指定

示例代码

public class CarA {    public CarA() {        System.out.println("CarA。。。构造函数");    }    public void initCarA(){        System.out.println("CarA的init()方法");    }    public void destroyCarA(){        System.out.println("CarA的destroy()方法");    }}@Configurationpublic class ConfigTest {    @Bean(initMethod = "initCarA",destroyMethod = "destroyCarA")    public CarA carA(){        return new CarA();    }}

执行结果

CarA。。。构造函数
CarA的init()方法

服务启动

CarA的destroy()方法

2. 方法2:实现接口并重写方法

1 示例代码

public class CarB implements InitializingBean, DisposableBean {    public CarB() {        System.out.println("CarB。。。构造函数");    }    @Override    public void afterPropertiesSet() throws Exception {        System.out.println("CarB。。。afterPropertiesSet()方法执行");    }    @Override    public void destroy() throws Exception {        System.out.println("CarB。。。destroy()方法执行");    }}@Configurationpublic class ConfigTest {    @Bean    public CarB carB(){        return new CarB();    }}

执行结果

CarB。。。构造函数
CarB。。。afterPropertiesSet()方法执行

服务启动

CarB。。。destroy()方法执行

2 概述

spring 开放了扩展接口,允许我们自定义 bean 的初始化和销毁方法。即当 Spring 容器在 bean 进行到相应的生命周期阶段时,会自动调用我们自定义的初始化和销毁方法。这两个扩展接口是 InitializingBean 和 DisposableBean 。

InitializingBean 接口说明:该接口为 bean 提供了 bean 属性初始化后的处理方法,它只有 afterPropertiesSet 一个方法,凡是实现此接口的类,在 bean 的属性初始化后都会执行该方法。
package org.springframework.beans.factory;

public interface InitializingBean {    void afterPropertiesSet() throws Exception;}

DisposableBean 接口说明:该接口为单例 bean 提供了在容器销毁 bean 时的处理方法,它只有 destroy 一个方法,凡是实现此接口的类,在 bean 被销毁时都会执行该方法。

package org.springframework.beans.factory;public interface DisposableBean {    void destroy() throws Exception;}

3 方法1 && 方法2

  • 相同点:都是在 bean 属性初始化之后需要执行的初始化方法。

  • 不同点

方法1:代码不与Spring耦合;执行效率较低(通过反射来执行initMethod 方法)

方法2:代码与Spring紧耦合;速度更快(将 bean 强制转换成 InitializingBean 接口类型,然后直接调用 afterPropertiesSet 方法)

  • 说明:afterPropertiesSet 和 initMethod 可以同时存在,但是 afterPropertiesSet 方法是在 initMethod 方法之前执行的。

  • 一个 bean 从创建到初始化的过程总结

通过构造器创建 bean

属性注入

执行 afterPropertiesSet 方法

执行 initMethod 方法

3. 方法3:利用java的JSR250规范

代码示例

public class CarC {    public CarC() {        System.out.println("CarC。。。构造函数");    }    @PostConstruct    public void initCarC(){        System.out.println("CarC。。。初始化方法initCarC()");    }    @PreDestroy    public void destroyCarC(){        System.out.println("CarC。。。销毁方法destroyCarC");    }}@Configurationpublic class ConfigTest {    @Bean    public CarC carC(){        return new CarC();    }}

执行结果

CarC。。。构造函数
CarC。。。初始化方法initCarC()

服务启动

CarC。。。销毁方法destroyCarC

spring初始化后获取自定义注解Bean

目的是通过注解将特定类的信息(如接口编号)与类关联,之后可通过接口编号获取对应bean来执行对应逻辑。

一.新建注解类

@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Servicepublic @interface ServiceCode {    String code() default "";     String className() default "";}

包含接口编号和beanName信息。

二.新建接口类

@ServiceCode(code = "100010", className = "echoService")@Service("echoService")public class EchoService { }

三.实现接口ApplicationListener

来监听spring容器初始化完成后执行:

@Component@Order(1)public class ServiceInitListener implements ApplicationListener<ContextRefreshedEvent> {    private static final Logger LOGGER = LoggerFactory.getLogger(ServiceInitListener.class);     @Override    public void onApplicationEvent(ContextRefreshedEvent event) {        ApplicationContext applicationContext = event.getApplicationContext();        //注意 需要时根容器才能通过注解获取到bean,比如event直接获取的容器中只有一些公共注册bean        if (applicationContext.getParent() != null) {            applicationContext = applicationContext.getParent();        }        Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(ServiceCode.class);        for (Object bean : beansWithAnnotation.values()) {            ServiceCode annotation = bean.getClass().getAnnotation(ServiceCode.class);            String code = annotation.code();            String className = annotation.className();            //注册接口编号和beanName            //在统一入口可通过code获取beanName,然后通过sprinGContext获取对应bean执行自定义逻辑            //或者完成其他逻辑        }    } }

注意:

 ContextRefreshedEvent获取到的上下文环境不是根spring容器,其中只有部分spring内置bean,无法通过注解获取到自定义bean,需要获取其父容器来完成操作。我第一次获取是beanList总为空,后来发现其容器内部bean没有自定义的service bean,获取父容器后操作一切正常。

通过@Order注解来定制执行顺序,越小越优先执行。

以上就是“Bean自定义初始化和销毁方法是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Bean自定义初始化和销毁方法是什么

本文链接: https://lsjlt.com/news/321705.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Bean自定义初始化和销毁方法是什么
    今天小编给大家分享一下Bean自定义初始化和销毁方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Bean三种自定义初...
    99+
    2023-06-29
  • 总结Bean的三种自定义初始化和销毁方法
    目录Bean三种自定义初始化和销毁一. 三种方法概述二. 方法详述spring初始化后获取自定义注解Bean一.新建注解类二.新建接口类三.实现接口ApplicationListen...
    99+
    2024-04-02
  • Spring中Bean初始化和销毁的方法是什么
    今天小编给大家分享一下Spring中Bean初始化和销毁的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Sprin...
    99+
    2023-07-06
  • Spring中Bean初始化和销毁的方式总结
    目录一、Bean的多种初始化方式1.PostConstruct注解2.实现InitializingBean接口3.声明init-method方法二、Bean的多种销毁方式1.PreD...
    99+
    2023-05-16
    Spring Bean初始化 Spring Bean销毁 Spring Bean
  • Spring注解驱动之关于@Bean注解指定初始化和销毁的方法
    目录bean的生命周期如何定义初始化、销毁方法初始化、销毁方法的使用场景初始化、销毁方法在Spring中的调用时机多实例bean初始化、销毁bean的生命周期 通常意义上讲的bean...
    99+
    2024-04-02
  • 一文详解spring注解配置bean的初始化方法和销毁方法
    目录1、配置bean的初始化方法1.1、使用@Bean注解的initMethod属性1.2、使用@PostConstruct注解1.3、实现InitializingBean接口1.4...
    99+
    2023-05-18
    spring注解配置bean spring注解配置bean初始化方法 spring注解配置bean销毁方法 spring注解
  • SpringBoot中的Bean初始化方法是什么
    本篇内容介绍了“SpringBoot中的Bean初始化方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!注解说明使用注解: @Post...
    99+
    2023-06-21
  • spring中bean的初始化方法是什么
    在Spring中,bean的初始化可以通过两种方式来完成:使用@Bean注解的initMethod属性或者实现Initializin...
    99+
    2023-09-21
    spring
  • Spring初始化与销毁的执行顺序是什么
    这篇文章主要介绍了Spring初始化与销毁的执行顺序是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring初始化与销毁的执行顺序是什么文章都会有所收获,下面我们一起来看看吧。演示 - 初始化销毁顺序@...
    99+
    2023-07-05
  • 如何实现bean初始化摧毁方法的注入
    目录实现 bean 初始化、摧毁方法的配置与处理通过xml配置定义初始化、摧毁方法通过实现接口initMethod 方法的注入与执行destroyMethod 方法的注入与执行测试实...
    99+
    2023-05-18
    bean初始化摧毁方法注入 bean 方法注入
  • spring初始化bean的过程是什么
    Spring初始化Bean的过程如下: 定义Bean:通过在配置文件或者注解中定义Bean的信息,包括Bean的名称、类别、属性...
    99+
    2024-02-29
    spring
  • 实践讲解SpringBoot自定义初始化Bean+HashMap优化策略模式
    策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 传统的策略模式一般是创建公共接口、定义公共方法——》然后创建实体类实现公共接口...
    99+
    2024-04-02
  • pycharm初始化的方法是什么
    PyCharm的初始化方法是通过安装并打开PyCharm,在首次打开时,会出现一个“Welcome to PyCharm”界面,用户...
    99+
    2023-09-13
    pycharm
  • linux初始化的方法是什么
    Linux的初始化方法可以通过执行以下步骤来完成:1. 启动计算机并进入BIOS设置,在启动选项中选择从可引导介质(如硬盘或USB驱...
    99+
    2023-08-30
    linux
  • vue初始化data方法是什么
    今天小编给大家分享一下vue初始化data方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。vue初始化data方法有...
    99+
    2023-07-04
  • Spring的Bean初始化过程和生命周期是什么
    本篇内容介绍了“Spring的Bean初始化过程和生命周期是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Spring创建bean的...
    99+
    2023-07-05
  • C#中怎么定义和初始化数组
    这篇文章给大家介绍C#中怎么定义和初始化数组,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一维数组 一维数组以线性方式存储固定数目的项,只需一个索引值即可标识任意一个项。在 C# 中,数组声明中的方括号必须跟在数据类型...
    99+
    2023-06-17
  • spring加载过程和初始化方法是什么
    Spring加载过程分为以下几个阶段: 资源定位:Spring框架会根据配置文件或注解扫描的方式,定位到配置文件或类文件的位置。 ...
    99+
    2023-10-26
    spring
  • Spring Bean的定义概念和使用方法是什么
    本篇内容介绍了“Spring Bean的定义概念和使用方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!定义Spring b...
    99+
    2023-07-06
  • golang数组初始化的方法是什么
    在Go语言中,可以使用以下方法初始化数组:1. 使用var关键字声明数组,并在声明时指定数组的长度,数组的元素会被自动初始化为对应类...
    99+
    2023-09-27
    golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作