什么是BeanPostProcessor
- 是Spring IOC容器给我们提供的一个扩展接口
- 在调用初始化方法前后对Bean进行额外加工,ApplicationContext会自动扫描实现了BeanPostProcessor得bean,并注册这些bean为后置处理器
- 是Bean的统一前置后置处理而不是基于某一个bean
执行顺序
Spring IOC容器实例化
调用BeanPostProcessor的postProcessBeforeInitialization方法
调用bean实例的初始化方法
调用BeanPostProcessor的postProcessAfterInitialization方法
注意:接口重写的两个方法不能返回null,如果返回null那么在后续初始化方法将报空指针异常或者通过getBean()方法获取不到bean实例对象
可以注册多个BeanPostProcessor顺序
- 在Spring机制中可以指定后置处理器调用顺序,通过BeanPostProcessor接口实现类实现Ordered接口getOrder方法,该方法返回整数,默认值为0优先级最高,值越大优先级越低
CustomBeanPostProcessor.java实现接口BeanPostProcessor
package net.cybclass.sp.processor; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class CustomBeanPostProcessor implements BeanPostProcessor { public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("CustomBeanPostProcessor postProcessBeforeInitialization beanName="+beanName); return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("CustomBeanPostProcessor postProcessAfterInitialization beanName="+beanName); return bean; } }
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="video" class="net.cybclass.sp.domain.Video"> <property name="id" value="8"></property> <property name="title" value="SpringBoot课程专题"></property> </bean> <bean class="net.cybclass.sp.processor.CustomBeanPostProcessor"></bean> </beans>
Video.java
package net.cybclass.sp.domain; public class Video { public Video() { System.out.println("Video 默认空构造函数被调用"); } { System.out.println("Video 构造块被调用"); } static { System.out.println("Video static 静态代码块被调用"); } private int id; private String title; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
app.java
package net.cybclass.sp; import net.cybclass.sp.domain.Video; import net.cybclass.sp.domain.Video2; import net.cybclass.sp.domain.VideoOrder; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class app { public static void main(String[] args) { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); Video video=(Video) applicationContext.getBean("video"); System.out.println(video); ((ClassPathXmlApplicationContext)applicationContext).registerShutdownHook(); } }