在java的实际开发过程中,我们可能常常需要使用到init method和destroy method,比如初始化一个对象(bean)后立即初始化(加载)一些数据,在销毁一个对象之前进行垃圾回收等。

要用这两个方法,自然先要知道这两个方法究竟是干嘛用的。而从字面意思就很容易理解,一个是加载,一个是销毁。

下边就正式代码演示几种创建方式:

一、@Bean注解方式

public class Person {private String name;private Integer age;// 无参构造器public Person() {System.out.println("Person NoConstructor");}// 充当init methodpublic void init() {System.out.println("Person init-method");}// 充当destroy methodpublic void destroy() {System.out.println("Person destroy-method");}
}

这里很显然只是一个普通的java类,拥有一个无参构造和另外两个方法。

需要注意的是,这里的init和destroy两个方法名实际上是可以随意取得,不叫这个也没有问题,只不过算是一种约定俗称,一般都是这样叫。

另外我们也知道,这个构造方法也是可以不要的,因为会隐式的自动创建,但是为了更清楚的看到init和destroy是什么时候执行,我们就显示的写出来。

创建好了这个类,我们就可以使用@Bean注解的方式指定两个方法,以让他们生效。

@Configuration
@ComponentScan(value = "com.best")
public class AppConfig {@Bean(initMethod = "init", destroyMethod = "destroy")public Person getPerson() {return new Person();}
}

这里边的@Configuration注解是告诉spring这个类是一个配置类,相当于我们的xml文件

@ComponentScan则是指定需要spring来扫描的包,相当于xml中的context:component-scan属性

@Bean后边的initMethod和destroyMethod就是在声明这是一个bean的同时指定了init和destroy方法,方法名从功能实现上来说可以随意。

到这里我们就已经用第一种方式写好了,为了验证成功与否,再写一个main方法验证一下:

public class Test {public static void main(String[] args) {/*** 1.把类扫描出来--扫描以后干了什么事情* 2.把bean实例化*/AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);Person person = applicationContext.getBean(Person.class);System.out.println(person.getClass().getName());applicationContext.close();}
}

运行之后结果:

根据打印顺序可以看到,首先是构造函数,也就是创建了bean,紧接着执行了init,然后再context.close要销毁bean之前又执行了destroy。

二、Xml配置方式

这种方式实际上是和第一种对应的,只不过细节上略有改变而已,首先,创建的java类完全一样:

public class Person {private String name;private Integer age;// 无参构造器public Person() {System.out.println("xmlPerson NoConstructor");}// 充当init methodpublic void init() {System.out.println("xmlPerson init-method");}// 充当destroy methodpublic void destroy() {System.out.println("xmlPerson destroy-method");}
}

不同的地方就在于,第一个例子中是使用注解告诉spring这个类相当于一个配置文件,而这里则是实实在在的配置文件spring.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置Person对象创建--><bean id="xmlPerson" class="com.best.entity.Person" init-method="init" destroy-method="destroy"></bean>
</beans>

这个配置大概也能算是spring.xml中最简单的一个配置了吧,除开必要的文件头,就只有一个bean,而且bean里边也只有id,calss和init以及destroy方法。

因为简单,所以一目了然,id只是为了其他地方引用,class是指定这个bean对应的类,而后边两个属性则和用@Bean声明时一模一样。

因为这里声明bean和指定两个方法是用的xml配置,因此在测试的时候也就需要稍微有一点点改变:

public class TestXml {public static void main(String[] args) {// 用配置文件启动一个ApplicationContextClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("test1.xml");// 从context中取出我们的Bean,而不是用new User()这种方式Person person = (Person) applicationContext.getBean("xmlPerson");System.out.println(person.getClass().getName());applicationContext.close();}
}

区别在于这里直接加载了配置文件,而不是java类,使用的是ClassPathxXmlApplicationContext而不是AnnotationConfigApplicationContext。

结果如下:

三、JSR-250注解的方式(需要导入jsr250-api的jar包)

首先依然是创建一个拥有构造方法在内的三个方法的java类:

public class Person {private String name;private Integer age;// 无参构造器public Person() {System.out.println("Person NoConstructor");}// 充当init method// 初始化方法的注解方式 等同于init-method@PostConstructpublic void init() {System.out.println("Person init-method");}// 充当destroy method// 销毁方法的注解方式 等同于destroy-method@PreDestroypublic void destroy() {System.out.println("Person destroy-method");}
}

很显然,这里和上一个类不同的是,在init和destroy方法上加入了两个注解,@PostConstruct和上边@Bean后的initMethod相同,而@PreDestroy则是和destroyMethod做用相同。

既然这里有了区别,已经指定了init method和destroy method,那么后边声明bean的时候自然也会有不同,也就不需要再指定一遍:

@Configuration
@ComponentScan(value = "com.best")
public class AppConfig {@Beanpublic Person getPerson() {return new Person();}
}

所以,如上代码中只需要简单的声明这是一个bean就可以了,类上边的两个注解和上一个例子中的意思相同。

再测试一下:

public class Test {public static void main(String[] args) {/*** 1.把类扫描出来--扫描以后干了什么事情* 2.把bean实例化*/AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);Person person = applicationContext.getBean(Person.class);System.out.println(person.getClass().getName());applicationContext.close();}
}

