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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM