1. 程式人生 > >Spring中的ApplicationContextAware介面的使用

Spring中的ApplicationContextAware介面的使用

appContext_logo

最近在看專案程式碼時發現一個類在專案各個地方都能進行呼叫,仔細研究後發現這個類實現了ApplicationContextAware這個介面,這個介面可以很方便的獲取到Spring的上下文applicationContext。現在就跟我來一起看看如何使用吧。

使用方法

我們先新建一個測試類AppCache,在這個類中我定義了一個靜態的DictService屬性。而DictService類我也提前寫好了,裡面只輸出了一句話用作測試。

/**
 * <pre>
 * Description: 測試ApplicationContextAware介面
 * Copyright:   Copyright (c)2017
 * Author:      lllx
 * Version:     1.0
 * </pre>
 */
@Service public class DictServiceImpl implements DictService { @Override public void sayHello() { System.out.println("Hello ApplicationContextAware"); } }

使用測試類AppCache實現這個介面,填寫它的setApplicationContext方法。Spring容器在載入的時候會呼叫一次setApplicationContext,並將上下文ApplicationContext傳遞給這個方法。我們拿到上下文後就可以做很多事情了。這裡我使用它來獲取了DictService這個bean。然後建立了一個靜態的sayHello測試方法呼叫了DictService中的sayHello。

/**
 * <pre>
 * Description: 測試ApplicationContextAware介面
 * Copyright:   Copyright (c)2017
 * Author:      lllx
 * Version:     1.0
 * </pre>
 */

public class AppCache implements ApplicationContextAware {

    private static DictService dictService;

    @Override
    public void setApplicationContext
(ApplicationContext applicationContext) throws BeansException { dictService = applicationContext.getBean(DictService.class); } public static void sayHello(){ dictService.sayHello(); } }

接下來我們需要把測試類AppCache注入到Spring容器中,在Spring的配置檔案中新增測試類的bean。

<!--繼承ApplicationContextAware介面的類-->
<bean id="appController" class="top.catalinali.controller.AppCache"/>

我們新建一個Junit測試類,來呼叫自己定義的AppCache中的方法sayHello。

/**
 * <pre>
 * Description: 測試ApplicationContextAware介面
 * Copyright:   Copyright (c)2017
 * Author:      lllx
 * Version:     1.0
 * </pre>
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class AppTest {

    @Test
    public void TestApp(){
        AppCache.sayHello();
    }
}

測試結果

appContext_1
可以看到我們成功輸出了Hello ApplicationContextAware這句話。用這樣的方法,我們就可以在專案的各個位置來呼叫AppCache中的方法。除此之外我們也可以使用上下文進行一些別的事情,大家就可以自由發揮啦!

結語

其實我們進入ApplicationContextAware介面內部可以看到他只有一個抽象的setApplicationContext方法,

public interface ApplicationContextAware extends Aware {
    void setApplicationContext(ApplicationContext var1) throws BeansException;
}

並且他又繼承了一個Aware介面。而且這個介面是空的

package org.springframework.beans.factory;

public interface Aware {

}

這就很有意思了,具體原因就留給大家來討論吧。