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 

原文地址:https://www.cnblogs.com/songfahzun/p/9236183.html