﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-viking'blog-随笔分类-学习日记</title><link>http://www.blogjava.net/viking/category/32601.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 10 Jul 2008 00:31:52 GMT</lastBuildDate><pubDate>Thu, 10 Jul 2008 00:31:52 GMT</pubDate><ttl>60</ttl><item><title>Spring注入field值</title><link>http://www.blogjava.net/viking/archive/2008/07/09/213816.html</link><dc:creator>viking</dc:creator><author>viking</author><pubDate>Wed, 09 Jul 2008 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/viking/archive/2008/07/09/213816.html</guid><wfw:comment>http://www.blogjava.net/viking/comments/213816.html</wfw:comment><comments>http://www.blogjava.net/viking/archive/2008/07/09/213816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/viking/comments/commentRss/213816.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viking/services/trackbacks/213816.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;嘿嘿，今天偷懒，就记一点点内容，然后去看PPLIVE去！<br />
&nbsp;&nbsp;&nbsp;&nbsp;注入field值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FieldRetrievingFactoryBean用来获得目标bean的field值。获得的值可注入给其他bean，也可直接定义成新的bean.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for example:<br />
--------------------------------------------------------------------------------------------<br />
<p>package org.viking.spring.imp;</p>
<p>public class Son <br />
{<br />
&nbsp;private int age;</p>
<p>&nbsp;public int getAge() {<br />
&nbsp;&nbsp;return age;<br />
&nbsp;}</p>
<p>&nbsp;public void setAge(int age) {<br />
&nbsp;&nbsp;this.age = age;<br />
&nbsp;}<br />
}<br />
--------------------------------------------------------------------------------------------<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans<br />
&nbsp;xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="son" class="org.viking.spring.imp.Son"&gt;<br />
&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&lt;!-- FiledRetrievingFactoryBean用来获取目标类的field值。id属性确定获取哪个类哪个field值。 --&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean id="java.sql.Connection.TRANSACTION_SERIALIZABLE" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"/&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&lt;/beans&gt;<br />
--------------------------------------------------------------------------------------------<br />
</p>
<p>package org.viking.spring.test;</p>
<p>import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
import org.viking.spring.imp.Son;</p>
<p>import junit.framework.TestCase;</p>
<p>public class TestInjectField extends TestCase<br />
{<br />
&nbsp;public void testInjectField()<br />
&nbsp;{<br />
&nbsp;&nbsp;ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");<br />
&nbsp;&nbsp;Son son = (Son)app.getBean("son");<br />
&nbsp;&nbsp;System.out.println("系统获取son的age属性： " + son.getAge());</p>
}<br />
}<br />
--------------------------------------------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;下面这个是field值定义成bean实例。只需修改applicationContext.xml和测试类。<br />
--------------------------------------------------------------------------------------------<br />
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans<br />
&nbsp;xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="son" class="org.viking.spring.imp.Son"&gt;<br />
&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&lt;!-- FiledRetrievingFactoryBean用来获取目标类的field值。id属性确定获取哪个类哪个field值。 --&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean id="java.sql.Connection.TRANSACTION_SERIALIZABLE" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"/&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="theAge" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"&gt;<br />
&nbsp;&nbsp;&lt;property name="staticField"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;java.sql.Connection.TRANSACTION_SERIALIZABLE&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&lt;/beans&gt;</p>
--------------------------------------------------------------------------------------------<br />
<p>package org.viking.spring.test;</p>
<p>import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
import org.viking.spring.imp.Son;</p>
<p>import junit.framework.TestCase;</p>
<p>public class TestInjectField extends TestCase<br />
{<br />
&nbsp;public void testInjectField()<br />
&nbsp;{<br />
&nbsp;&nbsp;ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");<br />
&nbsp;&nbsp;Son son = (Son)app.getBean("son");<br />
&nbsp;&nbsp;System.out.println("系统获取son的age属性： " + son.getAge());<br />
&nbsp;&nbsp;System.out.println("系统获取theAge的值: " +app.getBean("theAge"));<br />
&nbsp;}<br />
&nbsp;<br />
}<br />
--------------------------------------------------------------------------------------------<br />
<br />
<br />
-------以上的文字以及代码摘录于李刚写的《轻量级J2EE开发企业应用实战》，代码有少许变动！ </p>
<img src ="http://www.blogjava.net/viking/aggbug/213816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viking/" target="_blank">viking</a> 2008-07-09 22:49 <a href="http://www.blogjava.net/viking/archive/2008/07/09/213816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring注入属性值</title><link>http://www.blogjava.net/viking/archive/2008/07/08/213457.html</link><dc:creator>viking</dc:creator><author>viking</author><pubDate>Tue, 08 Jul 2008 14:59:00 GMT</pubDate><guid>http://www.blogjava.net/viking/archive/2008/07/08/213457.html</guid><wfw:comment>http://www.blogjava.net/viking/comments/213457.html</wfw:comment><comments>http://www.blogjava.net/viking/archive/2008/07/08/213457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/viking/comments/commentRss/213457.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viking/services/trackbacks/213457.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注入属性值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过PropertyPathFactoryBean类，可以注入某个实例的属性值。PropertyPathFactoryBean用来获取目标bean的属性值。获得的值可注入给其他bean,也可以直接定义成新的bean.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;看例子：<br />
-----------------------------------------------------------------------------------------<br />
<p>package org.viking.spring.imp;</p>
<p>public class Person <br />
{<br />
&nbsp;private int age;<br />
&nbsp;<br />
&nbsp;private Son son;</p>
<p>&nbsp;public void setAge(int age) {<br />
&nbsp;&nbsp;this.age = age;<br />
&nbsp;}</p>
<p>&nbsp;public void setSon(Son son) {<br />
&nbsp;&nbsp;this.son = son;<br />
&nbsp;}</p>
<p>&nbsp;public int getAge() {<br />
&nbsp;&nbsp;return age;<br />
&nbsp;}</p>
<p>&nbsp;public Son getSon() {<br />
&nbsp;&nbsp;return son;<br />
&nbsp;}<br />
&nbsp;<br />
}<br />
-----------------------------------------------------------------------------------------<br />
</p>
<p>package org.viking.spring.imp;</p>
<p>public class Son <br />
{<br />
&nbsp;private int age;</p>
<p>&nbsp;public void setAge(int age) {<br />
&nbsp;&nbsp;this.age = age;<br />
&nbsp;}</p>
<p>&nbsp;public int getAge() {<br />
&nbsp;&nbsp;return age;<br />
&nbsp;}<br />
}<br />
-----------------------------------------------------------------------------------------<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans<br />
&nbsp;xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&gt;<br />
&nbsp;&lt;bean id="person" class="org.viking.spring.imp.Person" scope="prototype"&gt;<br />
&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;30&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="son"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean class="org.viking.spring.imp.Son"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;11&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="son2" class="org.viking.spring.imp.Son"&gt;<br />
&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean id="person.son.age" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"&gt; <br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;</p>
&lt;/beans&gt;<br />
-----------------------------------------------------------------------------------------<br />
<p>package org.viking.spring.test;</p>
<p>import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
import org.viking.spring.imp.Son;</p>
<p>import junit.framework.TestCase;</p>
<p>public class testInject extends TestCase <br />
{<br />
&nbsp;public void testInjectAttribute()<br />
&nbsp;{<br />
&nbsp;&nbsp;ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");<br />
&nbsp;&nbsp;System.out.println("son2的age属性值：" + ((Son)app.getBean("son2")).getAge());<br />
}<br />
}<br />
</p>
-----------------------------------------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个bean实例的属性值，不仅可以注入另一个bean,还可将bean实例的属性值直接定义成bean实例，也是通过PropertyPathFactoryBean完成的。对上面ApplicationContext.xml文件做下修改！<br />
-----------------------------------------------------------------------------------------<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans<br />
&nbsp;xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&gt;<br />
&nbsp;&lt;bean id="person" class="org.viking.spring.imp.Person" scope="prototype"&gt;<br />
&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;30&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="son"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean class="org.viking.spring.imp.Son"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;11&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="son2" class="org.viking.spring.imp.Son"&gt;<br />
&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean id="person.son.age" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"&gt; <br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="son1" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"&gt;<br />
&nbsp;&nbsp;&lt;property name="targetBeanName"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;person&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="propertyPath"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;son&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&lt;/beans&gt;<br />
-----------------------------------------------------------------------------------------<br />
<p>package org.viking.spring.test;</p>
<p>import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
import org.viking.spring.imp.Son;</p>
<p>import junit.framework.TestCase;</p>
<p>public class testInject extends TestCase <br />
{<br />
&nbsp;public void testInjectAttribute()<br />
&nbsp;{<br />
&nbsp;&nbsp;ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");<br />
&nbsp;&nbsp;System.out.println("son2的age属性值：" + ((Son)app.getBean("son2")).getAge());<br />
&nbsp;&nbsp;System.out.println("系统获取的SON1：" + app.getBean("son1"));</p>
}<br />
}<br />
-----------------------------------------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;使用PropertyPathFactoryBean必须指定以下两个属性。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.targetBeanName:用于指定目标bean,确定获取哪个bean的属性值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.propertyPath：用于指定属性，确定获取目标bean的哪个属性值，此处的属性可直接使用属性表达式。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以将基本数据类型的属性值定义成bean实例。在配置文件中再增加如下代码：<br />
-----------------------------------------------------------------------------------------<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans<br />
&nbsp;xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&gt;<br />
&nbsp;&lt;bean id="person" class="org.viking.spring.imp.Person" scope="prototype"&gt;<br />
&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;30&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="son"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean class="org.viking.spring.imp.Son"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;11&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="son2" class="org.viking.spring.imp.Son"&gt;<br />
&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean id="person.son.age" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"&gt; <br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="son1" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"&gt;<br />
&nbsp;&nbsp;&lt;property name="targetBeanName"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;person&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="propertyPath"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;son&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="theAge" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"&gt;<br />
&nbsp;&nbsp;&lt;property name="targetBeanName"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;person&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="propertyPath"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;son.age&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&lt;/beans&gt;<br />
-----------------------------------------------------------------------------------------<br />
<p>package org.viking.spring.test;</p>
<p>import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
import org.viking.spring.imp.Son;</p>
<p>import junit.framework.TestCase;</p>
<p>public class testInject extends TestCase <br />
{<br />
&nbsp;public void testInjectAttribute()<br />
&nbsp;{<br />
&nbsp;&nbsp;ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");<br />
&nbsp;&nbsp;System.out.println("son2的age属性值：" + ((Son)app.getBean("son2")).getAge());<br />
&nbsp;&nbsp;System.out.println("系统获取的SON1：" + app.getBean("son1"));<br />
&nbsp;&nbsp;System.out.println("系统获取的theAge的值：" + app.getBean("theAge"));</p>
}<br />
}<br />
-----------------------------------------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;目标bean既可以是容器中已有的bean实例，也可以是嵌套bean实例。<br />
-----------------------------------------------------------------------------------------<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans<br />
&nbsp;xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&gt;<br />
&nbsp;&lt;bean id="person" class="org.viking.spring.imp.Person" scope="prototype"&gt;<br />
&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;30&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="son"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean class="org.viking.spring.imp.Son"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;11&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="son2" class="org.viking.spring.imp.Son"&gt;<br />
&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean id="person.son.age" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"&gt; <br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="son1" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"&gt;<br />
&nbsp;&nbsp;&lt;property name="targetBeanName"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;person&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="propertyPath"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;son&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="theAge" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"&gt;<br />
&nbsp;&nbsp;&lt;property name="targetBeanName"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;person&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="propertyPath"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;son.age&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="theAge2" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"&gt;<br />
&nbsp;&nbsp;&lt;property name="targetObject"&gt;&lt;!-- 要注意，这里不是targetBeanName了噢！ --&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;bean class="org.viking.spring.imp.Person"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="age"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;12&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="propertyPath"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;age&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&lt;/beans&gt;<br />
-----------------------------------------------------------------------------------------<br />
<p>package org.viking.spring.test;</p>
<p>import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
import org.viking.spring.imp.Son;</p>
<p>import junit.framework.TestCase;</p>
<p>public class testInject extends TestCase <br />
{<br />
&nbsp;public void testInjectAttribute()<br />
&nbsp;{<br />
&nbsp;&nbsp;ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");<br />
&nbsp;&nbsp;System.out.println("son2的age属性值：" + ((Son)app.getBean("son2")).getAge());<br />
&nbsp;&nbsp;System.out.println("系统获取的SON1：" + app.getBean("son1"));<br />
&nbsp;&nbsp;System.out.println("系统获取的theAge的值：" + app.getBean("theAge"));<br />
&nbsp;&nbsp;System.out.println("系统获取的theAge2的值：" + app.getBean("theAge2"));<br />
&nbsp;}<br />
}<br />
-----------------------------------------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意上面配置文件，定义嵌套bean实例时采用的时targetObject，而不时targetBeanName，如果这填错了，可是要报异常的噢！<br />
<br />
<br />
-------以上的文字以及代码摘录于李刚写的《轻量级J2EE开发企业应用实战》，代码有少许变动！ </p>
<img src ="http://www.blogjava.net/viking/aggbug/213457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viking/" target="_blank">viking</a> 2008-07-08 22:59 <a href="http://www.blogjava.net/viking/archive/2008/07/08/213457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring依赖关系配置</title><link>http://www.blogjava.net/viking/archive/2008/07/07/213183.html</link><dc:creator>viking</dc:creator><author>viking</author><pubDate>Mon, 07 Jul 2008 15:43:00 GMT</pubDate><guid>http://www.blogjava.net/viking/archive/2008/07/07/213183.html</guid><wfw:comment>http://www.blogjava.net/viking/comments/213183.html</wfw:comment><comments>http://www.blogjava.net/viking/archive/2008/07/07/213183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/viking/comments/commentRss/213183.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viking/services/trackbacks/213183.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 依赖注入--如果A依赖于B，则B实例不再由A负责生成，而有容器负责生成，并注入给A实例，因此称为依赖注入，也称为控制反转。<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 配置依赖<br />
&nbsp;&nbsp;&nbsp;&nbsp; 根据注入方式的不同，bean的依赖注入通常表现为如下两种形式：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1，属性：通过property属性来指定对应的设值注入。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2，构造器参数：通过constructor-arg属性来指定对应的构造注入。<br />
&nbsp;&nbsp; 在Spring在实例化BeanFactory时，通常会校验BeanFactory中的每一个Bean的配置。这些校验包括：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.bean引用的合作者指向一个合法的bean.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.对于被设置为pre-instantiated的bean的singleton行为，Spring会在创建BeanFactory时，同时实例化bean.实例化bean时，也会将它所依赖的bean一起实例化。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此外，BeanFactory与ApplicationContext实例化容器中的bean的时机不同：前者在程序需要bean实例时才创建Bean;而后者在加载ApplicationContext实例时，会自动实例化容器中的全部bean.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext是默认预实例化singleton bean。ApplicationContext实例化过程比BeanFactory时间和内存占用率大，但可以在ApplicationContext创建时就检验出配置错误。当然可以通过lazy-load属性为&#8220;true&#8221;来改变ApplicationContext的默认行为！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean的依赖通常可以接受如下元素指定值：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.value.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.ref.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.bean.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.list.set.map.以及props.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;首先来看看value元素。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value元素用于确定字符串参数。XML文档解析器解析以String解析出这些数据，然后将这些参数由PropertyEditors完成转换（从java.lang.String类型转换为所需的参数类型）。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for example:<br />
-------------------------------------------------------------------------------------------<br />
<p>package org.viking.spring.itf;</p>
<p>public interface ValueElementItf <br />
{<br />
&nbsp;public void shows();<br />
}<br />
</p>
-------------------------------------------------------------------------------------------<br />
<p>package org.viking.spring.imp;</p>
<p>import org.viking.spring.itf.ValueElementItf;</p>
<p>public class ValueElement implements ValueElementItf {</p>
<p>&nbsp;private int integerProperty;<br />
&nbsp;<br />
&nbsp;private double doubleProperty;<br />
&nbsp;<br />
&nbsp;private String email;<br />
&nbsp;<br />
&nbsp;public void shows() <br />
&nbsp;{<br />
&nbsp;&nbsp;System.out.println(integerProperty);<br />
&nbsp;&nbsp;System.out.println(doubleProperty);<br />
&nbsp;&nbsp;System.out.println(email);<br />
&nbsp;}</p>
<p>&nbsp;public void setIntegerProperty(int integerProperty) {<br />
&nbsp;&nbsp;this.integerProperty = integerProperty;<br />
&nbsp;}</p>
<p>&nbsp;public void setDoubleProperty(double doubleProperty) {<br />
&nbsp;&nbsp;this.doubleProperty = doubleProperty;<br />
&nbsp;}</p>
<p>&nbsp;public void setEmail(String email) {<br />
&nbsp;&nbsp;this.email = email;<br />
&nbsp;}</p>
<p>&nbsp;</p>
<p>}<br />
</p>
-------------------------------------------------------------------------------------------<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans<br />
&nbsp;xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="value" class="org.viking.spring.imp.ValueElement"&gt;<br />
&nbsp;&nbsp;&lt;property name="integerProperty"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;1&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="doubleProperty"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;2.3&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&lt;/beans&gt;<br />
-------------------------------------------------------------------------------------------<br />
&nbsp;
<p>package org.viking.spring.test;</p>
<p>import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
import org.viking.spring.itf.Person;<br />
import org.viking.spring.itf.ValueElementItf;</p>
<p>import junit.framework.TestCase;</p>
<p>public class TestElement extends TestCase <br />
{<br />
&nbsp;public void testValueElement()<br />
&nbsp;{<br />
&nbsp;&nbsp;ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");<br />
&nbsp;&nbsp;ValueElementItf value = (ValueElementItf)app.getBean("value");<br />
&nbsp;&nbsp;value.shows();<br />
&nbsp;}</p>
}<br />
-------------------------------------------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;value元素的值可以通过&lt;null/&gt;元素指定为空。<br />
&nbsp;&nbsp;&nbsp;&nbsp;把上面的applicationContext.xml文件代码改一下。<br />
-------------------------------------------------------------------------------------------<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans<br />
&nbsp;xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="value" class="org.viking.spring.imp.ValueElement"&gt;<br />
&nbsp;&nbsp;&lt;property name="integerProperty"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;1&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="doubleProperty"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;2.3&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="email"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&lt;/beans&gt;<br />
-------------------------------------------------------------------------------------------<br />
改过之后的测试打印出了Null.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接着是ref元素<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果需要为bean注入的属性是容器中的某个bean实例，推荐使用ref。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ref元素通常有两个属性：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.local<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean用于指定在不同一个xml配置文件中的bean,而local用于指定同一个xml配置文件中的其他bean,并且local属性值只能是其他bean的id属性，让Spring在解析XML时，验证bean的名称。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean元素<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果某个bean的依赖bean不想被Spring容器直接访问，则可以使用嵌套bean。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;嵌套bean只对嵌套它的外部bean有效，而Spring容器无法直接访问嵌套bean，因此嵌套bean无需id属性。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;嵌套bean的配置形式，保证嵌套bean不能被容器访问，提高了程序的内聚性。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;嵌套bean的例子会在下一个元素讲解中使用到！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list，set，map，以及props元素<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list,set,map和props元素分别用来设置类型为List,Set,Map和Properties的属性值，用来为bean注入集合值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for example：<br />
-------------------------------------------------------------------------------------------<br />
<p>package org.viking.spring.itf;</p>
<p>public interface Person <br />
{<br />
&nbsp;public void shows();<br />
}<br />
-------------------------------------------------------------------------------------------</p>
<p>package org.viking.spring.imp;</p>
<p>import java.util.ArrayList;<br />
import java.util.HashMap;<br />
import java.util.HashSet;<br />
import java.util.List;<br />
import java.util.Map;<br />
import java.util.Properties;<br />
import java.util.Set;</p>
<p>import org.viking.spring.itf.Person;</p>
<p>public class Chinese implements Person <br />
{</p>
<p>&nbsp;private List&nbsp; schools = new ArrayList();<br />
&nbsp;<br />
&nbsp;private Map score = new HashMap();<br />
&nbsp;<br />
&nbsp;private Properties&nbsp; health = new Properties();<br />
&nbsp;<br />
&nbsp;private Set axes = new HashSet();<br />
&nbsp;<br />
&nbsp;public void shows() <br />
&nbsp;{<br />
&nbsp;&nbsp;System.out.println(schools);<br />
&nbsp;&nbsp;System.out.println(score);<br />
&nbsp;&nbsp;System.out.println(health);<br />
&nbsp;&nbsp;System.out.println(axes);<br />
&nbsp;}</p>
<p>&nbsp;public void setSchools(List schools) {<br />
&nbsp;&nbsp;this.schools = schools;<br />
&nbsp;}</p>
<p>&nbsp;public void setScore(Map score) {<br />
&nbsp;&nbsp;this.score = score;<br />
&nbsp;}</p>
<p>&nbsp;public void setHealth(Properties health) {<br />
&nbsp;&nbsp;this.health = health;<br />
&nbsp;}</p>
<p>&nbsp;public void setAxes(Set axes) {<br />
&nbsp;&nbsp;this.axes = axes;<br />
&nbsp;}</p>
<p>}<br />
-------------------------------------------------------------------------------------------<br />
package org.viking.spring.imp;<br />
public class ValueElement<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;public ValueElement()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("嵌套bean的测试！");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
-------------------------------------------------------------------------------------------<br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans<br />
&nbsp;xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&gt;<br />
</p>
<p>&lt;bean id="chinese" class="org.viking.spring.imp.Chinese"&gt;<br />
&nbsp;&nbsp;&lt;property name="schools"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;小学&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;中学&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;大学&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="score"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;map&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;entry key="数学"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;87&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/entry&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;entry key="英语"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;89&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/entry&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;entry key="语文"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;82&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/entry&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/map&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="health"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="血压"&gt;正常&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="身高"&gt;175&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/props&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="axes"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;set&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;字符串斧子&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref local="value"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean class="org.viking.spring.imp.ValueElement"&gt;&lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--这就是嵌套bean--&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/set&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;</p>
<p>&lt;/beans&gt;</p>
-------------------------------------------------------------------------------------------<br />
<p>package org.viking.spring.test;</p>
<p>import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
import org.viking.spring.itf.Person;<br />
import org.viking.spring.itf.ValueElementItf;</p>
<p>import junit.framework.TestCase;</p>
<p>public class TestElement extends TestCase <br />
{</p>
public void testCollection()<br />
&nbsp;{<br />
&nbsp;&nbsp;ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");<br />
&nbsp;&nbsp;Person p1 =&nbsp; (Person)app.getBean("chinese");<br />
&nbsp;&nbsp;p1.shows();<br />
&nbsp;}<br />
}<br />
-------------------------------------------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;map元素entry的值以及set元素的值都可以使用如下元素：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.vlaue:确定基本数据类型值或字符串类型值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.ref:确定另外一个bean为属性值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.bean：确定一个嵌套bean为属性值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.list,set，map,以及props：确定集合值为属性值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;这么说可能有点抽象，大家运行一下以上代码，就一清二楚了！<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;在实际应用中，某个实例的属性可能是某个方法的返回值，类的field值，或者属性值。这种非常规的方法Spring同样支持！Spring甚至支持将bean实例的属性值，方法返回值及field值直接赋给一个变量。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好了，今天就到这，明天接着写注入属性值！<br />
<br />
-------以上的文字以及代码摘录于李刚写的《轻量级J2EE开发企业应用实战》，代码有少许变动！
<img src ="http://www.blogjava.net/viking/aggbug/213183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viking/" target="_blank">viking</a> 2008-07-07 23:43 <a href="http://www.blogjava.net/viking/archive/2008/07/07/213183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring创建bean实例</title><link>http://www.blogjava.net/viking/archive/2008/07/06/212923.html</link><dc:creator>viking</dc:creator><author>viking</author><pubDate>Sun, 06 Jul 2008 15:07:00 GMT</pubDate><guid>http://www.blogjava.net/viking/archive/2008/07/06/212923.html</guid><wfw:comment>http://www.blogjava.net/viking/comments/212923.html</wfw:comment><comments>http://www.blogjava.net/viking/archive/2008/07/06/212923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/viking/comments/commentRss/212923.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viking/services/trackbacks/212923.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;最近看的spring,不管内容多少，记下来吧！<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;创建bean通常有如下方法：<br />
&nbsp;&nbsp;&nbsp;&nbsp;1.调用构造器创建一个bean实例。<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.BeanFactory调用某个类的静态工厂方法创建bean.<br />
&nbsp;&nbsp;&nbsp;&nbsp;3.BeanFactory调用实例工厂方法创建bean.<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;先来说说---调用构造器创建一个bean实例。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过&#8220;new&#8221;关键字创建bean实例是最常见的情形，如果采用设值注入的方式，则要求该类提供无参数的构造器。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanFactory将调用该构造器来创建bean实例，该实例是个默认的实例。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接下来，BeanFactory会根据配置文件来决定依赖关系：首先实例化依赖的bean，然后为bean注入依赖关系；最后将一个完整的Bean实例返回给程序。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for example：<br />
<span style="font-size: 12pt">---------------------------------------------------------------------------------&nbsp;&nbsp;&nbsp;&nbsp;</span>
<p><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;package org.viking.spring.itf;</span></p>
<p><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public interface Person&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void useAxe();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></p>
<p><span style="font-size: 12pt">----------------------------------------------------------------------------------<br />
</span></p>
<p><span style="font-size: 12pt">package org.viking.spring.imp;</span></p>
<p><span style="font-size: 12pt">import org.viking.spring.itf.Axe;<br />
import org.viking.spring.itf.Person;</span></p>
<p><span style="font-size: 12pt">public class Chinese implements Person {</span></p>
<p><span style="font-size: 12pt">&nbsp;private Axe axe;<br />
&nbsp;<br />
&nbsp;public Chinese()<br />
&nbsp;{<br />
&nbsp;&nbsp;System.out.println("Spring 实例化主调bean: chinese实例....");<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void useAxe() <br />
&nbsp;{<br />
&nbsp;&nbsp;System.out.println(axe.chop());<br />
&nbsp;}</span></p>
<p><span style="font-size: 12pt">&nbsp;public void setAxe(Axe axe) <br />
&nbsp;{<br />
&nbsp;&nbsp;System.out.println("spring 执行依赖关系注入....");<br />
&nbsp;&nbsp;this.axe = axe;<br />
&nbsp;}</span></p>
<p><span style="font-size: 12pt">&nbsp;public Axe getAxe() {<br />
&nbsp;&nbsp;return axe;<br />
&nbsp;}</span></p>
<p><span style="font-size: 12pt">}<br />
----------------------------------------------------------------------------------</span></p>
<p><span style="font-size: 12pt">package org.viking.spring.itf;</span></p>
<p><span style="font-size: 12pt">public interface Axe <br />
{<br />
&nbsp;public String chop();<br />
}<br />
</span></p>
<p><span style="font-size: 12pt">----------------------------------------------------------------------------------<br />
</span></p>
<p><span style="font-size: 12pt">package org.viking.spring.imp;</span></p>
<p><span style="font-size: 12pt">import org.viking.spring.itf.Axe;</span></p>
<p><span style="font-size: 12pt">public class SteelAxe implements Axe {</span></p>
<p><span style="font-size: 12pt">&nbsp;public SteelAxe()<br />
&nbsp;{<br />
&nbsp;&nbsp;System.out.println("Spring 实例化依赖bean: SteelAxe实例...");<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public String chop() <br />
&nbsp;{<br />
&nbsp;&nbsp;return "钢斧砍材真快";<br />
&nbsp;}</span></p>
<p><span style="font-size: 12pt">}<br />
</span></p>
<p><span style="font-size: 12pt">----------------------------------------------------------------------------------<br />
applicationContext.xml:<br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;<br />
&lt;beans&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="chinese" class="org.viking.spring.imp.Chinese"&gt;<br />
&nbsp;&nbsp;&lt;property name="axe"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref local="steelAxe"/&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&lt;/beans&gt;<br />
----------------------------------------------------------------------------------<br />
</span></p>
<p><span style="font-size: 12pt">package org.viking.spring.test;</span></p>
<p><span style="font-size: 12pt">import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;<br />
import org.viking.spring.itf.Being;<br />
import org.viking.spring.itf.People;<br />
import org.viking.spring.itf.Person;</span></p>
<p><span style="font-size: 12pt">import junit.framework.TestCase;</span></p>
<p><span style="font-size: 12pt">public class BeanTest extends TestCase <br />
{<br />
&nbsp;public void testNewBean()throws Exception<br />
&nbsp;{<br />
&nbsp;&nbsp;ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");<br />
&nbsp;&nbsp;System.out.println("程序已经实例化BeanFactory...");<br />
&nbsp;&nbsp;Person p = (Person)app.getBean("chinese");<br />
&nbsp;&nbsp;System.out.println("程序中已经完成了chinese bean 的实例化...");<br />
&nbsp;&nbsp;p.useAxe();<br />
&nbsp;}</span></p>
<span style="font-size: 12pt">}<br />
----------------------------------------------------------------------------------<br />
执行结果清楚地反应了执行过程：<br />
&nbsp;&nbsp;&nbsp;&nbsp;（1）创建BeanFactory实例。<br />
&nbsp;&nbsp;&nbsp;&nbsp;（2）调用Chinese类的默认构造器创建默认实例。<br />
&nbsp;&nbsp;&nbsp;&nbsp;（3）根据配置文件注入依赖关系：先实例化依赖bean,然后将依赖bean注入。<br />
&nbsp;&nbsp;&nbsp;&nbsp;（4）返回一个完整的javabean实例。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;接下来说说---使用静态工厂方法创建bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;反正这种方法，按书上我是没验证通过，去CSDN上求解，也毫无结果！但是还是写出来吧！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用静态工厂方法创建bean实例时，class属性也时必须的，但此时class属性并不是该实现类，而是静态工厂类。由于spring需要知道由哪个静态工厂方法来创建bean实例，因此使用factory-method属性来确定静态工厂方法名，在之后的过程中，spring的处理步骤与采用其他方法的创建完全一样。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意：这个Bean定义并没有指定返回对象的类型，只指定静态工厂类。该方法必须是静态的，如果静态工厂方法需要参数，则使用&lt;constructor-arg&gt;元素将其导入。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是书上的代码---我没成功！<br />
--------------------------------------------------------------------------------- <br />
package &nbsp; org.viking.spring.itf; <br />
<br />
public &nbsp; interface &nbsp; Being &nbsp; <br />
{ <br />
public &nbsp; void &nbsp; testBeing(); <br />
} <br />
----------------------------------------------------------------------------------- <br />
package &nbsp; org.viking.spring.imp; <br />
<br />
import &nbsp; org.viking.spring.itf.Being; <br />
<br />
public &nbsp; class &nbsp; Cat &nbsp; implements &nbsp; Being &nbsp; { <br />
<br />
private &nbsp; String &nbsp; msg; <br />
<br />
<br />
public &nbsp; void &nbsp; testBeing() &nbsp; <br />
{ <br />
System.out.println(msg &nbsp; + &nbsp; "猫爱吃鱼！ "); <br />
} <br />
<br />
<br />
public &nbsp; void &nbsp; setMsg(String &nbsp; msg) &nbsp; <br />
{ <br />
this.msg &nbsp; = &nbsp; msg; <br />
} <br />
<br />
} <br />
------------------------------------------------------------------------- <br />
package &nbsp; org.viking.spring.imp; <br />
<br />
import &nbsp; org.viking.spring.itf.Being; <br />
<br />
public &nbsp; class &nbsp; Dog &nbsp; implements &nbsp; Being &nbsp; { <br />
<br />
private &nbsp; String &nbsp; msg; <br />
<br />
public &nbsp; void &nbsp; setMsg(String &nbsp; msg) &nbsp; { <br />
this.msg &nbsp; = &nbsp; msg; <br />
} <br />
<br />
public &nbsp; void &nbsp; testBeing() <br />
{ <br />
System.out.println(msg &nbsp; + &nbsp; "狗爱啃骨头！ "); <br />
} <br />
<br />
} <br />
-------------------------------------------------------------- <br />
package &nbsp; org.viking.spring.factory; <br />
<br />
import &nbsp; org.viking.spring.imp.Cat; <br />
import &nbsp; org.viking.spring.imp.Dog; <br />
import &nbsp; org.viking.spring.itf.Being; <br />
<br />
public &nbsp; class &nbsp; BeingFactory <br />
{ <br />
public &nbsp; static &nbsp; Being &nbsp; getBeing(String &nbsp; arg) <br />
{ <br />
if(arg.equalsIgnoreCase( "dog ")) <br />
return &nbsp; new &nbsp; Dog(); <br />
else <br />
return &nbsp; new &nbsp; Cat(); <br />
} <br />
} <br />
----------------------------------------------------------- <br />
applicationContext.xml: <br />
<br />
&lt;?xml &nbsp; version= "1.0 " &nbsp; encoding= "UTF-8 "?&gt; <br />
&lt;!DOCTYPE &nbsp; beans &nbsp; PUBLIC &nbsp; "-//SPRING//DTD &nbsp; BEAN//EN " &nbsp; "http://www.springframework.org/dtd/spring-beans.dtd "&gt; <br />
&lt;beans&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;bean &nbsp; id= "dog " &nbsp; class= "org.viking.spring.factory.BeingFactory " &nbsp; factory-method= "getBeing "&gt; <br />
&lt;constructor-arg&gt; <br />
&lt;value&gt; dog &lt;/value&gt; <br />
&lt;/constructor-arg&gt; <br />
&lt;property &nbsp; name= "msg "&gt; <br />
&lt;value&gt; 我是狗 &lt;/value&gt; <br />
&lt;/property&gt; <br />
&lt;/bean&gt; <br />
<br />
&lt;bean &nbsp; id= "cat " &nbsp; class= "org.viking.spring.factory.BeingFactory " &nbsp; factory-method= "getBeing "&gt; <br />
&lt;constructor-arg&gt; <br />
&lt;value&gt; cat &lt;/value&gt; <br />
&lt;/constructor-arg&gt; <br />
&lt;property &nbsp; name= "msg "&gt; <br />
&lt;value&gt; 我是猫 &lt;/value&gt; <br />
&lt;/property&gt; <br />
&lt;/bean&gt; <br />
&lt;/beans&gt; <br />
--------------------------------------------------------------------------------------------------------- <br />
package &nbsp; org.viking.spring.test; <br />
<br />
import &nbsp; java.io.FileInputStream; <br />
import &nbsp; java.io.InputStream; <br />
<br />
import &nbsp; org.springframework.beans.factory.xml.XmlBeanFactory; <br />
import &nbsp; org.springframework.context.ApplicationContext; <br />
import &nbsp; org.springframework.context.support.ClassPathXmlApplicationContext; <br />
import &nbsp; org.springframework.core.io.InputStreamResource; <br />
import &nbsp; org.viking.spring.itf.Being; <br />
import &nbsp; org.viking.spring.itf.Person; <br />
<br />
import &nbsp; junit.framework.TestCase; <br />
<br />
public &nbsp; class &nbsp; BeanTest &nbsp; extends &nbsp; TestCase &nbsp; <br />
{ <br />
public &nbsp; void &nbsp; testStaticFactoryBean() <br />
{ <br />
ApplicationContext &nbsp; context= &nbsp; new &nbsp; ClassPathXmlApplicationContext( "applicationContext.xml "); <br />
System.out.println( "程序已经实例化BeanFactory... "); <br />
Being &nbsp; b1 &nbsp; = &nbsp; (Being)context.getBean( "dog "); <br />
b1.testBeing(); <br />
Being &nbsp; b2 &nbsp; = &nbsp; (Being)context.getBean( "cat "); <br />
b2.testBeing(); <br />
} <br />
} <br />
------------------------------------------------------------------------- <br />
吼吼，还请高手指点一下，看看上面的代码要怎么改？<br />
对了，是applicationContext.xml出现小红叉，提示：<br />
No setter found for property 'msg' in class 'org.viking.spring.factory.BeingFactory' <br />
<br />
好，来说说最后一种方式---调用实例工厂方法创建bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实例工厂方法必须提供工厂实例，因此必须在配置文件中配置工厂实例，而bean元素无需class属性。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;采用实例工厂方法创建bean的配置需要如下两个属性：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、factory-bean:该属性的值为工厂bean的id.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、factory-method:该方法负责生成bean实例。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for example:<br />
-----------------------------------------------------------------------------<br />
<p>package org.viking.spring.itf;</p>
<p>public interface People <br />
{<br />
&nbsp;public void sayHello();<br />
&nbsp;<br />
&nbsp;public void sayGoodBye();<br />
}<br />
</p>
-----------------------------------------------------------------------------<br />
<p>package org.viking.spring.imp;</p>
<p>import org.viking.spring.itf.People;</p>
<p>public class AmericanPeople implements People {</p>
<p>&nbsp;private String name;<br />
&nbsp;<br />
&nbsp;public void sayGoodBye() <br />
&nbsp;{<br />
&nbsp;&nbsp;System.out.println(name + " , Hello!");<br />
&nbsp;}</p>
<p>&nbsp;public void sayHello() <br />
&nbsp;{<br />
&nbsp;&nbsp;System.out.println(name + ", GoodBye!");<br />
&nbsp;}</p>
<p>&nbsp;public void setName(String name) {<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;}</p>
<p>}<br />
</p>
-----------------------------------------------------------------------------<br />
<p>package org.viking.spring.imp;</p>
<p>import org.viking.spring.itf.People;</p>
<p>public class ChinesePeople implements People {<br />
&nbsp;<br />
&nbsp;private String name;<br />
&nbsp;<br />
&nbsp;public void sayGoodBye() <br />
&nbsp;{<br />
&nbsp;&nbsp;System.out.println(name + ",您好！");<br />
&nbsp;}</p>
<p>&nbsp;public void sayHello() <br />
&nbsp;{<br />
&nbsp;&nbsp;System.out.println(name + ",再见！");<br />
&nbsp;}</p>
<p>&nbsp;public void setName(String name) {<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;}</p>
<p>}<br />
</p>
<br />
-----------------------------------------------------------------------------<br />
<p>package org.viking.spring.factory;</p>
<p>import org.viking.spring.imp.AmericanPeople;<br />
import org.viking.spring.imp.ChinesePeople;<br />
import org.viking.spring.itf.People;</p>
<p>public class PeopleFactory <br />
{<br />
&nbsp;public People getPeople(String people)<br />
&nbsp;{<br />
&nbsp;&nbsp;if(people.equalsIgnoreCase("china"))<br />
&nbsp;&nbsp;&nbsp;return new ChinesePeople();<br />
&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;return new AmericanPeople();<br />
&nbsp;}<br />
}<br />
-----------------------------------------------------------------------------<br />
applicationContext.xml:</p>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;<br />
&lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&lt;bean id="peopleFactory" class="org.viking.spring.factory.PeopleFactory"&gt;&lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="getChinesePeople" factory-bean="peopleFactory" factory-method="getPeople"&gt;<br />
&nbsp;&nbsp;&lt;constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;china&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/constructor-arg&gt;<br />
&nbsp;&nbsp;&lt;property name="name"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;张三&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="getAmericanPeople" factory-bean="peopleFactory" factory-method="getPeople"&gt;<br />
&nbsp;&nbsp;&lt;constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;1&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/constructor-arg&gt;<br />
&nbsp;&nbsp;&lt;property name="name"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;sum&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&lt;/beans&gt;<br />
-----------------------------------------------------------------------------<br />
调用实例工厂方法创建bean，与调用静态工厂方法创建bean的用法基本相似。区别如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;1.调用实例工厂方法创建bean时，必须将实例工厂配置成bean实例。而静态工厂方法则无需配置工厂bean.<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.调用实例工厂方法创建bean时，必须使用factory-bean属性来确定工厂bean.而静态工厂方法则使用class元素确定静态工厂类。<br />
相同之处：<br />
&nbsp;&nbsp;&nbsp;&nbsp;1.都需要使用factory-method属性指定生产bean实例的工厂方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.工厂方法如果需要参数，都使用constructor-arg属性确定参数值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;3.其他依赖注入属性，都使用property元素确定参数值。<br />
<br />
<br />
-------以上的文字以及代码摘录于李刚写的《轻量级J2EE开发企业应用实战》，代码有少许变动！</span>
<img src ="http://www.blogjava.net/viking/aggbug/212923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viking/" target="_blank">viking</a> 2008-07-06 23:07 <a href="http://www.blogjava.net/viking/archive/2008/07/06/212923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Effective java 学习日记（1）</title><link>http://www.blogjava.net/viking/archive/2008/06/28/211269.html</link><dc:creator>viking</dc:creator><author>viking</author><pubDate>Fri, 27 Jun 2008 16:51:00 GMT</pubDate><guid>http://www.blogjava.net/viking/archive/2008/06/28/211269.html</guid><wfw:comment>http://www.blogjava.net/viking/comments/211269.html</wfw:comment><comments>http://www.blogjava.net/viking/archive/2008/06/28/211269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/viking/comments/commentRss/211269.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viking/services/trackbacks/211269.html</trackback:ping><description><![CDATA[<span style="font-size: 14pt">&nbsp;&nbsp; Effective java 这本书买了很久了，书上记载着2007年8月 1日购于深圳！一直都没静下心来看！放暑假了，本来打算在北京找份工作，可是只有短短的2个月时间，公司应该不会要！自己还是太天真了，当初为了暑假能找到一份工作，不停的学SSH，学了也有一段时间了，学到的无非也是怎么去使用！有前辈提示，学框架最主要是学它的思想！但是我发现自己学了SSH这3个框架，思想并没有掌握多少！总结了下原因，可能是因为学得太急了，不够深入！反正暑假找工作估计没什么希望了，索性好好在家学习，把基础打好！无意中翻到了Effective java这本书，好吧，就从它看起吧！<br />
&nbsp;&nbsp;&nbsp; 第1章是引言没什么好记的！就从第2章开始吧！<br />
&nbsp;&nbsp;&nbsp;&nbsp;第2章---创建和销毁对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本章的主题是创建和销毁对象：什么时候，如何创建对象；什么时候，如何避免创建对象；如何保证对象能够适时地销毁；对象销毁之前如何管理各种清理工作。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;第1条：考虑用静态工厂方法代替构造函数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于一个类，为了让客户获得它的一个实例，最常见的方法是提供一个公有的构造函数。实际上除了这种方法我们还可以通过提供一个公有的静态工厂方法（static factory method)来替代构造函数。这样做既有好处，也有不足之处。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好处：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.<span style="background-color: #ff00ff">与构造函数不同，静态工厂方法具有名字。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果一个构造函数的参数并没有确切地描述被返回的对象，那么选用适当名字的静态工厂可以使一个类更易于使用，并且相应的客户代码更易于阅读。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.<span style="background-color: #ffff00"><span style="background-color: #ff00ff">与构造函数不同，它们每次被调用的时候，不要求非得创建一个新的对象。<br />
<span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 静态工厂方法可以为重复的调用返回同一个对象，这也可以被用来控制&#8220;在某一时刻哪些实例应该存在&#8221;。这样做有两个理由。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第1，它使得一个类可以保证是一个singleton。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第2，它使非可变类可以保证&#8220;不会有两个相等的实例存在&#8221;，既当且仅当a==b的时候才有a.equals(b)为true.如果一个类保证了这一点，那么它的客户就可以用==操作符来代替equals(Object)方法，其结果是实质性的性能提高。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.<span style="background-color: #ff00ff">与构造函数不同，它们可以返回一个原返回类型的子类型对象。&nbsp;<br />
<span style="background-color: #ffffff">&nbsp; <br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;缺点：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.<span style="background-color: #ffff00">类如果不含公有的或者受保护的构造函数，就不能被子类化。<br />
<span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以使用复合结构，而不是继承。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.<span style="background-color: #ff0000"><span style="background-color: #ffff00">它们与其他的静态方法没有任何区别。<br />
</span><br />
</span></span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;静态工厂方法和公有的构造函数都有它们各自的用途，我们必须灵活运用！&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其实静态工厂方法也就是工厂模式！个人的理解！<br />
</span></span><br />
</span></span>
<img src ="http://www.blogjava.net/viking/aggbug/211269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viking/" target="_blank">viking</a> 2008-06-28 00:51 <a href="http://www.blogjava.net/viking/archive/2008/06/28/211269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>