四、 InitializingBean和DisposableBean

Spring bean 通过实现 InitializingBean ,DisposableBean 接口实现初始化方法和销毁前操作

@Component
public class Student implements InitializingBean, DisposableBean {@Overridepublic void destroy() throws Exception {System.out.println("DisposableBean destroy");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("InitializingBean afterPropertiesSet");}
}
@Configuration
@ComponentScan(value = "com.best")
public class AppConfig {}
public class Test {public static void main(String[] args) {/*** 1.把类扫描出来--扫描以后干了什么事情* 2.把bean实例化*/AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);Student student = applicationContext.getBean(Student.class);System.out.println(student.getClass().getName());applicationContext.close();}
}

运行结果:

参考博客、参考博客

Spring中init-method和destroy-method的四种方式相关推荐

  1. spring学习笔记(一)创建对象的四种方式

    spring学习笔记(一)创建对象的四种方式 一.简介 ​ Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架. ​ 所谓IoC就是Iversion of Control,控制反 ...

  2. java中四种注入注解,Spring中依赖注入的四种方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...

  3. java 给对象创建实例_Java中创建(实例化)对象的五种方式

    Java中创建(实例化)对象的五种方式1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反 ...

  4. C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能...

    本文通过ANTS Memory Profiler工具探索c#中+.string.Concat.string.Format.StringBuilder.Append四种方式进行字符串拼接时的性能. 本文 ...

  5. Action中取得request,session的四种方式

    Action中取得request,session的四种方式 在Struts2中,从Action中取得request,session的对象进行应用是开发中的必需步骤,那么如何从Action中取得这些对象 ...

  6. php 数组存入mysql_PHP将数组存入数据库中的四种方式

    1.implode()和explode()方式 2.print_r()和自定义函数方式 3.serialize()和unserialize()方式 4.json_encode()和json_decod ...

  7. PHP将数组存入数据库中的四种方式

    最近突然遇到了一个问题,如何用PHP将数组存入到数据库中,经过自己的多方查找和研究,总结了以下四种方法: 1.implode()和explode()方式 2.print_r()和自定义函数方式 3.s ...

  8. 在 C# 中生成代码的四种方式——包括.NET 5中的Source Generators

    Microsoft在最新的C#版本中引入了Source Generator.这是一项新功能,可以让我们在代码编译时生成源代码.在本文中,我将介绍四种C#中的代码生成方式,以简化我们的日常工作.然后,您 ...

  9. form表单、控制器中接收表单提交数据的4种方式

    Form表单 这篇文章主要讲的是form表单的提交 之前我们接触过的form表单元素是在Bootstrap框架里面,这次也将用到Bootstrap框架去布局(见图表1)通过Bootstrap框架布局呈 ...

  10. Java中创建(实例化)对象的五种方式

    Java中创建(实例化)对象的五种方式 1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23);  3.运 ...

最新文章

  1. nodejs mysql 异步_Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步
  2. Windows Server 2016 服务器总是有暴力破解密码导致的审核失败
  3. 基于Android Studio搭建hello world工程
  4. Minor GC,Major GC,Full GC -- hotspot VM GC讲解
  5. api有哪些 javasocket_socket及socket java api
  6. C++面试 语言基础
  7. 最大连续1的个数 三 窗口大小固定,逻辑连续但实际上并不连续的滑动窗口
  8. 2017.3.8 太空飞行计划问题 失败总结
  9. 杭电4786--Fibonacci Tree(生成树)
  10. Swift - 多线程实现方式(3) - Grand Central Dispatch(GCD)
  11. [Erlang脚印 0004] gen_server
  12. 如何摆脱工具类【转载】
  13. 基于python人脸光照不均匀数据的制作
  14. [luogu p1069] 细胞分裂
  15. PM online course from Youtube.com
  16. 巴比特 | 元宇宙每日必读:手握多个NFT IP,无聊猿“教父” Yuga Labs 如何建元宇宙?...
  17. Flash控件使用参考手册
  18. 数据可视化之excel和finebi报表实现对比
  19. MEMOS 服务及隐私协议
  20. 苹果保修期多久_二手苹果手机怎么验机?

热门文章

  1. aptio2018设置u盘启动_2018年U盘装系统bios设置U盘启动方法介绍
  2. cad计算机绘图入门,CAD制图初学入门: 基础操作 平面绘图练习100题, 新手必备
  3. [转]李商隐《嫦娥》赏析
  4. [深度学习概念]·主流声学模型对比
  5. google play以及google pay
  6. matlab模拟化学反应,Matlab环境下化学反应动力学的MonteCarlo模拟
  7. 【计算机网络】实验一 Protocol Layer
  8. 『杭电1206』劲乐团
  9. 从程序员到CTO的Java技术路线图
  10. 都说ADAS不好用,那智能后视镜和车载智能行业该如何走下去?