第一种方法:
使用@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