一、Spring的监听器
参考:https://blog.csdn.net/erbao_2014/article/details/68924231
(1)定义事件,继承 ApplicationEvent 类;
public class MyEvent extends ApplicationEvent{
private static final long serialVersionUID = 1L;
private String msg ;
public MyEvent(Object source,String msg) {
super(source);
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
(2)定义监听器,自己定义的监听器需要实现 ApplicationListener,同时泛型参数要加上自己要监听的事件Class名,在重写的方法 onApplicationEvent 中,添加自己的业务处理。
@Component
public class MyNoAnnotationListener implements ApplicationListener<MyEvent>{
@Override
public void onApplicationEvent(MyEvent event) {
System.out.println("非注解监听器:" + event.getMsg());
}
}
(3)事件发布;有了事件,有了事件监听者,那么什么时候触发这个事件呢?
每次想让监听器收到事件通知的时候,就可以调用一下事件发布的操作。注入一下 ApplicationContext,通过spring的应用上下文进行事件的发布,参数就是要发布事件的 MyEvent 事件对象;
@Component public class MyEventPubLisher { @Autowired private ApplicationContext applicationContext; // 事件发布方法 public void pushListener(String msg) { applicationContext.publishEvent(new MyEvent(this, msg)); } }
二、BeanFactoryPostProcessor
BeanFactoryPostProcessor 可以在 Bean 实例化之前获取到 BeanDefinition 并对其进行操作;
@Configuration
@ComponentScan(basePackages = "com.yufeng.testbeanfacotoryPostProcessor")
public class MainConfig {
}
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("IOC 容器调用了MyBeanFactoryPostProcessor的postProcessBeanFactory方法");
for(String name:beanFactory.getBeanDefinitionNames()) {
if("myLog".equals(name)) {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name);
// 设置为懒加载
beanDefinition.setLazyInit(true);
}
}
}
}
public class MainClass {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class);
//System.out.println(ctx.getBean(MyLog.class));
}
}
三、BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor 在 BeanDefinition 生成之前,向IOC容器中注册 BeanDefinition。
@Configuration @ComponentScan(basePackages = "com.yufeng.testbfpostprocessor") public class MainConfig { }
@Component
public class MyBeanDefinationRegisterPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
System.out.println("MyBeanDefinationRegisterPostProcessor的postProcessBeanDefinitionRegistry方法");
System.out.println("bean定义的数据量:"+registry.getBeanDefinitionCount());
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(MyLog.class);
registry.registerBeanDefinition("myLog",rootBeanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("MyBeanDefinationRegisterPostProcessor的postProcessBeanFactory方法");
System.out.println(beanFactory.getBeanDefinitionCount());
}
}