1)Spring IOC容器可以管理bean的生命周期,Spring允许在bean生命周期内特定的时间点执行指定的任务。
2)Spring IOC容器对bean的生命周期进行管理的过程: ① 通过构造器或工厂方法创建bean实例 ② 为bean的属性设置值和对其他bean的引用 ③ 调用bean的初始化方法 ④ bean可以使用了 ⑤ 当容器关闭时,调用bean的销毁方法
3)在配置bean时,通过init-method和destroy-method 属性为bean指定初始化和销毁方法 这里写一个Person类用于测试:
public class Person { private Integer id; private String sex; private String name; public Person() { System.out.println("1.创建对象"); } public Integer getId() { return id; } public void setId(Integer id) { System.out.println("2.依赖注入"); this.id = id; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void init(){ System.out.println("3.初始化"); } @Override public String toString() { return "4.使用-----Person{" + "id=" + id + ", sex='" + sex + '\'' + ", name='" + name + '\'' + '}'; } public void destory(){ System.out.println("5.销毁"); } }配置一下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"> <bean id="person" class="com.atguigu.spring.day02_Spring.life.Person" > <property name="id" value="1001"/> <property name="sex" value="男"/> </bean> </beans>再写个类进行测试
public class Test { public static void main(String[] args) { ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("life.xml"); Person p1 = ac.getBean("person", Person.class); System.out.println(p1); ac.close(); } }输出结果为: 这里只有1,2,4得到了使用,而初始化和销毁无法使用 需要在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"> <bean id="person" class="com.atguigu.spring.day02_Spring.life.Person" init-method="init" destroy-method="destory"> <property name="id" value="1001"/> <property name="sex" value="男"/> </bean> </beans>再次运行结果为:
4)bean的后置处理器 ① bean后置处理器允许在调用初始化方法前后对bean进行额外的处理 ② bean后置处理器对IOC容器里的所有bean实例逐一处理,而非单一实例。 其典型应用是:检查bean属性的正确性或根据特定的标准更改bean的属性。 ③ bean后置处理器需要实现接口: org.springframework.beans.factory.config.BeanPostProcessor。在初始化方法被调用前后,Spring将把每个bean实例分别传递给上述接口的以下两个方法: ●postProcessBeforeInitialization(Object, String) ●postProcessAfterInitialization(Object, String)
5)添加bean后置处理器后bean的生命周期 ①通过构造器或工厂方法创建bean实例 ②为bean的属性设置值和对其他bean的引用 ③将bean实例传递给bean后置处理器的postProcessBeforeInitialization()方法 ④调用bean的初始化方法 ⑤将bean实例传递给bean后置处理器的postProcessAfterInitialization()方法 ⑥bean可以使用了 ⑦当容器关闭时调用bean的销毁方法
这里写个AfterHandler实现BeanPostProcessor接口: 简单处理一下
public class AfterHandler implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { Person person = (Person)o; if (person.getSex().equals("男")){ person.setName("亚索"); }else { person.setName("瑞文"); } return person; } @Override public Object postProcessAfterInitialization(Object o, String s) throws BeansException { return o; } }再配置一下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"> <bean id="person" class="com.atguigu.spring.day02_Spring.life.Person" init-method="init" destroy-method="destory"> <property name="id" value="1001"/> <property name="sex" value="男"/> </bean> <bean class="com.atguigu.spring.day02_Spring.life.AfterHandler"></bean> </beans>输出结果为: 成功将name属性赋值