bean 的生命周期
创建 -> 初始化 -> 使用 -> 销毁
我们可以自定义初始化和销毁方法,容器在bean进行到当前生命周期的时候会调用我们自定义的初始化和销毁方法;
多实例 bean 容器不会管理初始化和销毁方法,需要自己调用
自定义的初始化和销毁方法必须是无参方法
通过调用 bean 定义的方法实现初始化和销毁
package com.demon.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Demon-HY
* @date 2019-12-9
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private Integer age;
public void init() {
System.out.println("进入 User 对象初始化方法");
}
public void destroy() {
System.out.println("进入 User 对象销毁方法");
}
}
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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.demon" />
<bean id="user" class="com.demon.bean.User" init-method="init" destroy-method="destroy">
<property name="name" value="Demon-HY" />
<property name="age" value="18" />
</bean>
</beans>
Java 配置类中指定初始化方法和销毁方法
package com.demon.config;
import com.demon.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* 配置类
* @author Demon-HY
* @date 2019-12-9
*/
@ComponentScan(value = "com.demon")
@Configuration
public class Config {
@Bean(value = "user", initMethod = "init", destroyMethod = "destroy")
public User user() {
return new User("Demon-HY", 18);
}
}
编写测试类
/**
* @author Demon-HY
* @date 2019-12-9
*/
public class IOCTest {
@Test
public void test() throws Exception {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
System.out.println("容器创建成功.................");
// 关闭容器
context.close();
}
}
打印结果:
进入 User 对象初始化方法
容器创建成功.................
进入 User 对象销毁方法
通过bean实现 InitializingBean和DisposableBean接口完成初始化和销毁
package com.demon.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
/**
* @author Demon-HY
* @date 2019-12-9
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements InitializingBean, DisposableBean {
private String name;
private Integer age;
// public void init() {
// System.out.println("进入 User 对象初始化方法");
// }
//
// public void destroy() {
// System.out.println("进入 User 对象销毁方法");
// }
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("进入 User 对象初始化方法");
}
@Override
public void destroy() throws Exception {
System.out.println("进入 User 对象销毁方法");
}
}
修改配置类
/**
* 配置类
* @author Demon-HY
* @date 2019-12-9
*/
@ComponentScan(value = "com.demon")
@Configuration
public class Config {
@Bean(value = "user")
public User user() {
return new User("Demon-HY", 18);
}
}
执行上面的测试方法,发现打印是一样的
通过 @PostConstruct和@PreDestory 注解实现 bean 的初始化方法和销毁方法
@PostConstruct和@PreDestory 是 JSR250 规范定义的注解
修改 User.java
package com.demon.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
* @author Demon-HY
* @date 2019-12-9
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private Integer age;
@PostConstruct
public void init() {
System.out.println("进入 User 对象初始化方法");
}
@PreDestroy
public void destroy() {
System.out.println("进入 User 对象销毁方法");
}
}
执行上面的测试方法,发现打印是一样的
咖啡小馆
QQ群: 823971061 点击按钮入群