zoukankan      html  css  js  c++  java
  • Spring基础-如何获取ApplicationContext

    第一种方法:

    使用@Autowired方法来获取

    举个栗子

    public class User {
    
    
        @Autowired
        //@Resource
        //@Inject
        private ApplicationContext applicationContext;
    
        public void show() {
            System.out.println("applicationContext = " + applicationContext.getClass());
        }
    }

    这三个注解都可以,注意第三个注解要引入jar包.

    第二种方式:

    实现ApplicationContextAware接口

    @Component
    public class Book implements ApplicationContextAware {
    
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    
        public void show() {
            System.out.println("applicationContext = " + applicationContext.getClass());
        }
    }

    第三种方式

    使用构造器,在构造器里传入

    
    
    /**
    * spring4.3新特性
    * 1.构造函数只能有一个.
    * 2.构造器参数必须在spring容器中.
    */

    @Component
    public class Bank { private ApplicationContext applicationContext; public Bank(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } public void show() { System.out.println("applicationContext = " + applicationContext.getClass()); } }

    有一定局限性

    构造函数不能为空,

     详细分析第二种方式

    如何自己实现第二中方式

    第一步写一个接口

    public interface MyApplicationContextAware {
    
        public  void setApplicationContext(ApplicationContext applicationContext);
    }

    然后实现这个接口

    @Component
    public class Dog implements MyApplicationContextAware {
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
        }
    
        public void show() {
            Cat bean = applicationContext.getBean(Cat.class);
            System.out.println("bean = " + bean);
            System.out.println("applicationContext = " + applicationContext);
        }
    }

    再写一个  MyPostProcessor实现BeanPostProcessor,在postProcessBeforeInitialization()方法里面,判断,如果是MyApplicationContextAware这个接口的实现类,那就可以调用setApplicationContext方法设置值.

    @Component
    public class MyPostProcessor implements BeanPostProcessor {
    
        @Autowired
        private ApplicationContext applicationContext;
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if (bean instanceof MyApplicationContextAware) {
                ((MyApplicationContextAware) bean).setApplicationContext(applicationContext);
            }
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    }

    这样就可以自己实现第二种方式的注入了.

    源码:ApplicationContextAwareProcessor.class 

  • 相关阅读:
    [转] MathType的灵活运用
    [zz] 模式识别,计算机视觉领域,期刊
    SQL语句 合并列值 将一列的多个值合并成一行
    目标板识别为U盘
    android 事件传递机制
    linux有关文件权限的命令
    linux中的jiffies变量
    分析Android 根文件系统启动过程(init守护进程分析)
    2010年暂订读书目录
    Android Power Management
  • 原文地址:https://www.cnblogs.com/songfahzun/p/9236183.html
Copyright © 2011-2022 走看看