- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
在这篇文章中,我们将讨论如何使用@Bean注解的initMethod
和destroyMethod
属性来在Bean初始化后或容器销毁Bean前执行某些操作。请看Spring @PostConstruct和@PreDestroy示例
正如我们在XML Bean配置中使用init-method和destroy-method属性一样,我们可以在基于Java的@Bean配置中使用initMethod
和destroyMethod
。
<bean id="customerService" class="net.javaguides.spring.DatabaseInitiaizer"
init-method="init" destroy-method="destroy">
</bean>
在本文中,我们使用最新发布的Spring 5.1.0.RELEASE版本来演示这个例子。
在实时项目中,我们会在应用程序启动时用一些记录填充一个数据库表,并在应用程序关闭时从同一数据库表中删除记录。
在这个例子中,我们将使用init()
方法在应用程序启动时向内存中的List数据结构填充一些用户对象。在应用程序关闭期间,我们还将使用destroy()
方法从Listd中删除用户对象。
使用你喜欢的IDE创建一个简单的Maven项目,关于打包结构请参考下面的章节。如果你是maven新手,请阅读本文《如何创建一个简单的Maven项目》。
下图显示了项目结构,供您参考。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.javaguides.spring</groupId>
<artifactId>spring-bean-lifecycle</artifactId>
<version>0.0.1-SNAPSHOT</version>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.0.RELEASE</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
考虑DatabaseInitiaizer
类,它有init()
和destroy()
方法来管理回调。
package net.javaguides.spring;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.springframework.stereotype.Component;
@Component
public class DatabaseInitiaizer {
private List < User > listOfUsers = new ArrayList < > ();
public void init() {
User user = new User(1, "User");
User user1 = new User(2, "Admin");
User user2 = new User(3, "SuperAdmin");
listOfUsers.add(user);
listOfUsers.add(user1);
listOfUsers.add(user2);
System.out.println("-----------List of users added in init() method ------------");
for (Iterator < User > iterator = listOfUsers.iterator(); iterator.hasNext();) {
User user3 = (User) iterator.next();
System.out.println(user3.toString());
}
// save to database
}
public void destroy() {
// Delete from database
listOfUsers.clear();
System.out.println("-----------After of users removed from List in destroy() method ------------");
for (Iterator < User > iterator = listOfUsers.iterator(); iterator.hasNext();) {
User user3 = (User) iterator.next();
System.out.println(user3.toString());
}
System.out.println("End of destroy() method");
}
}
package net.javaguides.spring;
public class User {
private Integer id;
private String name;
public User() {}
public User(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}
创建AppConfig类并在其中写下以下代码。
package net.javaguides.spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean(initMethod = "init", destroyMethod = "destroy")
public DatabaseInitiaizer databaseInitiaizer() {
return new DatabaseInitiaizer();
}
}
让我们创建一个主类并运行一个应用程序。
package net.javaguides.spring;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Application {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
context.close();
}
}
-----------List of users added in init() method ------------
User [id=1, name=User]
User [id=2, name=Admin]
User [id=3, name=SuperAdmin]
-----------After of users removed from List in destroy() method ------------
End of destroy() method
这个例子的源代码可以在我的GitHub仓库中找到https://github.com/RameshMF/spring-core-tutorial
我不确定如何理解 documentation用于 Bean 类型的 destroyMethod 方法。 它说: As a convenience to the user, the container
我是一名优秀的程序员,十分优秀!