例子
创建一个Person
,当初始化该类的时候,将其成员变量Hp
赋值:100;当销毁该类的对象时,将Hp
减:100。
Bean的生命周期
Spring管理的Bean有5个生命周期阶段
- 创建阶段
- 初始化阶段
- 运行期
- 销毁阶段
- 回收阶段
其中,初始化阶段和销毁阶段,我们需要着重关注,因为Spring给我们提供可以对着两个阶段的控制方法,下面了解一下如何在这两个生命周期阶段进行一些操作。
初始化工作
Person类
public class Person {
private String name = null;
private Integer Hp = 0;
public void addHp(){
this.Hp = 100;
}
public void reduceHp(){
this.Hp -= 100;
}
//setter and getter and toString
}
期望:在Bean初始化的时候执行的是addHp
;Bean被销毁的时候执行reduceHp
配置类
@Configuration
public class BeanLifeConfig {
}
XML的方式
第一步:在XML文件中注册Bean
<?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">
<bean id="person" class="juejin.beanLife.xml.bean.Person"></bean>
</beans>
第二步:在<bean>
标签中设置 初始化方法和销毁方法
<bean id="person" class="juejin.beanLife.xml.bean.Person" init-method="addHp" destroy-method="reduceHp"></bean>
其实很简单,在<bean>
标签中,含有两个属性
init-method
:指定初始化执行什么方法destroy-method
:指定bean销毁执行什么方法
第三步:配置类导入已有的XML配置
使用@ImportResource
注解,内容放在resources
目录中的.xml文件路径
@Configuration
@ImportResource("juejin/beanLife/BeanLife.xml")
public class BeanLifeConfig {
}
启动类,测试
被Spring管理的Bean会和容器一块加载,所以当容器加载时,初始化方法自动执行,这时候我们拿出对应的Bean看其Hp
public class XMLApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BeanLifeConfig.class);
// 被Spring管理的Bean会和容器一块加载,所以当容器加载时,初始化方法自动执行,这时候我们拿出对应的Bean看其Hp
Person bean = ctx.getBean(Person.class);
System.out.println(bean.getHp());
}
输出结果:100
销毁的测试,我们需要在Person
类的销毁方法中,做点手脚,看我的操作:
public void reduceHp(){
this.Hp -= 100;
System.out.println("Hp被灭啦");
}
这是因为,需要通过关闭容器去测试Bean的销毁动作,而容器都关闭了,就不可能通过容器GetBean了。现在我们关闭容器看结果
// 在启动类中最后加上这句话
ctx.close();
输出结果:Hp被灭啦
注解的方式
注解方式一:以@Bean的方式注入
注解简单粗暴,我就快速说啦!简单的步骤就略过啦
首先你需要:
- 在Bean上使用
@Component
注解。 - 在配置类中使用
@Bean
注入。 - 这是最核心的步骤,在
@bean
中使用其initMethod
和destroyMethod
属性指明初始化方法和销毁方法。
@Bean(initMethod = "addHp",destroyMethod = "reduceHp")
public Person person(){
return new Person();
}
测试类和XML的代码一样啦。
注解方式二:在Bean上使用@PostConstruct注解 和 @PreDestroy注解
@Component
public class Person {
private String name = null;
private Integer Hp = 0;
@PostConstruct
public void addHp(){
this.Hp = 100;
}
@PreDestroy
public void reduceHp(){
this.Hp -= 100;
System.out.println("Hp被灭啦");
}
//getter setter and toString
其他的,配置类使用扫描包的方式即可,启动类和之前一样。