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...
I am InitBean's setName method...
I am InitBean's serInfo method...
I am InitBean's init method...
InitBean{name='操蛋儿', info='my name is ET'}
I am InitBean's destroy method...

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...
I am InitBean's setName method...
I am InitBean's serInfo method...
I am MyBeanPostProcessor's before method...bean: InitBean{name='操蛋儿', info='my name is ET'} beanName: initBean
I am InitBean's init method...
I am MyBeanPostProcessor's after method...bean: InitBean{name='操蛋儿', info='my name is ET'} beanName: initBean
InitBean{name='操蛋儿', info='my name is ET'}
I am InitBean's destroy method...

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...
I am InitBean's setName method...
I am InitBean's serInfo method...
I am MyBeanPostProcessor's before method...bean: InitBean{name='操蛋儿', info='my name is ET'} beanName: initBean
I am InitBean's Constructor...
I am InitBean's setName method...
I am InitBean's serInfo method...
I am InitBean's init method...
I am MyBeanPostProcessor's after method...bean: InitBean{name='狗剩儿', info='I am the revised infomation...'} beanName: initBean
InitBean{name='狗剩儿', info='I am the revised infomation...'}
I am InitBean's destroy method...

本文内容总结:Spring学习-- IOC 容器中 bean 的生命周期

原文链接:https://www.cnblogs.com/chinda/p/6491490.html

以上是 Spring学习-- IOC 容器中 bean 的生命周期 的全部内容, 来源链接: utcz.com/z/362476.html

回到顶部