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(); }