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 

  • 相关阅读:
    全栈程工程师
    月薪8000的程序员和月薪2万的程序员差别在哪里?
    原型中的访问
    关于 基本类型和复合类型 用== 判断的小问题
    使用原型解决构造函数问题
    前端工程师学习路线 --书籍
    程序员成长之路
    GIT学习(1) Pull和Fetch
    OO面向对象编程:第四单元总结及课程总结
    OO面向对象编程:第三单元总结
  • 原文地址:https://www.cnblogs.com/songfahzun/p/9236183.html
Copyright © 2011-2022 走看看