文章目录
Bean的生命周期
一、Bean从创建到销毁经历的各个阶段以及每个阶段所调用的方法
二、测试生命周期
1、准备bean
2、配置bean
3、测试bean
三、关于后置处理器
1、创建后置处理器 实现 BeanPostProcesser 重写两个方法
2、配置后置处理器,对容器中的所有bean添加后置处理器的生命周期
四、BeanPostProcessor接口作用
Bean的生命周期
一、Bean从创建到销毁经历的各个阶段以及每个阶段所调用的方法
1、通过构造器创建bean实例 执行构造器
2、为bean属性赋值 执行set方法
3、初始化bean 调用bean的初始化方法,需要配置指定调用的方法
4、bean的获取 容器对象 getBean方法
5、容器关闭销毁bean 调用销毁方法,需要配置指定调用的方法
二、测试生命周期
1、准备bean
package com.lanson.bean;
/**
* @Author: lansonli
* @Description: MircoMessage:Mark_7001
*/
public class User {
private Integer userid;
private String username;
private String password;
public void initUser(){
System.out.println("第三步:User初始化");
}
public User() {
System.out.println("第一步:User构造");
}
public void destoryUser(){
System.out.println("第五步:User销毁");
}
@Override
public String toString() {
return "User{" +
"userid=" + userid +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public User(Integer userid, String username, String password) {
this.userid = userid;
this.username = username;
this.password = password;
}
public void setUserid(Integer userid) {
System.out.println("setUserid");
this.userid = userid;
}
public void setUsername(String username) {
System.out.println("第二步:User属性赋值");
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
}
2、配置bean
<?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:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="com.lanson.bean.User" init-method="initUser" destroy-method="destoryUser">
<property name="username" value="lansonli"></property>
</bean>
</beans>
3、测试bean
package com.lanson.test;
import com.lanson.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Author: lansonli
* @Description: MircoMessage:Mark_7001
*/
public class Test1 {
@Test
public void testGetBean(){
ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
User user = context.getBean("user",User.class);
System.out.println("第四步:User对象从容器中获取");
// 关闭容器
context.close();
}
}
三、关于后置处理器
- 通过构造器创建bean实例 执行构造器
- 为bean属性赋值 执行set方法
- 把bean实例传递给bean的后置处理器的方法
- 初始化bean 调用bean的初始化方法,需要配置指定调用的方法
- 把bean实例传递给bean的后置处理器的方法
- bean的获取 容器对象 getBean方法
- 容器关闭销毁bean 调用销毁方法,需要配置指定调用的方法
1、创建后置处理器 实现 BeanPostProcesser 重写两个方法
package com.lanson.beanProcesser;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
* @Author: lansonli
* @Description: MircoMessage:Mark_7001
*/
public class MyBeanProcesser implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
//Object bean 实例化的bean
//String beanName bean的id
System.out.println("bean:初始化方法之前");
return bean;// 这里必须return bean
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("bean:初始化方法之后");
return bean;// 这里必须returnbean
}
}
2、配置后置处理器,对容器中的所有bean添加后置处理器的生命周期
<?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:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="com.lanson.bean.User" init-method="initUser" destroy-method="destoryUser">
<property name="username" value="lansonli"></property>
</bean>
<bean id="myBeanProcesser" class="com.lanson.beanProcesser.MyBeanProcesser"></bean>
</beans>
四、BeanPostProcessor接口作用
如果我们想在Spring容器中完成bean实例化、配置以及其他初始化方法前后要添加一些自己逻辑处理。我们需要定义一个或多个BeanPostProcessor接口实现类,然后注册到Spring IoC容器中。
- 接口中的两个方法都要将传入的bean返回,而不能返回null,如果返回的是null那么我们通过getBean方法将得不到目标。
- ApplicationContext会自动检测在配置文件中实现了BeanPostProcessor接口的所有bean,并把它们注册为后置处理器,然后在容器创建bean的适当时候调用它,因此部署一个后置处理器同部署其他的bean并没有什么区别。而使用BeanFactory实现的时候,bean 后置处理器必须通过代码显式地去注册,在IoC容器继承体系中的ConfigurableBeanFactory接口中定义了注册方法
- 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
- 📢本文由 Lansonli 原创
- 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