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