Spring IOC的应用

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

  

原文地址:https://www.cnblogs.com/yufeng218/p/14265035.html