今天就跟大家聊聊有关Spring源码中BeanPostProcessor的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、网页空间、营销软件、网站建设、通山网站维护、网站推广。
前提概要
Spring具有很好的扩展性,但是这个扩展它的这个扩展性体现在哪里呢?而我们要说的BeanPostProcessor就是对Spring扩展性优秀的表现之一。
BeanPostProcessor的作用
其操作对象为:已经实例化且进行了属性填充,待初始化的Bean实例。
源码分析
public interface BeanPostProcessor {
/**
* 初始前调用
*/
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}
/**
* 初始化后调用
*/
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}
}
如何使用
BeanPostProcessorDemo代码如下:
public class BeanPostProcessorDemo {
public static void main(String[] args) {
//创建基础容器
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
//加载xml配置文件
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions("spring-bean-post-processor.xml");
//添加BeanPostProcessor
beanFactory.addBeanPostProcessor(new UserBeanPostProcessor());
User user = beanFactory.getBean(User.class);
System.out.println(user);
}
}
@Data
class User{
private String userName;
private Integer age;
private String beforeMessage;
private String afterMessage;
public void initMethod(){
System.out.println("初始化:"+this);
this.setUserName("小明");
this.setAge(18);
}
}
class UserBeanPostProcessor implements BeanPostProcessor{
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
if (bean instanceof User){
System.out.println("初始化前:"+bean);
((User) bean).setBeforeMessage("初始化前信息");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws
BeansException {
if (bean instanceof User){
System.out.println("初始化后:"+bean);
((User) bean).setAfterMessage("初始化后信息");
}
return bean;
}
}
其他的省略......
运行之后打印结果如下:
初始化前:User(userName=null, age=null, beforeMessage=null, afterMessage=null)
初始化:User(userName=null, age=null, beforeMessage=初始化前信息, afterMessage=null)
初始化后:User(userName=小明, age=18, beforeMessage=初始化前信息, afterMessage=null)
User(userName=小明, age=18, beforeMessage=初始化前信息, afterMessage=初始化后信息)
上面的代码很简单就是创建基础的容器,因为我这个里面用的是BeanFactory,BeanFactory作为基础容器是这里我采用手动将BeanPostProcessor注册到容器中去的。 同时也可以采用扫描或者定义的方式生成到容器中。
下面分析打印结果:
初始化前:User(userName=null, age=null, beforeMessage=null, afterMessage=null) 该结果是postProcessBeforeInitialization方法中输出的内容,这个时候User实例还只是进行了实例化,还未进行到初始化步骤,所以所有的属性都为null,说明该方法确实是初始化执行的。——(此时的初始化指的是bean对象的init方法)
初始化:User(userName=null, age=null, beforeMessage=初始化前信息, afterMessage=null) 该结果为自定义的初始化方法initMethod方法中输出的内容,这个时候User实例真正初始化,而beforeMessage中中的值正是我们在postProcessBeforeInitialization设置的。
初始化后:User(userName=小明, age=18, beforeMessage=初始化前信息, afterMessage=null) 该结果是postProcessAfterInitialization中输出内容,从打印结果可以看出它的确是在自定义initMethod后。
Spring的生命周期
Spring中Bean总体上来说可以分为四个周期:实例化、属性赋值、初始化、销毁。而BeanPostProcessor则是在初始化阶段的前后执行。
BeanPostProcessor是在初始化前后调用,所以我们查看initializeBean中的方法详情即可。该方法详情如下:
protected Object initializeBean(String beanName, Object bean, @Nullable
RootBeanDefinition mbd) {
//处理BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction