一:什么是BeanPostProcessor
BeanPostProcessor是Spring IOC容器给我们提供的一个扩展接口。接口声明如下:
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
运行顺序
===Spring IOC容器实例化Bean===
===调用BeanPostProcessor的postProcessBeforeInitialization方法===
===调用bean实例的初始化方法===
===调用BeanPostProcessor的postProcessAfterInitialization方法===
二:BeanPostProcessor实例
前置代码:
Person类:
@Component
public class Person {
}
User类:
package org.example.bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;
/**
* @author yzh
* @date 2021/4/29 8:42
**/
@Component
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String name) {
this.name = name;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
Config类:
package org.example.bean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
/**
* @author yzh
* @date 2021/4/29 9:20
**/
@ComponentScan("org.example.bean")
public class Config {
//@Bean
//public User user(){
// return new User();
//}
}
1.新建一个类SpringBeanPostProcessor并实现BeanPostProcess接口,发现并未让我们强制实现方法,这是因为BeanPostProcessor里的方法时默认实现的,但是我们仍然可以实现该方法
注意该类需要打上@Component让Spring识别到,否则重写的方法不生效
package org.example.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
/**
* @author yzh
* @date 2021/4/30 9:57
**/
@Component
public class SpringBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("1111111111111111111111");
return null;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return new Person();
}
}
运行结果:因为我们在后置处理处替换了原有返回Bean,所有此处报了类型不正确的错误,希望要一个UserBean,但是返回一个PersonBean
1111111111111111111111
1111111111111111111111
1111111111111111111111
Exception in thread "main" org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'user' is expected to be of type 'org.example.bean.User' but was actually of type 'org.example.bean.Person'
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:399)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1115)
at org.example.bean.Main.main(Main.java:16)
Process finished with exit code 1
注:如果直接return null,不会改变任何值
如:
package org.example.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
/**
* @author yzh
* @date 2021/4/30 9:57
**/
@Component
public class SpringBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("1111111111111111111111");
return null;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//return new Person();
return null;
}
}
当然也可以通过后置处理器处理一些自己的代码逻辑,但是除非必要,否则不推荐这样操作