第一種方式:方法注入
方法注入在Spring中是很少用的,主要應用是, 對象中可能定義了一個受保護的抽象方法,而容器可能在運作時實作他以傳回由容器查詢得到的對象。
方法注入的最好用途之一就是處理單态、無狀态對象需要調用非單态、有狀态或者非線程安全對象的情況。
<code>package</code> <code>com.mzsx.spring.notsingleton;</code>
<code>public</code> <code>interface</code> <code>IUserDao {</code>
<code> </code><code>public</code> <code>void</code> <code>add();</code>
<code> </code><code>public</code> <code>void</code> <code>delete();</code>
<code> </code><code>public</code> <code>void</code> <code>load();</code>
<code>public</code> <code>class</code> <code>UserDaoImp </code><code>implements</code> <code>IUserDao {</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>void</code> <code>add() {</code>
<code> </code><code>System.out.println(</code><code>"dao添加使用者。。。。"</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>void</code> <code>delete() {</code>
<code> </code><code>System.out.println(</code><code>"dao***使用者。。。。"</code><code>);</code>
<code> </code><code>public</code> <code>void</code> <code>load() {</code>
<code> </code><code>System.out.println(</code><code>"dao加載使用者。。。。"</code><code>);</code>
<code>}</code>
<code>public</code> <code>abstract</code> <code>class</code> <code>UserService {</code>
<code> </code><code>protected</code> <code>abstract</code> <code>IUserDao getUserDao();</code>
<code> </code>
<code> </code><code>getUserDao().add();</code>
<code><?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"UTF-8"</code><code>?></code>
<code><</code><code>beans</code> <code>xmlns="</code>
<code>http://www.springframework.org/schema/beans</code>
<code>"</code>
<code> </code><code>xmlns:xsi="</code>
<code>http://www.w3.org/2001/XMLSchema-instance</code>
<code> </code><code>xsi:schemaLocation="</code>
<code> </code>
<code>http://www.springframework.org/schema/beans/spring-beans-3.0.xsd</code>
<code>"></code>
<code> </code><code><</code><code>bean</code> <code>id</code><code>=</code><code>"userDao"</code> <code>class</code><code>=</code><code>"com.mzsx.spring.notsingleton.UserDaoImp"</code> <code>scope</code><code>=</code><code>"prototype"</code><code>></</code><code>bean</code><code>></code>
<code> </code><code><</code><code>bean</code> <code>id</code><code>=</code><code>"userService"</code> <code>class</code><code>=</code><code>"com.mzsx.spring.notsingleton.UserService"</code> <code>></code>
<code> </code><code><</code><code>lookup-method</code> <code>name</code><code>=</code><code>"getUserDao"</code> <code>bean</code><code>=</code><code>"userDao"</code> <code>/> </code>
<code> </code><code></</code><code>bean</code><code>></code>
<code>import</code> <code>org.junit.Test;</code>
<code>import</code> <code>org.springframework.beans.factory.BeanFactory;</code>
<code>import</code> <code>org.springframework.context.support.ClassPathXmlApplicationContext;</code>
<code>public</code> <code>class</code> <code>TestMain {</code>
<code> </code><code>private</code> <code>BeanFactory factory= </code><code>new</code> <code>ClassPathXmlApplicationContext(</code><code>"beans1.xml"</code><code>);</code>
<code> </code><code>@Test</code>
<code> </code><code>public</code> <code>void</code> <code>notSingleton(){</code>
<code> </code><code>UserService users=(UserService)factory.getBean(</code><code>"userService"</code><code>);</code>
<code> </code><code>System.out.println(users.getUserDao());</code>
<code> </code><code>UserService users1=(UserService)factory.getBean(</code><code>"userService"</code><code>);</code>
<code> </code><code>System.out.println(users1.getUserDao());</code>
<code> </code>
結果:
<code>2014</code><code>-</code><code>6</code><code>-</code><code>3</code> <code>22</code><code>:</code><code>00</code><code>:</code><code>10</code> <code>org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons</code>
<code>資訊: Pre-instantiating singletons in </code>
<code>org.springframework.beans.factory.support.DefaultListableBeanFactory</code><code>@5bb966</code>
<code>: defining beans [userDao,userService]; root of factory hierarchy</code>
<code>com.mzsx.spring.notsingleton.UserDaoImp</code><code>@caf6c1</code>
<code>com.mzsx.spring.notsingleton.UserDaoImp</code><code>@10e35d5</code>
<a href="mailto:com.mzsx.spring.notsingleton.UserDaoImp@10e35d5"></a>
需要使用cgLib。
第二種方式:ApplicationContextAware
<code>package</code> <code>com.mzsx.spring.notsingleton2;</code>
<code>import</code> <code>org.springframework.beans.BeansException;</code>
<code>import</code> <code>org.springframework.context.ApplicationContext;</code>
<code>import</code> <code>org.springframework.context.ApplicationContextAware;</code>
<code>public</code> <code>class</code> <code>UserDaoImp </code><code>implements</code> <code>IUserDao,ApplicationContextAware {</code>
<code> </code><code>private</code> <code>ApplicationContext app;</code>
<code> </code><code>System.out.println((IUserDao)app.getBean(</code><code>"userDao"</code><code>));</code>
<code> </code><code>public</code> <code>void</code> <code>setApplicationContext(ApplicationContext app)</code>
<code> </code><code>throws</code> <code>BeansException {</code>
<code> </code><code>// TODO Auto-generated method stub</code>
<code> </code><code>this</code><code>.app=app;</code>
<code>public</code> <code>class</code> <code>UserService {</code>
<code> </code><code>private</code> <code>IUserDao userDao;</code>
<code> </code><code>public</code> <code>IUserDao getUserDao() {</code>
<code> </code><code>return</code> <code>userDao;</code>
<code> </code><code>public</code> <code>void</code> <code>setUserDao(IUserDao userDao) {</code>
<code> </code><code>this</code><code>.userDao = userDao;</code>
<code> </code><code>userDao.add();</code>
<code> </code><code><</code><code>bean</code> <code>id</code><code>=</code><code>"userDao"</code> <code>class</code><code>=</code><code>"com.mzsx.spring.notsingleton2.UserDaoImp"</code> <code>scope</code><code>=</code><code>"prototype"</code><code>></</code><code>bean</code><code>></code>
<code> </code><code><</code><code>bean</code> <code>id</code><code>=</code><code>"userService"</code> <code>class</code><code>=</code><code>"com.mzsx.spring.notsingleton2.UserService"</code> <code>></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"userDao"</code> <code>ref</code><code>=</code><code>"userDao"</code><code>></</code><code>property</code><code>></code>
<code> </code><code>private</code> <code>BeanFactory factory= </code><code>new</code> <code>ClassPathXmlApplicationContext(</code><code>"beans2.xml"</code><code>);</code>
<code> </code><code>users.add();</code>
<code> </code><code>users1.add();</code>
結果:d
<code>2014</code><code>-</code><code>6</code><code>-</code><code>3</code> <code>22</code><code>:</code><code>03</code><code>:</code><code>20</code> <code>org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons</code>
<code>org.springframework.beans.factory.support.DefaultListableBeanFactory</code><code>@1e903d5</code>
<code>com.mzsx.spring.notsingleton2.UserDaoImp</code><code>@1554d32</code>
<code>dao添加使用者。。。。</code>
<code>com.mzsx.spring.notsingleton2.UserDaoImp</code><code>@13f136e</code>
ApplicationContextAware接口,此接口定義了一個方法setApplicationContext()方法,此方法在Spring初始化類以後,調用實作了ApplicationContextAware接口的類的setApplicationContext()方法,将自身的一個引用傳遞給此執行個體。
我們将這兩種單例調用非單例的例子對比一下,不難看出,第一種方式:方法注入要好于第二種方式:實作接口。原因是,第二種方式與Spring綁定了。而第一種方式則沒有這種情況,在Service中,我們根本看不出Spring的影子。
本文轉自 夢朝思夕 51CTO部落格,原文連結:http://blog.51cto.com/qiangmzsx/1421705