天天看點

Spring中ApplicationContextAware的用法

一、這個接口有什麼用?

當一個類實作了這個接口(applicationcontextaware)之後,這個類就可以友善獲得applicationcontext中的所有bean。換句話說,就是這個類可以直接擷取spring配置檔案中,所有有引用到的bean對象。

二、怎麼用?

舉個例子吧:

例如我有一個方法類apputil,這個方法類中需要使用到的applicationcontext中的某個bean(companyservice)。

1、因為spring要建立屬于自己的容器,就必須要加載自己的配置檔案。

     這個時候,需要注冊contextloaderlistener或者這個類的子類。

在web.xml加上以下的資訊:

1

<code>&lt;</code><code>p</code> <code>style</code><code>=</code><code>"line-height: normal;"</code><code>&gt;&lt;</code><code>listener</code><code>&gt;&lt;</code><code>br</code><code>&gt;        &lt;</code><code>listener-class</code><code>&gt;org.springframework.web.context.contextloaderlistener&lt;/</code><code>listener-class</code><code>&gt;&lt;</code><code>br</code><code>&gt; &lt;/</code><code>listener</code><code>&gt;&lt;</code><code>br</code><code>&gt;&lt;/</code><code>p</code><code>&gt;</code>

當然,這樣子的話隻會讀取預設路徑下的application.xml配置檔案的。如果需要讀取特定路徑下的配置檔案。需要在web.xml中

添加如下資訊。可以參考我的示例,指定配置檔案,如下:

<code>&lt;</code><code>p</code> <code>style</code><code>=</code><code>"line-height: normal;"</code><code>&gt;&lt;</code><code>context-param</code><code>&gt;&lt;</code><code>br</code><code>&gt;        &lt;</code><code>param-name</code><code>&gt;contextconfiglocation&lt;/</code><code>param-name</code><code>&gt;&lt;</code><code>br</code><code>&gt;        &lt;</code><code>param-value</code><code>&gt;classpath:conf/app-context.xml&lt;/</code><code>param-value</code><code>&gt;&lt;</code><code>br</code><code>&gt; &lt;/</code><code>context-param</code><code>&gt;&lt;</code><code>br</code><code>&gt;&lt;/</code><code>p</code><code>&gt;</code>

注意:

<code>&lt;</code><code>p</code> <code>style</code><code>=</code><code>"line-height: normal;"</code><code>&gt;&lt;</code><code>param-name</code><code>&gt;contextconfiglocation&lt;/</code><code>param-name</code><code>&gt;&lt;</code><code>br</code><code>&gt;&lt;/</code><code>p</code><code>&gt;</code>

是不能改變的。

2、方法類apputil的處理

方法類apputil實作applicationcontextaware接口:

<code>&lt;p style=</code><code>"line-height: normal;"</code><code>&gt;</code><code>public</code> <code>class</code> <code>apputil&lt;br&gt;  </code><code>implements</code> <code>applicationcontextaware&lt;br&gt;&lt;/p&gt;</code>

為方法類apputil增加一個靜态的成員applicationcontext類型的對象。以後方法類apputil擷取applicationcontext,就是通過讀取這個

成員變量的。具體如下所示:

<code>&lt;p style=</code><code>"line-height: normal;"</code><code>&gt;</code><code>private</code> <code>static</code> <code>applicationcontext appcontext;&lt;br&gt;&lt;/p&gt;</code>

 實作applicationcontextaware接口的預設方法:

<code>&lt;p style=</code><code>"line-height: normal;"</code><code>&gt; </code><code>public</code> <code>void</code> <code>setapplicationcontext(applicationcontext paramapplicationcontext)&lt;br&gt;    </code><code>throws</code> <code>beansexception&lt;br&gt;  {&lt;br&gt;    appcontext = paramapplicationcontext;&lt;br&gt;  }&lt;br&gt;&lt;/p&gt;</code>

3、在spring的配置檔案中,注冊方法類apputil

嚴格上來說,方法類apputil是一個bean,而且從步驟2中我們不難發現,之是以方法類apputil能夠靈活自如地擷取applicationcontext

就是因為spring能夠為我們自動地執行了setapplicationcontext。但是,spring不會無緣無故地為某個類執行它的方法的,是以,就很有必要通過注冊方法類apputil的方式告知spring有這樣子一個類的存在。

其實,方法很簡單,就是将方法類apputil作為一個普通的bean在spring的配置檔案中進行注冊:

<code>&lt;</code><code>p</code> <code>style</code><code>=</code><code>"line-height: normal;"</code><code>&gt;&lt;</code><code>bean</code> <code>id</code><code>=</code><code>"apputil"</code> <code>class</code><code>=</code><code>"com.htsoft.core.util.apputil"</code><code>/&gt;&lt;</code><code>br</code><code>&gt;&lt;/</code><code>p</code><code>&gt;</code>

4、使用靜态的成員applicationcontext類型的對象,appcontext,來調用其他bean。在方法類apputil中增加如下方法:

<code>&lt;p style=</code><code>"line-height: normal;"</code><code>&gt;</code><code>public</code> <code>static</code> <code>object getbean(string paramstring)&lt;br&gt;  {&lt;br&gt;    </code><code>return</code> <code>appcontext.getbean(paramstring);&lt;br&gt;  }&lt;br&gt;&lt;/p&gt;</code>

那麼,在方法類apputil中就能夠靈活地調用其他任何一個bean了,例如:

<code>&lt;p style=</code><code>"line-height: normal;"</code><code>&gt;companyservice localcompanyservice = (companyservice)getbean(</code><code>"companyservice"</code><code>);&lt;br&gt;&lt;/p&gt;</code>

注:配置檔案中關于companyservice的内容:

<code>&lt;</code><code>p</code> <code>style</code><code>=</code><code>"line-height: normal;"</code><code>&gt;&lt;</code><code>bean</code> <code>id</code><code>=</code><code>"companyservice"</code> <code>class</code><code>=</code><code>"com.kaiwii.service.system.impl.companyserviceimpl"</code><code>&gt;&lt;</code><code>br</code><code>&gt;        &lt;</code><code>constructor-arg</code> <code>index</code><code>=</code><code>"0"</code> <code>ref</code><code>=</code><code>"companydao"</code><code>/&gt;      &lt;</code><code>br</code><code>&gt;&lt;/</code><code>bean</code><code>&gt;&lt;</code><code>br</code><code>&gt;&lt;/</code><code>p</code><code>&gt;</code>

特别說明:尊重作者的勞動成果,轉載請注明出處哦~~~

http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt379