关于生命周期属性,生命周期属性,啥意思呢,假设咱们的bean,生命周期属性指的是bean创建的时候,
如果希望有一些初始化的工作,你可以指定一个bean的方法,为他的初始化方法,那这样的话Spring每次创建完,
这个对象会先调用一下,这个init方法,来完成初始化工作,生命周期属性指的,咱们可以配置一个方法,作为
生命周期初始化方法,那Spring会在对象创建之后,立即调用,那生命周期属性,与初始化对应的还有一个,叫做
什么呢,销毁,也可以配置一个方法作为生命周期的销毁方法,那么配置销毁方法的话,那就是Spring容器在关闭前,
关闭是要销毁所有对象,关闭并销毁容器中所有对象之前调用,作为咱们的后处理工作,那咱们上面说的属性,叫做init-method,
前处理初始化,然后呢,第二个是destory-method
那这两个属性非常简单,配上一次就完事,那咱们给谁配呢,把scope属性先去掉,然后再来一个init-method,
这里来一个方法叫做init,然后再来一个方法destory-method,给他起名destory,当然起名字你知道要和谁对应啊,
方法名对应,所以我们要在User里添加两个方法,这个方法必须public void,方法名必须要和你配置的一样,init(),
咱们也就是打印一下,我是初始化方法,destory也没啥可说的,这里方法名要一样,destory(),销毁方法,接下来只要
测一下方法会不会调用,最基本的创建容器,获取对象,然后打印就完事了,最后打印一句话你会发现,咱们的初始化方法,
是不是调了,显然对象刚创建,
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!-- 创建方式1:空参构造方法 -->
<bean name="user" class="com.learn.bean.User" init-method="init" destroy-method="destory"></bean>
<!-- 创建方式2:静态工厂创建
调用UserFactory的createUser方法创建名为user2的对象,放入容器
-->
<!-- <bean name="user2" class="com.learn.b_create.UserFactory" factory-method="createUser"></bean> -->
<!-- 创建方式2:实例工厂创建
-->
<!-- <bean name="user3" factory-bean="userFactory" factory-method="createUser2"></bean> -->
<!-- <bean name="userFactory" class="com.learn.b_create.UserFactory"></bean> -->
</beans>
package com.learn.bean;
/**
* @author Leon.Sun
*/
public class User {
public User() {
System.out.println("User空参构造方法");
}
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public void init() {
System.out.println("我是初始化方法!");
}
public void destory() {
System.out.println("我是销毁方法!");
}
}
/**
* 测试咱们的生命周期方法
*
*/
@Test
public void fun5() {
/**
* 1.创建容器
*/
ApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");
/**
* 打印user对象
*/
// System.out.println(u);
}
User空参构造方法
我是初始化方法!
创建出来就立刻初始化了,但是有个问题,销毁的方法到哪去了,是这样,现在这代码没销毁太正常不过了,
打印之后没有任何代码,这个时候等不到做销毁的操作,这个虚拟机停了,因为主线程运行完了,你要想看到这个效果,
怎么做呢,你还得加一块代码,ac点close方法,这个close方法是我强行打印出来的,那是因为,close方法在ApplicationContext
接口里面没有,它是声明在我们的实现类当中的,所以我拿实现类来接收,有了容器的关闭之后,再来执行一下这个代码
/**
* 测试咱们的生命周期方法
*
*/
@Test
public void fun5() {
/**
* 1.创建容器
*/
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("com/learn/b_create/applicationContext.xml");
/**
* 打印user对象
*/
// System.out.println(u);
/**
* 关闭容器,触发销毁方法
*/
ac.close();
}
User空参构造方法
我是初始化方法!
我是销毁方法!
销毁方法是不是打印了,在打印完User之后打印销毁方法,这就是咱们的生命周期,这是这两个配置