zoukankan      html  css  js  c++  java
  • 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());
        }
    }
    

      

  • 相关阅读:
    前端如何进阶架构师
    NPOI使用记录
    ArcGis 中空间数据的插入与更新
    (转载).net 缓存处理
    ASP.NET(c#)实现重定向的三种方法的总结
    数据库关联表之间的更新语句
    C#net多线程多文件压缩下载
    关于写文件流的情况
    C# Class获取项目的绝对路径
    C# .net中DatailsView的JS简易版
  • 原文地址:https://www.cnblogs.com/yufeng218/p/14265035.html
Copyright © 2011-2022 走看看