Spring学习-- IOC 容器中 bean 的生命周期
本文内容纲要:Spring学习-- IOC 容器中 bean 的生命周期
Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务。
Spring IOC 容器对 bean 的生命周期进行管理的过程:
- 通过构造器或者工厂方法创建 bean 实例。
- 为 bean 的属性赋值和对其他 bean 的引用。
- 调用 bean 的初始化方法。
- bean 初始成功,可以使用。
- 容器关闭时 , 调用 bean 的销毁方法。
在 bean 的声明里设置 init-method 和 destroy-method 属性 , 为 bean 指定初始化和销毁方法。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
5
6 <bean id="initBean" class="com.itdjx.spring.beans.init.InitBean" init-method="init" destroy-method="destroy">
7 <property name="name" value="操蛋儿"/>
8 <property name="info" value="my name is ET"/>
9 </bean>
10
11 </beans>
1 package com.itdjx.spring.beans.init;
2
3 /**
4 * @author Wáng Chéng Dá
5 * @create 2017-03-02 16:07
6 */
7 public class InitBean {
8
9 private String name;
10
11 private String info;
12
13 public InitBean() {
14 System.out.println("I am InitBean's Constructor...");
15 }
16
17 public void init() {
18 System.out.println("I am InitBean's init method...");
19 }
20
21 public void destroy() {
22 System.out.println("I am InitBean's destroy method...");
23 }
24
25 public String getName() {
26 return name;
27 }
28
29 public void setName(String name) {
30 System.out.println("I am InitBean's setName method...");
31 this.name = name;
32 }
33
34 public String getInfo() {
35 return info;
36 }
37
38 public void setInfo(String info) {
39 System.out.println("I am InitBean's serInfo method...");
40 this.info = info;
41 }
42
43 @Override
44 public String toString() {
45 return "InitBean{" +
46 "name='" + name + '\'' +
47 ", info='" + info + '\'' +
48 '}';
49 }
50 }
1 package com.itdjx.spring.beans.init;
2
3 import org.springframework.context.support.ClassPathXmlApplicationContext;
4
5 /**
6 * @author Wáng Chéng Dá
7 * @create 2017-03-02 16:16
8 */
9 public class Main {
10
11 public static void main(String[] args) {
12
13 ClassPathXmlApplicationContext cxt = new ClassPathXmlApplicationContext("beans-init.xml");
14 InitBean initBean = (InitBean) cxt.getBean("initBean");
15 System.out.println(initBean);
16 cxt.close();
17
18 }
19 }
控制台输出:
I am InitBean's Constructor... |
bean 后置处理器:
bean 后置处理器允许在调用初始方法前后对 bean 进行额外的处理。
bean 后置处理器对 IOC 容器里的所有 bean 实例逐一处理 , 而非单一实例。
bean 后置处理器需要实现 BeanPostProcessor Interface , 在初始化方法被调用前后 , Spring 将把每个 bean 实例分别传送给上述接口的两个方法。
1
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
5
6
7
8
9
10
11
12
13
1 package com.itdjx.spring.beans.init;
2
3 import org.springframework.beans.BeansException;
4 import org.springframework.beans.factory.config.BeanPostProcessor;
5
6 /**
7 * 我的 bean 后置处理器
8 *
9 * @author Wáng Chéng Dá
10 * @create 2017-03-02 16:25
11 */
12 public class MyBeanPostProcessor implements BeanPostProcessor {
13
14 @Override
15 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
16 System.out.println("I am MyBeanPostProcessor's before method...bean: " + bean + " beanName: " + beanName);
17 return bean;
18 }
19
20 @Override
21 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
22 System.out.println("I am MyBeanPostProcessor's after method...bean: " + bean + " beanName: " + beanName);
23 return bean;
24 }
25 }
控制台输出:
I am InitBean's Constructor... |
bean:实例本身。
beanName:IOC 容器配置的 bean 的名字
返回值:是实际上返给用户的那个 bean 实例 , 注意:可以在上述两个方法中修改 bean 的属性 , 甚至返回一个新的 bean 实例。
添加 bean 后置处理器的 bean 的生命周期:
通过构造器或工厂方法创建 bean 实例。
为 bean 的属性赋值和对其他 bean 的引用。
将 bean 实例传递给 bean 后置处理器的 postProcessBeforeInitialization 方法。
调用 bean 的初始化方法。
将 bean 实例传递非 bean 后置处理器的 postProcessAfterInitialization 方法。
bean 初始化成功 , 可以使用。
容器关闭时 , 调用 bean 的销毁方法。
1 package com.itdjx.spring.beans.init;
2
3 import org.springframework.beans.BeansException;
4 import org.springframework.beans.factory.config.BeanPostProcessor;
5
6 /**
7 * 我的 bean 后置处理器
8 *
9 * @author Wáng Chéng Dá
10 * @create 2017-03-02 16:25
11 */
12 public class MyBeanPostProcessor implements BeanPostProcessor {
13
14 @Override
15 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
16 System.out.println("I am MyBeanPostProcessor's before method...bean: " + bean + " beanName: " + beanName);
17 InitBean initBean = new InitBean();
18 initBean.setName("狗剩儿");
19 initBean.setInfo("I am the revised infomation...");
20 return initBean;
21 }
22
23 @Override
24 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
25 System.out.println("I am MyBeanPostProcessor's after method...bean: " + bean + " beanName: " + beanName);
26 return bean;
27 }
28 }
控制台输出:
I am InitBean's Constructor... |
本文内容总结:Spring学习-- IOC 容器中 bean 的生命周期
原文链接:https://www.cnblogs.com/chinda/p/6491490.html
以上是 Spring学习-- IOC 容器中 bean 的生命周期 的全部内容, 来源链接: utcz.com/z/362476.html