普通對象使用spring容器中的對象

引語:

    工做中有時候須要在普通的對象中去調用spring管理的對象,可是在普通的java對象直接使用@Autowired或者@Resource的時候會發現被注入的對象是null,會報空指針。咱們能夠簡單的理解爲spring是一個公司,它管理的對象就是它的員工,而普通的java對象是其餘公司的員工,若是其餘公司要找spring公司的員工一塊兒共事沒有通過spring公司的贊成確定是不行的。html

解決方式:

方法一:若是這個普通對象能夠被spring管理的話,最好是直接交給spring管理,這樣spring管理的bean中注入其餘的bean是沒有問題的。java

方法二:當咱們的普通對象沒有辦法交給spring管理的時候,咱們能夠建立一個公共的springBeanUtil專門爲普通對象提供spring的員工(有點像spring公司的外包部門,把對象外包給其餘公司使用,哈哈)。spring

@Service
public class SpringBeanUtil implements ApplicationContextAware {

    public static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        applicationContext = context;
    }

    // 這裏使用的是根據class類型來獲取bean 固然你能夠根據名稱或者其餘之類的方法 主要是有applicationContext你想怎麼弄均可以
    public static Object getBeanByClass(Class clazz) {
        return applicationContext.getBean(clazz);
    }
}

這個util呢,其實就是實現了ApplicationContextAware接口,有小夥伴要問了這個接口是幹嗎的?這裏給出連接地址,ApplicationContextAware參考資料。而後我也將文檔中的解釋給摘錄過來了api

public interface ApplicationContextAware extends Aware
Interface to be implemented by any object that wishes to be notified of the ApplicationContext that it runs in.
Implementing this interface makes sense for example when an object requires access to a set of collaborating beans. Note that configuration via bean references is preferable to implementing this interface just for bean lookup purposes.
This interface can also be implemented if an object needs access to file resources, i.e. wants to call getResource, wants to publish an application event, or requires access to the MessageSource. However, it is preferable to implement the more specific ResourceLoaderAware, ApplicationEventPublisherAware or MessageSourceAware interface in such a specific scenario.
Note that file resource dependencies can also be exposed as bean properties of type Resource, populated via Strings with automatic type conversion by the bean factory. This removes the need for implementing any callback interface just for the purpose of accessing a specific file resource.
ApplicationObjectSupport is a convenience base class for application objects, implementing this interface.

大概意思就是說只要實現了ApplicationContextAware接口的類,指望被告知當前運行的applicationContext是什麼。而後又說了若是是想要獲取資源最好是用ResourceLoaderAware, ApplicationEventPublisherAware or MessageSourceAware 這幾個接口,最後還來了一句咱們知道大家要使用這些接口,因此咱們幫你弄了一個實現了這些接口的抽象類ApplicationObjectSupport(在spring-context的jar包中)。這裏說得很清楚要使用bean的話,實現ApplicationContextAware,由於咱們這裏不須要使用靜態資源之類的因此咱們就不用spring爲咱們提供的ApplicationObjectSupport了,有興趣的能夠本身研究下。app

咱們這裏簡單的看一下ApplicationContextAware類裏面都有啥?ide

void setApplicationContext(ApplicationContext applicationContext) throws BeansException;

發現就一個方法,spring初始化的時候會將當前的applicationContext傳給ApplicationContextAware的setApplicationContext方法,因此只要實現類將這個applicationContext拿到了,就能夠經過class類型或者class的名稱來獲取到spring中的bean了。原理其實很簡單吧。使用的時候咱們能夠調用spring中的bean。以下:ui

Test test = (Test) SpringBeanUtil.getBeanByClass(Test.class);
相關文章
相關標籤/搜索