bean从创建到销毁经历的各个阶段以及每个阶段所调用的方法
1 通过构造器创建bean实例 执行构造器
2 为bean属性赋值 执行set方法
3 初始化bean 调用bean的初始化方法,需要配置指定调用的方法
4 bean的获取 容器对象 getBean方法
5 容器关闭销毁bean 调用销毁方法,需要配置指定调用的方法
测试生命周期
准备bean
package com.msb.bean;
/*** @Author: Ma HaiYang* @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销毁");}@Overridepublic 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;}
}
配置bean
测试bean
package com.msb.test;
import com.msb.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/*** @Author: Ma HaiYang* @Description: MircoMessage:Mark_7001*/
public class Test1 {@Testpublic void testGetBean(){ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");User user = context.getBean("user",User.class);System.out.println("第四步:User对象从容器中获取");// 关闭容器context.close();}
}
关于后置处理器
1 通过构造器创建bean实例 执行构造器
2 为bean属性赋值 执行set方法
3 把bean实例传递给bean的后置处理器的方法
4 初始化bean 调用bean的初始化方法,需要配置指定调用的方法
5 把bean实例传递给bean的后置处理器的方法
6 bean的获取 容器对象 getBean方法
7 容器关闭销毁bean 调用销毁方法,需要配置指定调用的方法
1 创建后置处理器 实现 BeanPostProcesser 重写两个方法
package com.msb.beanProcesser;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/*** @Author: Ma HaiYang* @Description: MircoMessage:Mark_7001*/
public class MyBeanProcesser implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {//Object bean 实例化的bean//String beanName bean的idSystem.out.println("bean:初始化方法之前");return bean;// 这里必须return bean}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("bean:初始化方法之后");return bean;// 这里必须returnbean}
}
2 配置后置处理器,对容器中的所有bean添加后置处理器的生命周期
BeanPostProcessor接口作用:
如果我们想在Spring容器中完成bean实例化、配置以及其他初始化方法前后要添加一些自己逻辑处理。我们需要定义一个或多个BeanPostProcessor接口实现类,然后注册到Spring IoC容器中。
1、接口中的两个方法都要将传入的bean返回,而不能返回null,如果返回的是null那么我们通过getBean方法将得不到目标。
2、ApplicationContext会自动检测在配置文件中实现了BeanPostProcessor接口的所有bean,并把它们注册为后置处理器,然后在容器创建bean的适当时候调用它,因此部署一个后置处理器同部署其他的bean并没有什么区别。而使用BeanFactory实现的时候,bean 后置处理器必须通过代码显式地去注册,在IoC容器继承体系中的ConfigurableBeanFactory接口中定义了注册方法