springBean的生命周期

啥也别说了,作为时下最热门的java开发框架,非常有必要了解下spring的各个组件的运行机制和源码解读,下面就以代码的形式讲解下springBean的生成,使用和销毁,希望能给大家带来些帮助。

bean的创建过程

相关接口

只讲bean的生命周期,就不牵扯IOC容器的那些类了,下面主要讲的是相关的类

  • BeanNameAware : 在bean初始化之前,设置Bean的name或id属性
  • BeanFactoryAware : 在bean初始化之前,设置bean所在的bean工厂信息
  • InitializingBean : 初始化bean
  • DisposableBean : 销毁bean
  • BeanPostProcessor:spring的bean后置处理器,分别包含前置和后置两种方法

具体生命周期

1.首先,spring会生成bean的实例和属性注入

2.spring会并通过接口 BeanNameAware.setBeanName 方法设置bean的名称或id

3.spring会并通过接口 BeanFactoryAware.setBeanFactory 方法设置bean属于哪个工厂

4.初始化bean之前,如果有设置前置处理器BeanPostProcessor,将会执行该前置方法

5.初始化bean,通过接口 InitializingBean.afterPropertiesSet 方法

6.初始化bean之后,如果有设置前置处理器BeanPostProcessor,将会执行该后置方法

7.bean的销毁,可以自动由java回收机制销毁或通过接口 DisposableBean.destroy 方法销毁

代码讲解

UserBean.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.wwk.demo.springBeam;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

/**
* 接口介绍
* BeanNameAware : 在bean初始化之前,设置Bean的name或id属性
* BeanFactoryAware : 在bean初始化之前,可以设置自身bean所在的bean工厂信息
* InitializingBean : 初始化bean
* DisposableBean : 销毁bean
*/
public class UserBean implements BeanNameAware,InitializingBean,DisposableBean,BeanFactoryAware {

private String username;

public String getUsername() {
return username;
}

public void setUsername(String username) {
System.err.println("------开始注入属性值-- 小明带齐工具");
this.username = username;
}

// 默认构造方法
public UserBean() {
super();
System.err.println("------构造函数开始-- 小明准备上班");
}

// 输出字符串
@Override
public String toString() {
return "---- 初始化完成 [username=" + username + "]-- 小明正在干活ing////";
}

// 设置bean的名称
@Override
public void setBeanName(String arg0) {
System.err.println("-------spring设置了bean的名称-- 小明戴好自己的工牌");
}

// 设置bean工厂的信息
@Override
public void setBeanFactory(BeanFactory arg0) throws BeansException {
System.err.println("--------spring设置了bean工厂的信息-- 小明走向自己的工厂");
}

// 初始化bean
@Override
public void afterPropertiesSet() throws Exception {
System.err.println("---------bean初始化-- 小明开始上班");
}

// 销毁bean
@Override
public void destroy() throws Exception {
System.err.println("----------bean销毁-- 小明下班");
}


}

MyBeanPostProcessor.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.wwk.demo.springBeam;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

/**
* bean的前置后置方法
* 接口介绍
* BeanPostProcessor:spring的bean后置处理器,分别包含前置和后置两种方法
*/
public class MyBeanPostProcessor implements BeanPostProcessor{

/**
* 前置方法 - bean初始化之前执行
* 参数介绍
* bean: 需要初始化bean的实例
* beanName: bean的名称
*/
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

// UserBean userBean = null;
//
// //这里可以对bean做处理,将属性值改动
// if (bean instanceof UserBean) {
// userBean = (UserBean) bean;
// userBean.setUsername("da ming");
// }
// return userBean;

System.err.println("-----bean前置方法--");
return bean;
}

/**
* 后置方法 - bean初始化之后执行
* 参数介绍
* bean: 需要初始化bean的实例
* beanName: bean的名称
*/
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

System.err.println("-----bean后置方法--");
return bean;
}
}

applicationContext.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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-3.0.xsd">

<!-- userBean -->
<bean name="userBean" class="com.wwk.demo.springBeam.UserBean">
<property name="username" value="xiao ming"/>
</bean>

<!-- bean的后处理器 -->
<bean class="com.wwk.demo.springBeam.MyBeanPostProcessor"></bean>

</beans>

UserBeanTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.wwk.demo.springBeam;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserBeanTest {

public static void main(String[] args) {

//获取IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");


UserBean userBean = (UserBean) context.getBean("userBean");

//调用已生成bean的方法
System.err.println(userBean.toString());

//关闭容器
((AbstractApplicationContext) context).close();
}
}

效果图

ls