﻿<?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-morcble的blog-文章分类-Spring</title><link>http://www.blogjava.net/fengliangjun/category/1647.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:34:56 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:34:56 GMT</pubDate><ttl>60</ttl><item><title>spring-framework-1.2.6-chapter11</title><link>http://www.blogjava.net/fengliangjun/articles/26110.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Fri, 30 Dec 2005 11:52:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/26110.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/26110.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/26110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/26110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/26110.html</trackback:ping><description><![CDATA[<P><FONT size=2>11.2. Using the JDBC Core classes to control basic JDBC<BR>processing and error handling</FONT></P>
<P><FONT size=2>11.2.1.<BR>创建数据源（数据源里隐藏了数据连接池）<BR>DriverManagerDataSource dataSource = new DriverManagerDataSource();<BR>dataSource.setDriverClassName( "org.hsqldb.jdbcDriver");<BR>dataSource.setUrl( "jdbc:hsqldb:hsql://localhost:");<BR>dataSource.setUsername( "sa");<BR>dataSource.setPassword( "");</FONT></P>
<P><BR><FONT size=2>11.2.3. SQLExceptionTranslator<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置JdbcTemplate及异常处理<BR>&nbsp;// create a JdbcTemplate and set data source<BR>&nbsp;JdbcTemplate jt = new JdbcTemplate();<BR>&nbsp;jt.setDataSource(dataSource);<BR>&nbsp;// create a custom translator and set the datasource for the default translation lookup<BR>&nbsp;MySQLErrorCodesTransalator tr = new MySQLErrorCodesTransalator();<BR>&nbsp;tr.setDataSource(dataSource);<BR>&nbsp;jt.setExceptionTranslator(tr);<BR>&nbsp;// use the JdbcTemplate for this SqlUpdate<BR>&nbsp;SqlUpdate su = new SqlUpdate();<BR>&nbsp;su.setJdbcTemplate(jt);<BR>&nbsp;su.setSql("update orders set shipping_charge = shipping_charge * 1.05");<BR>&nbsp;su.compile();<BR>&nbsp;su.update();</FONT></P>
<P><FONT size=2>11.2.4 简单的调用配置好了的JdbcTemplate就可以执行SQL语句 如下</FONT></P>
<P><FONT size=2>&nbsp;import javax.sql.DataSource;<BR>&nbsp;import org.springframework.jdbc.core.JdbcTemplate;<BR>&nbsp;public class ExecuteAStatement {<BR>&nbsp;&nbsp;private JdbcTemplate jt;<BR>&nbsp;&nbsp;private DataSource dataSource;<BR>&nbsp;&nbsp;public void doExecute() {<BR>&nbsp;&nbsp;&nbsp;jt = new JdbcTemplate(dataSource);<BR>&nbsp;&nbsp;&nbsp;jt.execute("create table mytable (id integer, name varchar(100))");<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;public void setDataSource(DataSource dataSource) {<BR>&nbsp;&nbsp;&nbsp;this.dataSource = dataSource;<BR>&nbsp;&nbsp;}<BR>&nbsp;}</FONT></P>
<P><FONT size=2>11.2.5. 执行查询语句<BR>import javax.sql.DataSource;<BR>import org.springframework.jdbc.core.JdbcTemplate;<BR>&nbsp;public class RunAQuery {<BR>&nbsp;&nbsp; private JdbcTemplate jt;<BR>&nbsp;&nbsp; private DataSource dataSource;<BR>&nbsp;&nbsp; public int getCount() {<BR>&nbsp;&nbsp;jt = new JdbcTemplate(dataSource);<BR>&nbsp;&nbsp;int count = jt.queryForInt("select count(*) from mytable");<BR>&nbsp;&nbsp;return count;<BR>&nbsp; }<BR>&nbsp;<BR>&nbsp;public String getName() {<BR>&nbsp;&nbsp; jt = new JdbcTemplate(dataSource);<BR>&nbsp;&nbsp; String name = (String) jt.queryForObject("select name from mytable", String.class);<BR>&nbsp;&nbsp; （注：如果更新语句就书写jt.update("update mytable set name = ? where id = ?", new Object[] {name, new Integer(id)});）<BR>&nbsp;&nbsp; return name;<BR>&nbsp; }①</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public List getList() {<BR>&nbsp;&nbsp; jt = new JdbcTemplate(dataSource);<BR>&nbsp;&nbsp; List rows = jt.queryForList("select * from mytable");<BR>&nbsp;&nbsp; return rows;<BR>&nbsp;}②&nbsp;&nbsp; （①②取其一）<BR>&nbsp;<BR>&nbsp;public void setDataSource(DataSource dataSource) {<BR>&nbsp; this.dataSource = dataSource;<BR>&nbsp; }<BR>}</FONT></P><img src ="http://www.blogjava.net/fengliangjun/aggbug/26110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2005-12-30 19:52 <a href="http://www.blogjava.net/fengliangjun/articles/26110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring-framework-1.2.6-chapter8</title><link>http://www.blogjava.net/fengliangjun/articles/26109.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Fri, 30 Dec 2005 11:49:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/26109.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/26109.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/26109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/26109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/26109.html</trackback:ping><description><![CDATA[<P><FONT size=2>8.2. Transaction strategies<BR>1。使用SPRING平台事务管理器</FONT></P>
<P><FONT size=2>&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<BR>&lt;property name="driverClassName" value="${jdbc.driverClassName}"/&gt;<BR>&lt;property name="url" value="${jdbc.url}"/&gt;<BR>&lt;property name="username" value="${jdbc.username}"/&gt;<BR>&lt;property name="password" value="${jdbc.password}"/&gt;<BR>&lt;/bean&gt;<BR>The PlatformTransactionManager definition will look like this:<BR>&lt;bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<BR>&lt;property name="dataSource" ref="dataSource"/&gt;<BR>&lt;/bean&gt;</FONT></P>
<P><FONT size=2>使用JTA事务管理器<BR>If we use JTA, as in the dataAccessContext-jta.xml file from the same sample application, we need to use a<BR>container DataSource, obtained via JNDI, and a JtaTransactionManager implementation. The<BR>JtaTransactionManager doesn't need to know about the DataSource, or any other specific resources, as it will<BR>use the container's global transaction management.</FONT></P>
<P><FONT size=2>&lt;bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"&gt;<BR>&lt;property name="jndiName" value="jdbc/jpetstore"/&gt;&gt;<BR>&lt;/bean&gt;<BR>&lt;bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"/&gt;</FONT></P>
<P><FONT size=2>以上两种方法实现的功能是等效的。</FONT></P>
<P><FONT size=2>2。把hibernate和spring结合起来<BR>&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;property name="dataSource" ref="dataSource"/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;property name="mappingResources"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;org/springframework/samples/petclinic/hibernate/petclinic.hbm.xml&lt;/value&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/property&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;property name="hibernateProperties"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;props&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.dialect"&gt;${hibernate.dialect}&lt;/prop&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/props&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/property&gt;<BR>&lt;/bean&gt;<BR>&lt;bean id="txManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"&gt;①（局部事务）<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory" ref="sessionFactory"/&gt;<BR>&lt;/bean&gt;</FONT></P>
<P><BR><FONT size=2>①处With Hibernate and JTA transactions we could simply use the JtaTransactionManager as with JDBC or any<BR>other resource strategy.<BR>&lt;bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"/&gt;（JTA为全局事务）</FONT></P>
<P><BR><FONT size=2>声明式事务管理<BR>&lt;!-- this example is in verbose form, see note later about concise for multiple proxies! --&gt;<BR>&lt;!-- the target bean to wrap transactionally --&gt;<BR>&lt;bean id="petStoreTarget"&gt;<BR>&nbsp;...<BR>&lt;/bean&gt;<BR>&lt;bean id="petStore" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<BR>&nbsp;&lt;property name="transactionManager" ref="txManager"/&gt;<BR>&nbsp;&lt;property name="target" ref="petStoreTarget"/&gt;<BR>&nbsp;&lt;property name="transactionAttributes"&gt;<BR>&nbsp;&nbsp; &lt;props&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="insert*"&gt;PROPAGATION_REQUIRED,-MyCheckedException&lt;/prop&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="update*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<BR>&nbsp;&nbsp; &lt;/props&gt;<BR>&nbsp;&lt;/property&gt;<BR>&lt;/bean&gt;</FONT></P><img src ="http://www.blogjava.net/fengliangjun/aggbug/26109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2005-12-30 19:49 <a href="http://www.blogjava.net/fengliangjun/articles/26109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring-framework-1.2.6-chapter3</title><link>http://www.blogjava.net/fengliangjun/articles/25774.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Wed, 28 Dec 2005 11:38:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/25774.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/25774.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/25774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/25774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/25774.html</trackback:ping><description><![CDATA[<P><FONT size=2>最基础的包中有两个是org.springframework.beans 和org.springframework.context .这两个包提供了spring依赖注射功能的基础。<BR>BeanFactory提供了高级的配置机制用于管理beans。<BR>ApplicationContext接口建立在BeanFactory接口之上（BeanFactory的子类），又添加了其它的功能，比如：更容易与Spring AOP功能结合，信息资源处理，事件传播，建立ApplicationContext和父Contexts的机制，应用层特殊的context（如WebApplicationContext）。<BR>ApplicationContext是BeanFactory的扩展，所有BeanFactory的功能都能在ApplicationContext中实现。在建立的项目处于j2ee环境的时候最好选择ApplicationContext；当你对内存的占有很关心的时候（如一个applet会关心每KB大小）可以选择BeanFactory（占内存少）。<BR>BeanFactory 是为了访问Spring bean container，可以把它看成事实上的container.一般简单的BeanFactory的实现是org.springframework.beans.factory.xml.XmlBeanFactory。<BR>创建 BeanFatory的3个办法如下&nbsp; <BR>1。Resource res = new FileSystemResource("beans.xml");<BR>&nbsp;&nbsp; XmlBeanFactory factory = new XmlBeanFactory(res);<BR>2。ClassPathResource res = new ClassPathResource("beans.xml");<BR>&nbsp;&nbsp; XmlBeanFactory factory = new XmlBeanFactory(res);<BR>3。ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml", "applicationContext-part2.xml"});<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // of course, an ApplicationContext is just a BeanFactory<BR>&nbsp;&nbsp; BeanFactory factory = (BeanFactory) appContext;<BR>&nbsp;&nbsp; （注：public interface Resourceextends InputStreamSource，<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface InputStreamSource）<BR>多数用法中，用户不需要编写代码初始化BeanFactory 或 ApplicationContext，因为Spring框架会自动完成。例如：在web层提供了代码自动装载<BR>ApplicationContext，作为正常的j2eeWEB应用程序开始的一部分。<BR>&nbsp;</FONT></P>
<P><FONT size=2>&nbsp;配置bean的XML几种格式如下：<BR>&nbsp;(1)。通过构造函数创建bean，bean可以是javabean 也可以不是，也不用实现别的接口。<BR>&nbsp;&nbsp;&nbsp; &lt;bean id="exampleBean" class="examples.ExampleBean"/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;bean name="anotherExample" class="examples.ExampleBeanTwo"/&gt;<BR>&nbsp;&nbsp;&nbsp; 如果你需要实现IOC机制，你的bean需要一个默认的空参数构造函数。<BR>&nbsp;(2)。通过静态工厂函数创建bean.<BR>&nbsp;&nbsp; &lt;bean id="exampleBean" class="examples.ExampleBean2"<BR>&nbsp;&nbsp;&nbsp;&nbsp; factory-method="createInstance"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createInstance是examples.ExampleBean2的静态工厂方法，用于生成exampleBean。<BR>&nbsp;(3).通过实例工厂方法创建bean.<BR>&nbsp;&lt;!-- The factory bean, which contains a method called createInstance --&gt;<BR>&nbsp; &lt;bean id="myFactoryBean" class="..."&gt;<BR>&nbsp; ...<BR>&nbsp;&nbsp; &lt;/bean&gt;<BR>&nbsp;&nbsp; &lt;!-- The bean to be created via the factory bean --&gt;<BR>&nbsp; &lt;bean id="exampleBean" factory-bean="myFactoryBean" factory-method="createInstance"/&gt;</FONT></P>
<P><BR><FONT size=2>To singleton or not to singleton<BR>&lt;bean id="exampleBean"<BR>class="examples.ExampleBean" singleton="false"/&gt;<BR>&lt;bean name="yetAnotherExample"<BR>class="examples.ExampleBeanTwo" singleton="true"/&gt;</FONT></P>
<P><BR><FONT size=2>几种依赖注射格式<BR>(1)setter注射</FONT></P>
<P><FONT size=2>&lt;bean id="exampleBean" class="examples.ExampleBean"&gt;<BR>&lt;property name="beanOne"&gt;&lt;ref bean="anotherExampleBean"/&gt;&lt;/property&gt;<BR>&lt;property name="beanTwo"&gt;&lt;ref bean="yetAnotherBean"/&gt;&lt;/property&gt;<BR>&lt;property name="integerProperty"&gt;&lt;value&gt;1&lt;/value&gt;&lt;/property&gt;<BR>&lt;/bean&gt;<BR>&lt;bean id="anotherExampleBean" class="examples.AnotherBean"/&gt;<BR>&lt;bean id="yetAnotherBean" class="examples.YetAnotherBean"/&gt;<BR>public class ExampleBean {<BR>private AnotherBean beanOne;<BR>private YetAnotherBean beanTwo;<BR>private int i;</FONT></P>
<P><FONT size=2>public void setBeanOne(AnotherBean beanOne) {<BR>this.beanOne = beanOne;<BR>}<BR>public void setBeanTwo(YetAnotherBean beanTwo) {<BR>this.beanTwo = beanTwo;<BR>}<BR>public void setIntegerProperty(int i) {<BR>this.i = i;<BR>}<BR>}</FONT></P>
<P><FONT size=2>(2)构造函数注射<BR>&lt;bean id="exampleBean" class="examples.ExampleBean"&gt;<BR>&lt;constructor-arg&gt;&lt;ref bean="anotherExampleBean"/&gt;&lt;/constructor-arg&gt;<BR>&lt;constructor-arg&gt;&lt;ref bean="yetAnotherBean"/&gt;&lt;/constructor-arg&gt;<BR>&lt;constructor-arg type="int"&gt;&lt;value&gt;1&lt;/value&gt;&lt;/constructor-arg&gt;<BR>&lt;/bean&gt;<BR>&lt;bean id="anotherExampleBean" class="examples.AnotherBean"/&gt;<BR>&lt;bean id="yetAnotherBean" class="examples.YetAnotherBean"/&gt;<BR>public class ExampleBean {<BR>private AnotherBean beanOne;<BR>private YetAnotherBean beanTwo;<BR>private int i;<BR>public ExampleBean(AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) {<BR>this.beanOne = anotherBean;<BR>this.beanTwo = yetAnotherBean;<BR>this.i = i;<BR>}<BR>}</FONT></P>
<P><FONT size=2>(3)静态工厂注射<BR>&lt;bean id="exampleBean" class="examples.ExampleBean" factory-method="createInstance"&gt;<BR>&lt;constructor-arg&gt;&lt;ref bean="anotherExampleBean"/&gt;&lt;/constructor-arg&gt;<BR>&lt;constructor-arg&gt;&lt;ref bean="yetAnotherBean"/&gt;&lt;/constructor-arg&gt;<BR>&lt;constructor-arg&gt;&lt;value&gt;1&lt;/value&gt;&lt;/constructor-arg&gt;<BR>&lt;/bean&gt;<BR>&lt;bean id="anotherExampleBean" class="examples.AnotherBean"/&gt;<BR>&lt;bean id="yetAnotherBean" class="examples.YetAnotherBean"/&gt;</FONT></P>
<P><FONT size=2>public class ExampleBean {<BR>&nbsp;...<BR>&nbsp;// a private constructor<BR>&nbsp;&nbsp; private ExampleBean(...) {<BR>&nbsp;&nbsp; ...<BR>&nbsp;&nbsp; }<BR>&nbsp;// a static factory method<BR>&nbsp;// the arguments to this method can be considered the dependencies of the bean that<BR>&nbsp;// is returned, regardless of how those arguments are actually used.<BR>&nbsp;&nbsp;&nbsp;&nbsp; public static ExampleBean createInstance(AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExampleBean eb = new ExampleBean(...);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // some other operations<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return eb;<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>}</FONT></P>
<P><BR><FONT size=2>构造函数配置的另一种格式<BR>&lt;bean id="exampleBean" class="examples.ExampleBean"&gt;<BR>&lt;constructor-arg index="0"&gt;&lt;value&gt;7500000&lt;/value&gt;&lt;/constructor-arg&gt;<BR>&lt;constructor-arg index="1"&gt;&lt;value&gt;42&lt;/value&gt;&lt;/constructor-arg&gt;<BR>&lt;/bean&gt;<BR>可以在配置文件中加入验证数据的类型 如下<BR>&lt;bean id="exampleBean" class="examples.ExampleBean"&gt;<BR>&lt;constructor-arg index="0" type="int"&gt;&lt;value&gt;7500000&lt;/value&gt;&lt;/constructor-arg&gt;<BR>&lt;constructor-arg index="1" type="java.lang.String"&gt;&lt;value&gt;42&lt;/value&gt;&lt;/constructor-arg&gt;<BR>&lt;/bean&gt;</FONT></P>
<P><FONT size=2>一般属性配置格式<BR>&lt;bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<BR>&lt;!-- results in a setDriverClassName(String) call --&gt;<BR>&nbsp; &lt;property name="driverClassName"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;<BR>&nbsp; &lt;/property&gt;<BR>&nbsp; &lt;property name="url"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;jdbc:mysql://localhost:3306/mydb&lt;/value&gt;<BR>&nbsp; &lt;/property&gt;<BR>&nbsp; &lt;property name="username"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;root&lt;/value&gt;<BR>&nbsp; &lt;/property&gt;<BR>&lt;/bean&gt;</FONT></P>
<P><FONT size=2>注意：&lt;value&gt;&lt;/value&gt; 默认为空字符串，</FONT></P>
<P><BR><FONT size=2>属性null的格式如下<BR>&lt;bean class="ExampleBean"&gt;<BR>&nbsp;&lt;property name="email"&gt;&lt;null/&gt;&lt;/property&gt;<BR>&lt;/bean&gt;</FONT></P>
<P><BR><FONT size=2>属性collection的格式如下<BR>&lt;bean id="moreComplexObject" class="example.ComplexObject"&gt;<BR>&lt;!-- results in a setPeople(java.util.Properties) call --&gt;<BR>&lt;property name="people"&gt;<BR>&nbsp;&nbsp; &lt;props&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="HarryPotter"&gt;The magic property&lt;/prop&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="JerrySeinfeld"&gt;The funny property&lt;/prop&gt;<BR>&nbsp;&nbsp; &lt;/props&gt;<BR>&lt;/property&gt;<BR>&lt;!-- results in a setSomeList(java.util.List) call --&gt;<BR>&lt;property name="someList"&gt;<BR>&nbsp;&nbsp; &lt;list&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;a list element followed by a reference&lt;/value&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="myDataSource"/&gt;<BR>&nbsp;&nbsp; &lt;/list&gt;<BR>&lt;/property&gt;<BR>&lt;!-- results in a setSomeMap(java.util.Map) call --&gt;<BR>&lt;property name="someMap"&gt;<BR>&nbsp;&nbsp; &lt;map&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;entry&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key&gt;&lt;value&gt;yup an entry&lt;/value&gt;&lt;/key&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;just some string&lt;/value&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/entry&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;entry&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key&gt;&lt;value&gt;yup a ref&lt;/value&gt;&lt;/key&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="myDataSource"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/entry&gt;<BR>&nbsp; &lt;/map&gt;<BR>&lt;/property&gt;<BR>&lt;!-- results in a setSomeSet(java.util.Set) call --&gt;<BR>&nbsp;&lt;property name="someSet"&gt;<BR>&nbsp;&nbsp; &lt;set&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;just some string&lt;/value&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="myDataSource"/&gt;<BR>&nbsp;&nbsp; &lt;/set&gt;<BR>&nbsp;&lt;/property&gt;<BR>&lt;/bean&gt;</FONT></P>
<P><FONT size=2>3.3.3.4. Inner bean definitions via nested bean elements<BR>&lt;bean id="outer" class="..."&gt;<BR>&lt;!-- Instead of using a reference to target, just use an inner bean --&gt;<BR>&nbsp;&nbsp; &lt;property name="target"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class="com.mycompany.PersonImpl"&gt;//嵌套的bean不需要id<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="name"&gt;&lt;value&gt;Tony&lt;/value&gt;&lt;/property&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="age"&gt;&lt;value&gt;51&lt;/value&gt;&lt;/property&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<BR>&nbsp;&nbsp; &lt;/property&gt;<BR>&lt;/bean&gt;</FONT></P>
<P><FONT size=2>复合属性定义<BR>&lt;bean id="foo" class="foo.Bar"&gt;<BR>&lt;property name="fred.bob.sammy" value="123"/&gt; 属性fred下有属性bob,bob属性下有sammy 把sammy置为123。<BR>&lt;/bean&gt;</FONT></P>
<P><FONT size=2>3.3.4. Method Injection（方法注射）<BR>&lt;!-- a stateful bean deployed as a prototype (non-singleton) --&gt;<BR>&lt;bean id="singleShotHelper class="..." singleton="false"&gt;<BR>&lt;/bean&gt;<BR>&lt;!-- myBean uses singleShotHelper --&gt;<BR>&lt;bean id="myBean" class="..."&gt;<BR>&nbsp;&nbsp; &lt;lookup-method name="createSingleShotHelper" bean="singleShotHelper"/&gt;<BR>&nbsp;&nbsp; &lt;property&gt;<BR>&nbsp;&nbsp; ...<BR>&nbsp;&nbsp; &lt;/property&gt;<BR>&lt;/bean&gt;<BR>我的理解：myBean 中必须实现 protected [abstract] SingleShotHelper createSingleShotHelper();<BR>singleShotHelper中必须实现 protected&nbsp; SingleShotHelper createSingleShotHelper();<BR>运行时&nbsp; singleShotHelper的createSingleShotHelper会覆盖myBean的createSingleShotHelper。//未验证</FONT></P>
<P><FONT size=2>3.3.4.2. Arbitrary method replacement（任意的方法替换）<BR>public class MyValueCalculator {<BR>&nbsp;&nbsp;&nbsp;&nbsp; public String computeValue(String input) {<BR>&nbsp;&nbsp;&nbsp;&nbsp; ... some real code<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; ... some other methods<BR>&nbsp; }</FONT></P>
<P><FONT size=2>进行替换的类必须实现接口org.springframework.beans.factory.support.MethodReplacer<BR>public class ReplacementComputeValue implements MethodReplacer {<BR>&nbsp;&nbsp; public Object reimplement(Object o, Method m, Object[] args) throws Throwable {<BR>&nbsp; // get the input value, work with it, and return a computed result<BR>&nbsp;&nbsp; String input = (String) args[0];<BR>&nbsp;&nbsp; ...<BR>&nbsp;&nbsp; return ...;<BR>&nbsp; }<BR>}</FONT></P>
<P><FONT size=2>&lt;bean id="myValueCalculator class="x.y.z.MyValueCalculator"&gt;<BR>&lt;!-- arbitrary method replacement --&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;replaced-method name="computeValue" replacer="replacementComputeValue"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg-type&gt;String&lt;/arg-type&gt;&nbsp;&nbsp;&nbsp;&nbsp; 这里表示方法接受的参数，有几个列几个。<BR>&nbsp;&nbsp;&nbsp; &lt;/replaced-method&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样myValueCalculator中的computeValue方法就被替换了<BR>&lt;/bean&gt;<BR>&lt;bean id="replacementComputeValue" class="a.b.c.ReplaceMentComputeValue"/&gt;</FONT></P>
<P><BR><FONT size=2>3.4.1生命周期<BR>&lt;bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/&gt;<BR>public class ExampleBean {<BR>&nbsp;&nbsp; public void init() {<BR>&nbsp;&nbsp;&nbsp; // do some initialization work<BR>&nbsp;&nbsp; }<BR>}<BR>Is exactly the same as:<BR>&lt;bean id="exampleInitBean" class="examples.AnotherExampleBean"/&gt;<BR>&nbsp; public class AnotherExampleBean implements InitializingBean {<BR>&nbsp; public void afterPropertiesSet() {<BR>&nbsp; // do some initialization work<BR>&nbsp; }<BR>}</FONT></P>
<P><BR><FONT size=2>&lt;bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/&gt;<BR>public class ExampleBean {<BR>&nbsp;&nbsp;&nbsp; public void cleanup() {<BR>&nbsp;&nbsp; // do some destruction work (like closing connection)<BR>&nbsp;&nbsp; }<BR>}<BR>Is exactly the same as:<BR>&lt;bean id="exampleInitBean" class="examples.AnotherExampleBean"/&gt;<BR>&nbsp;&nbsp;&nbsp; public class AnotherExampleBean implements DisposableBean {<BR>&nbsp;&nbsp;&nbsp; public void destroy() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // do some destruction work<BR>&nbsp;&nbsp;&nbsp; }<BR>}</FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P><FONT size=2>===============================================<BR>3.7. 用BeanPostProcessors自定义beans<BR>&nbsp;&nbsp; ConfigurableBeanFactory bf = new .....; // create BeanFactory<BR>&nbsp;&nbsp;&nbsp; ... // now register some beans<BR>&nbsp;&nbsp; // now register any needed BeanPostProcessors<BR>&nbsp;&nbsp;&nbsp; MyBeanPostProcessor pp = new MyBeanPostProcessor();<BR>&nbsp;&nbsp; bf.addBeanPostProcessor(pp);<BR>&nbsp;&nbsp; // now start using the factory</FONT></P>
<P><FONT size=2>3.8. 用BeanFactoryPostProcessors 自定义bean factories<BR>&nbsp;&nbsp; XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml"));<BR>&nbsp;&nbsp;&nbsp;&nbsp; // create placeholderconfigurer to bring in some property<BR>&nbsp;&nbsp;&nbsp;&nbsp; // values from a Properties file<BR>&nbsp;&nbsp; PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();<BR>&nbsp;&nbsp; cfg.setLocation(new FileSystemResource("jdbc.properties"));<BR>&nbsp;&nbsp; // now actually do the replacement<BR>&nbsp;&nbsp; cfg.postProcessBeanFactory(factory);<BR>（也可以声明式定义<BR>&nbsp;&nbsp; &lt;!-- property placeholder post-processor --&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="placeholderConfig"&nbsp; class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="location" value="jdbc.properties"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<BR>）</FONT></P>
<P><FONT size=2>由上<BR>以下这个处于beanfactory容器里的数据源就按jdbc.properties里的配置了<BR>&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<BR>&nbsp; &lt;property name="driverClassName" value="${jdbc.driverClassName}"/&gt;<BR>&nbsp; &lt;property name="url" value="${jdbc.url}"/&gt;<BR>&nbsp; &lt;property name="username" value="${jdbc.username}"/&gt;<BR>&nbsp; &lt;property name="password" value="${jdbc.password}"/&gt;<BR>&lt;/bean&gt;</FONT></P>
<P><FONT size=2>其中jdbc.properties如下<BR>jdbc.driverClassName=org.hsqldb.jdbcDriver<BR>jdbc.url=jdbc:hsqldb:hsql://production:9002<BR>jdbc.username=sa<BR>jdbc.password=root</FONT></P>
<P><BR><FONT size=2>3.8.2. The PropertyOverrideConfigurer<BR><BR>3.19. Creating an ApplicationContext from a web application<BR>&lt;context-param&gt;<BR>&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<BR>&lt;param-value&gt;/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml&lt;/param-value&gt;<BR>&lt;/context-param&gt;<BR>&lt;listener&gt;<BR>&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<BR>&lt;/listener&gt;（the listener cannot be used in Servlet 2.2 compatible<BR>containers&nbsp; 但是在Servlet2.4后都普遍采用它）</FONT></P>
<P><FONT size=2>&lt;!-- OR USE THE CONTEXTLOADERSERVLET INSTEAD OF THE LISTENER<BR>&lt;servlet&gt;<BR>&lt;servlet-name&gt;context&lt;/servlet-name&gt;<BR>&lt;servlet-class&gt;org.springframework.web.context.ContextLoaderServlet&lt;/servlet-class&gt;<BR>&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<BR>&lt;/servlet&gt;<BR>--&gt;<BR></FONT></P><img src ="http://www.blogjava.net/fengliangjun/aggbug/25774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2005-12-28 19:38 <a href="http://www.blogjava.net/fengliangjun/articles/25774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring-framework-1.2.6-chapter1</title><link>http://www.blogjava.net/fengliangjun/articles/25691.html</link><dc:creator>morcble的blog</dc:creator><author>morcble的blog</author><pubDate>Wed, 28 Dec 2005 04:14:00 GMT</pubDate><guid>http://www.blogjava.net/fengliangjun/articles/25691.html</guid><wfw:comment>http://www.blogjava.net/fengliangjun/comments/25691.html</wfw:comment><comments>http://www.blogjava.net/fengliangjun/articles/25691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fengliangjun/comments/commentRss/25691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fengliangjun/services/trackbacks/25691.html</trackback:ping><description><![CDATA[<P><FONT size=2>spring 由7个模块组成。<BR>1。Core package 是spring框架最基础的包。它提供了依赖注射机制，让你能够通过调用函数管理bean容器。这里最基础的概念是BeanFactory（public interface BeanFactory），它可以通过工厂模式创建singletons，不再需要你自己编程实现；并且可以解耦你的实际程序的业务逻辑。<BR>2。Context package 提供了框架式访问beans的方法，类似JNDI-registry。它继承了Beans包的功能，并添加了支持文本信息的发送的功能，例如：资源捆绑，事件传播，资源装载和透明的上下文创建。具体应用实例如servlet容器。<BR>3。DAO package 提供了一个提取了jdbc的层，让你不必编写乏味的jdbc代码，不必考虑因不同数据库的代码差异而带来的错误。jdbc包（org.springframework.jdbc）提供了一个声明式（在xml配置文件中说明）的事务管理，不仅针对实现特定接口的类有用，而且对所有的POJOs (plain old java objects)。<BR>4。ORM package 针对目前流行的对象关系映射APIS提供了多个综合的层，其中包括了JDO,Hibernate和iBatis.使用这个包你可以把以上3个O/R-mappers结合Spring提供的所有功能，如前面提到的简单声明式的事务管理。<BR>5。AOP package 让你可以定义符合AOP联盟规范的（AOP规范组织）面向面编程的具体实现，如 方法拦截和切点，干净的给从逻辑说应该被分离的功能实现代码解耦。使用源码级的元数据功能，你可以把各种行为信息并入你的代码中。<BR>6。Web package 提供了基础的web功能，如multipart功能，使用servlet listeners初始化contexts。引导web的application context。在使用spring和WebWork或者Struts集成的时候需要整合这个包。<BR>7。Web MVC package 提供了针对web程序的MVC实现。它提供了一个清晰的model和web forms的分离，并允许你使用所有其它的spring框架的功能，如有效性验证（用户提交的信息正确与否的验证）。</FONT></P><img src ="http://www.blogjava.net/fengliangjun/aggbug/25691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fengliangjun/" target="_blank">morcble的blog</a> 2005-12-28 12:14 <a href="http://www.blogjava.net/fengliangjun/articles/25691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>