横云断岭 2020-05-26
BeanPostProcesser的作用是在Bean初始化前后处理一些工作
BeanPostProcesser名字虽然叫后置处理器,但是提供了两个方法postProcessBeforeInitialization和postProcessAfterInitialization,在Bean初始化之前和初始化之后分别调用,
我们的Bean可以实现此接口,然后重写上面两个方法
BeanPostProcesser调用原理:
像这种方法前后加一些东西的,一开始想到的是AOP,源码上看起来并不是AOP,而是在执行InitMethod(初始化方法)的前后分别调用两个方法
Spring对BeanPostProcesser的一些使用
BeanValidationPostProcessor 在Web里面对数据校验用的比较多
@Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (!this.afterInitialization) { doValidate(bean); } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (this.afterInitialization) { doValidate(bean); } return bean; }
AutowiredAnnotationBeanPostProcessor 在对象创建完之后处理Autowired注解
BeanFactoryPostProcesser和BeanPostProcesser名字很类似 这个是BeanFactory的后置处理器
执行时机:在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容,此时所有的bean定义已经加载到BeanFactory,但是bean的实列还未创建
BeanDefinitionRegistryPostProcessor 是BeanFactoryPostProcesser的子类和父类相比 它额外定义了一个新的方法postProcessBeanDefinitionRegistry()
执行时机:在bean的信息将要被加载的时候执行,优先于BeanFactoryProcesser执行,可以利用BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法 给容器额外添加一些组件
ApplicationListener监听容器中发布的事件,事件驱动模型的开发
理解ApplicationListener 首先了解下观察者模式
现在我们自己发布一个事件的流程
1.首先写一个Listener实现ApplicationListener接口,接口中可以拿到事件源对象。相当于观察者模式的Observe实现类
@Component public class MyApplicationListener implements ApplicationListener<MyApplicationEvent> { @Override public void onApplicationEvent(MyApplicationEvent event) { System.out.println("我接收到事件"+event.toString()); } }
2. 然后定义一个事件实现类,和观察者模式一样 拥有事件原对象
public class MyApplicationEvent extends ApplicationEvent { private Object source; private Date eventDate; public MyApplicationEvent(Object source,Date eventDate) { super(eventDate); this.source=source; System.out.println("我发布的事件"); } @Override public String toString() { return "MyApplicationEvent{" + "source=" + source + ", eventDate=" + eventDate + ‘}‘; } }
3.最后把事件发布出去即可 相当于观察者模式中的c.wakeUp();(小孩哭这个动作)
@Test public void test01(){ AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class); applicationContext.publishEvent(new MyApplicationEvent(applicationContext,new Date()) { }); applicationContext.close(); }