Spring(八)—— bean的生命周期

一、bean的生命周期图

 

 

 

二、bean的生命周期图解释

instantiate bean:对象实例化(new一个对象)

populate properties:封装属性(把xml中数据封装到对象中去)

如果bean实现BeanNameAware,执行setBeanName

如果bean实现BeanFactoryAware,执行setBeanFactory,获取Spring容器

如果存在类实现BeanPostProcessor(后处理bean),执行postProcessAfterInitialization

如果bean实现InitializingBean,执行afterPropertiesSet

调用<bean init-method="init">指定初始化方法init

如果存在类实现BeanPostProcessor(处理Bean),执行postProcessAfterInitialization执行业务处理

如果bean实现DisposableBean执行destory。

调用<bean destory-method="customerDestory">指定销毁方法customerDestory

 

三、案例

1. User.java

 1 package com.gyf.model;
 2 
 3 
 4 import org.springframework.beans.BeansException;
 5 import org.springframework.beans.factory.BeanFactory;
 6 import org.springframework.beans.factory.BeanFactoryAware;
 7 import org.springframework.beans.factory.BeanNameAware;
 8 import org.springframework.beans.factory.DisposableBean;
 9 import org.springframework.beans.factory.InitializingBean;
10 
11 public class User implements BeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean{
12 
13     private String username;
14     private String password;
15 
16     public String getUsername() {
17         return username;
18     }
19 
20     public void setUsername(String username) {
21         System.out.println("2. 赋值属性username:" + username);
22         this.username = username;
23     }
24 
25     public String getPassword() {
26         return password;
27     }
28 
29     public void setPassword(String password) {
30         System.out.println("2. 赋值属性password:" + password);
31         this.password = password;
32     }
33 
34     public User() {
35         System.out.println("1. 实例化。。。");
36     }
37 
38     @Override
39     public String toString() {
40         return "User{" +
41                 "username='" + username + '\'' +
42                 ", password='" + password + '\'' +
43                 '}';
44     }
45 
46     @Override
47     public void setBeanName(String s) {
48         System.out.println("3. 设置bean的名字(为配置文件中bean的id)" + s);
49     }
50 
51     @Override
52     public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
53         //bean工厂就是容器,意思是把我们的user对象放进工厂(容器)中去
54         System.out.println("4. Bean工厂" + beanFactory);
55     }
56 
57     @Override
58     public void afterPropertiesSet() throws Exception {
59         System.out.println("6. 属性赋值完成。");
60     }
61 
62     public void myInit(){
63         System.out.println("7. 自定义的初始化方法。");
64     }
65 
66     @Override
67     public void destroy() throws Exception {
68         //资源释放
69         System.out.println("9. Bean对象被销毁(不用的时候从容器中移除)。");
70     }
71 
72     public void myDestory(){
73         //资源释放
74         System.out.println("10. 自定义的销毁方法。");
75     }
76 }
View Code

 

2. MyBeanPostProcessor.java

 1 package com.gyf.model;
 2 
 3 import org.springframework.beans.BeansException;
 4 import org.springframework.beans.factory.config.BeanPostProcessor;
 5 
 6 public class MyBeanPostProcessor implements BeanPostProcessor {
 7     @Override
 8     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
 9         System.out.println("5. 预处理" + bean + beanName);
10         return bean;
11     }
12 
13     @Override
14     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
15         System.out.println("8. 后处理" + bean + beanName);
16         return bean;
17     }
18 }
View Code

 

3. beans5.xml

 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="
 5 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 6 
 7     <bean id="user" class="com.gyf.model.User" init-method="myInit" destroy-method="myDestory">
 8         <property name="username" value="admin"></property>
 9         <property name="password" value="123456"></property>
10     </bean>
11 
12     <!--配置bean处理器-->
13     <bean id="beanProcess" class="com.gyf.model.MyBeanPostProcessor"></bean>
14 </beans>
View Code

 

4. Lesson05.java

 1 package com.gyf.test;
 2 
 3 import com.gyf.model.User;
 4 
 5 import org.junit.Test;
 6 import org.springframework.context.ApplicationContext;
 7 import org.springframework.context.support.ClassPathXmlApplicationContext;
 8 
 9 import java.lang.reflect.InvocationTargetException;
10 
11 public class Lesson05 {
12 
13     @Test
14     public void test1() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
15         ApplicationContext context = new ClassPathXmlApplicationContext("beans5.xml");
16         User user = (User) context.getBean("user");
17         System.out.println(user);
18 
19         //关闭容器
20         context.getClass().getMethod("close").invoke(context);
21     }
22 
23 }
View Code

 

5. 结果输出如下图:

 

posted @ 2020-08-30 05:43  海边拾贝seebit  阅读(232)  评论(0)    收藏  举报