spring支持bean实例化之前进行操作
1.测试主类
package java_config;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Bootrap {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(StudentConfig.class);
Teacher simpleBean = context.getBean(Teacher.class);
System.out.println(simpleBean.toString());
}
}
2.Teacher类
package java_config;
/**
* @author: zhaoxu
* @date: 2020/9/20 16:00
*/
public class Teacher {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Teacher(String name, int age) {
this.age = age;
this.name = name;
}
public Teacher() {
System.out.println("Teacher");
}
@Override
public String toString() {
return "Teacher [name=" + name + ", age=" + age + "]";
}
}
3.Student类
package java_config;
import org.springframework.stereotype.Component;
@Component
public class Student{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
this.age = age;
this.name = name;
}
public Student() {
System.out.println("student");
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
4.StudentConfig类
package java_config;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan(value = "java_config")
public class StudentConfig{
}
Teacher类没有任何注解,但是student类中有一个@Component注解,spring可以获取到student类,通过实现BeanFactoryPostProcessor
,能够在实例化bean之前,对bean进行为所欲为的操作
5.postprocesser类实现BeanFactoryPostProcessor 接口
package java_config;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.stereotype.Component;
/**
* @author: zhaoxu
* @date: 2020/9/20 16:04
*/
@Component
public class postprocesser implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
GenericBeanDefinition student = (GenericBeanDefinition) configurableListableBeanFactory.getBeanDefinition("student");
student.setBeanClass(Teacher.class);
}
}
这里将获取到的student BeanDefinition重新设置BeanClass为Teacher,最终spring能够获取到Teacher但是却找不到student