bean的生命周期图:
1.实例化bean并设置bean属性
User.java
public class User {
private String username;
public User(){
System.out.println("User....无参构造方法。。。。。");
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
System.out.println("User....setUsername()。。。。。");
this.username = username;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
'}';
}
}
application.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="user" class="com.fyu.pojo.User">
<property name="username" value="lihaotao"/>
</bean>
</beans>
运行
public static void main( String[] args )
{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("application.xml");
}
运行结果
读取配置文件创建容器,容器就会实例化User对象,并且设置User的属性
2.检测该对象是否实现Aware接口的子接口
User.java
public class User implements BeanNameAware, BeanFactoryAware, ApplicationContextAware {
private String username;
public User(){
System.out.println("User....无参构造方法。。。。。");
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
System.out.println("User....setUsername()。。。。。");
this.username = username;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
'}';
}
/**
* 设置bean的id
* @param s
*/
@Override
public void setBeanName(String s) {
System.out.println("User bean:"+s);
}
/**
* 得到容器
* @param beanFactory
* @throws BeansException
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("BeanFactoryAware 接口实现的setBeanFactory().............");
}
/**
* 得到容器
* @param applicationContext
* @throws BeansException
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("ApplicationContextAware 接口实现的setApplicationContext().............");
}
}
配置文件没有修改
运行
public static void main( String[] args )
{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("application.xml");
User user = applicationContext.getBean("user", User.class);
System.out.println(user);
}
运行结果
3.检查容器中有无BeanPostProcessor的实现类
spring全局bean前置和后置初始化
SpringProcessorBean.java
/**
* @author lihaotao
* @create 2020-07-07
* spring 全局bean 前置和后置初始化
***/
public class SpringProcessorBean implements BeanPostProcessor {
/**
* 前置
* @param bean 当前初始化的bean
* @param beanName 当前初始化的bean的id
* @return
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("SpringProcessorBean 执行了全局前置初始化。。。。。。。。。。。。。。。");
if(beanName.equals("user")){
User user= (User) bean;
user.setUsername("我改了username");
}
return bean;
}
/**
* 后置
* @param bean 当前初始化的bean
* @param beanName 当前初始化的bean的id
* @return
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("SpringProcessorBean 执行了全局后置初始化。。。。。。。。。。。。。。。");
return bean;
}
}
application.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="user" class="com.fyu.pojo.User">
<property name="username" value="lihaotao"/>
</bean>
<bean id="springProcessorBean" class="com.fyu.pojo.SpringProcessorBean"/>
</beans>
运行
public static void main( String[] args )
{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("application.xml");
User user = applicationContext.getBean("user", User.class);
System.out.println(user);
}
运行结果
4.初始化时,检查对象有无实现InitializingBean,自定义init()
User.java
public class User implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {
private String username;
public User(){
System.out.println("User....无参构造方法。。。。。");
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
System.out.println("User....setUsername()。。。。。");
this.username = username;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
'}';
}
/**
* 设置bean的id
* @param s
*/
@Override
public void setBeanName(String s) {
System.out.println("User bean:"+s);
}
/**
* 得到容器
* @param beanFactory
* @throws BeansException
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("BeanFactoryAware 接口实现的setBeanFactory().............");
}
/**
* 得到容器
* @param applicationContext
* @throws BeansException
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("ApplicationContextAware 接口实现的setApplicationContext().............");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean afterPropertiesSet().............");
}
public void init(){
System.out.println("自定义的init()..................");
}
}
application.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="user" class="com.fyu.pojo.User" init-method="init">
<property name="username" value="lihaotao"/>
</bean>
<bean id="springProcessorBean" class="com.fyu.pojo.SpringProcessorBean"/>
</beans>
运行
public static void main( String[] args )
{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("application.xml");
User user = applicationContext.getBean("user", User.class);
System.out.println(user);
}
运行结果
到这里一个bean的初始化过程就完成了,就可以进入使用阶段
5.销毁时,检查对象有无实现DisposableBean,有无自定义destroy()
User.java
public class User implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {
private String username;
public User(){
System.out.println("User....无参构造方法。。。。。");
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
System.out.println("User....setUsername()。。。。。");
this.username = username;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
'}';
}
/**
* 设置bean的id
* @param s
*/
@Override
public void setBeanName(String s) {
System.out.println("User bean:"+s);
}
/**
* 得到容器
* @param beanFactory
* @throws BeansException
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("BeanFactoryAware 接口实现的setBeanFactory().............");
}
/**
* 得到容器
* @param applicationContext
* @throws BeansException
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("ApplicationContextAware 接口实现的setApplicationContext().............");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean afterPropertiesSet().............");
}
public void init(){
System.out.println("自定义的init()..................");
}
@Override
public void destroy() throws Exception {
System.out.println("DisposableBean destroy().............");
}
public void myDestroy(){
System.out.println("自定义的myDestroy()..................");
}
}
application.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="user" class="com.fyu.pojo.User" init-method="init" destroy-method="myDestroy">
<property name="username" value="lihaotao"/>
</bean>
<bean id="springProcessorBean" class="com.fyu.pojo.SpringProcessorBean"/>
</beans>
运行
注意:
容器关闭后,容器中的bean才会销毁,调用close()方法
ApplicationContext接口中没有close()方法,改用 ClassPathXmlApplicationContext
public static void main( String[] args )
{
ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("application.xml");
User user = applicationContext.getBean("user", User.class);
System.out.println(user);
applicationContext.close();
}
运行结果
总结
Spring bean的生命周期
- 实例化bean对象
- 设置bean的属性
- 检查对象有无实现Aware的子接口
BeanNameAware -->BeanFactoryAware–>ApplicationContextAware - 如果容器中有BeanPostProcessor接口的实现类,就会调用实现类的前置初始化方法postProcessBeforeInitialization()
- 如果对象实现了InitializingBean接口,就会调用afterPropertiesSet()
- 如果对象有自定义init(),就会执行自定义init()
- 如果容器中有BeanPostProcessor接口的实现类,就会调用实现类的后置初始化方法postProcessAfterInitialization()
- 创建完成
- 使用
- 销毁时,如果bean有实现DisposableBean,就会执行destroy()
- 如果有自定义销毁方法,就会调用自定义的销毁方法