第一种方式:方法注入
方法注入在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