Bean后处理器是一种特殊的Bean,这种特殊的Bean并不对外提供服务,无需id属性,可以负责对容器中的其他Bean执行后处理
Bean后处理必须实现BeanPostProcessor接口,该接口包含以下两个方法
Object postProcessorBeforeInitialization(Object bean,String beanName) throws BeansException
Object postProcessorAfterInitialization(Object bean,String beanName) throws BeansException
public interface Person { public void sayHello(); }
public class Teacher implements Person{
private Student student;
private String username;
@Override
public void sayHello() {
System.out.println("我是一个老师");
student.sayHello();
}
@PostConstruct
public void init(){
System.out.println("教师类初始化");
}
@PreDestroy
public void close(){
System.out.println("教师类销毁之前调用的方法");
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
public class Student implements Person{
@Override
public void sayHello() {
System.out.println("我是一个学生");
}
}
<bean id="student" class="com.Student"></bean> <bean id="teacher" class="com.Teacher"> <property name="student" ref="student"></property> <property name="username"> <value>moweng</value> </property> </bean> <bean id="beanPostProcessor" class="com.MyBean"></bean>
public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("config/applicationContext.xml"); Person teacher=(Teacher)context.getBean("teacher"); teacher.sayHello(); }
小结:当采用BeanFactory作为spring容器时,必须手动注册BeanPostProcessor,.ApplicationContext可以自动检测容器中Bean后处理器,并自动注册
public static void main(String[] args) { ClassPathResource resource=new ClassPathResource("config/applicationContext.xml"); XmlBeanFactory factory=new XmlBeanFactory(resource); MyBean beanProcessorBean=(MyBean)factory.getBean("beanPostProcessor"); factory.addBeanPostProcessor(beanProcessorBean); Person teacher=(Teacher)factory.getBean("teacher"); teacher.sayHello(); }