参与spring初始化的方式
一、BeanPostProcessor接口
BeanPostProcessor是spring的一个后置处理器,他可以参与spring容器初始化的过程。我们通过重写这个接口的两个方法进行参与,示例如下:
@Component public class AopBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (beanName.equals("hello")){ System.out.println("BeforeInitialization"); } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (beanName.equals("hello")) { System.out.println("AfterInitialization"); } return bean; } }
@Repository public class Hello { public void say(){ System.out.println("hello, ==================================="); } }
public class Test { public static void main(String[] args) { AnnotationConfigApplicationContext acac = new AnnotationConfigApplicationContext(MyConfig.class); Hello hello = (Hello)acac.getBean("hello"); hello.say(); } }
执行结果:
BeforeInitialization
AfterInitialization
hello, ===================================
如果实现多个后置处理器,如何保证其执行顺序?我们通过实现PriorityOrdered类重新getOrder()的方法进行设置,其返回值越小其执行优先权越高,示例如下:
@Component public class AopBeanPostProcessor implements BeanPostProcessor, PriorityOrdered { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (beanName.equals("hello")){ System.out.println("BeforeInitialization"); } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (beanName.equals("hello")) { System.out.println("AfterInitialization"); } return bean; } @Override public int getOrder() { return 201; } }
@Component public class AopBeanPostProcessor1 implements BeanPostProcessor, PriorityOrdered { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (beanName.equals("hello")){ System.out.println("BeforeInitialization1"); } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (beanName.equals("hello")) { System.out.println("AfterInitialization1"); } return bean; } @Override public int getOrder() { return 200; } }
执行结果如下:
BeforeInitialization1
BeforeInitialization
AfterInitialization1
AfterInitialization
hello, ===================================
浙公网安备 33010602011771号