﻿<?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--随笔分类-spring</title><link>http://www.blogjava.net/leekiang/category/21130.html</link><description>MDA/MDD/TDD/DDD/DDDDDDD</description><language>zh-cn</language><lastBuildDate>Tue, 15 Mar 2011 23:44:03 GMT</lastBuildDate><pubDate>Tue, 15 Mar 2011 23:44:03 GMT</pubDate><ttl>60</ttl><item><title>为什么要使用spring</title><link>http://www.blogjava.net/leekiang/archive/2011/03/16/346354.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Tue, 15 Mar 2011 18:13:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2011/03/16/346354.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/346354.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2011/03/16/346354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/346354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/346354.html</trackback:ping><description><![CDATA[


spring第二大作用就是aop，其机理来自于代理模式，代理模式有三个角色分别是通用接口、代理、真实对象代理、<br />真实对象实现的是同一接口，将真实对象作为代理的一个属性，向客户端公开的是代理，当客户端调用代理的方法时，代理找到真实对象，调用真实对象<br />方法，在调用之前之后提供相关的服务，如事务、安全、日志。其名词分别是代理、真实对象、装备、关切点、连接点。<br />动态代理:不用写代理类，虚拟机根据真实对象实现的接口产生一个类，通过类实例化一个动态代理，在实例化动态代理时将真实对象<br />及装备注入到动态代理中，向客户端公开的是动态代理，当客户端调用动态代理方法时，动态代理根据类的返射得<br />到真实对象的Method,调用装备的invoke方法，将动态代理、Method、方法参数传与装备的invoke方法，invoke方法在唤<br />起method方法前或后做一些处理。1、产生动态代理的类:java.lang.refect.Proxy 2、装备必须实现InvocationHandler接口实现invoke方法<br /><br /><br /><a href="http://enjoyjavaeye.javaeye.com/blog/268816">http://enjoyjavaeye.javaeye.com/blog/268816</a><br /><a href="http://hi.baidu.com/golotus/blog/item/fd9b8cf973d0d45f242df2f2.html">http://hi.baidu.com/golotus/blog/item/fd9b8cf973d0d45f242df2f2.html</a><br /><a href="http://byduke.javaeye.com/blog/392850">http://byduke.javaeye.com/blog/392850</a><br /><a href="http://developer.51cto.com/art/200906/128386.htm">Spring的起源和背景以及你为什么要使用Spring</a><br /><a href="http://topic.csdn.net/u/20110224/14/ac48a152-7595-4f6f-b877-2905258b38ef.html">http://topic.csdn.net/u/20110224/14/ac48a152-7595-4f6f-b877-2905258b38ef.html</a><br /><a href="http://tech.it168.com/a2009/0622/593/000000593376_1.shtml">Spring工作原理探秘</a><br /><a href="http://www.360doc.com/content/10/1215/11/4957029_78291485.shtml">http://www.360doc.com/content/10/1215/11/4957029_78291485.shtml</a><br /><img src ="http://www.blogjava.net/leekiang/aggbug/346354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2011-03-16 02:13 <a href="http://www.blogjava.net/leekiang/archive/2011/03/16/346354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>flash</title><link>http://www.blogjava.net/leekiang/archive/2010/06/07/322962.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Mon, 07 Jun 2010 05:34:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/06/07/322962.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/322962.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/06/07/322962.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/322962.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/322962.html</trackback:ping><description><![CDATA[
		<a target="_blank" href="http://en.wikipedia.org/wiki/Post/Redirect/Get">Post/Redirect/Get (PRG)</a> is a common design pattern for web developers to help avoid certain duplicate form  submissions and allow user agents to behave more intuitively with bookmarks and the refresh button.<br />PRG模式也称为post-redirect pattern或Redirect-After-Post pattern<br /><br />http://forum.springsource.org/showthread.php?t=73939<br />http://jira.springframework.org/browse/MOD-458<br />http://jira.springframework.org/browse/SPR-6464<br />http://blog.vichasconsulting.com/archives/12<br />http://forum.springsource.org/showthread.php?t=38466<br />http://www.docin.com/p-56268947.html<br /><img src ="http://www.blogjava.net/leekiang/aggbug/322962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-06-07 13:34 <a href="http://www.blogjava.net/leekiang/archive/2010/06/07/322962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JdbcTemplate为什末不用connection，connection为什末不能共享(转)</title><link>http://www.blogjava.net/leekiang/archive/2010/05/06/320171.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Thu, 06 May 2010 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/05/06/320171.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/320171.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/05/06/320171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/320171.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/320171.html</trackback:ping><description><![CDATA[来源:http://bbs.xml.org.cn/blog/more.asp?name=hongrui&amp;id=10283<br /><br />JdbcTemplate为什末包含javax.sql.DataSource ，而不是用connections，因为使用DataSource有很多优点，<br />我们在复杂的应用中如果使用connections（当然可以使用 DataSource.getConnection()得到），<br />必须捕捉SQLExceptions，这样spring框架无法处理 SQLException异常，在抛出异常时，无法关闭connection。<br />connection为什末不能共享？DataSource.getConnection()得到connection实例，一般都不相同，这由连接池的具体实现控制，<br />所以大家不要使用oracle的临时表，因为如果每次连接都不一样的话，下次就没有临时表了。<br />建立连接是消耗时间的，在一段时间内，connection只能由一个用户使用，为了避免transaction产生冲突，一些jdbc驱动不支持多线程访问同一个connection。还有一个更致命的问题，众所周知，transaction是基于connection的，即使多个用户使用一个连接，大家在一个事务内操作数据库，一个数据库操作rollback，所有的数据库操作全部rollback，所以一直保持一个打开的connection代价是很大的。<br />我只有在两个方法中处理一个事务时，把 connection作为变量传递。<br /><br />关于statement,resultset和connection的问题<br /><br />statement,resultset属于弱refrence，即如果statement关掉，resultset就会被自动释构,弱 refrence的做法不保险，所以JDBC3.0开始明确规定了如果connection被关，所有statement都应该关,不过这取决于使用的数据库驱动。<br />应该DBMS 执行操作后，显式的关闭statement ，因为在connection关闭前，JDBC statement仍旧处于打开状态，当返回resultset后，关闭statement是必要的，尤其在遇到异常的时候。<br />如果不使用 connection pool可以直接关闭connection，不考虑statement的关闭，使用连接池的时候，务必关闭statement，否则你的连接马上被用光，使用statement pooling除外。<img src ="http://www.blogjava.net/leekiang/aggbug/320171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-05-06 10:21 <a href="http://www.blogjava.net/leekiang/archive/2010/05/06/320171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring AOP应该用到Spring MVC上不起作用?</title><link>http://www.blogjava.net/leekiang/archive/2010/01/27/311013.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 27 Jan 2010 15:53:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/01/27/311013.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/311013.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/01/27/311013.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/311013.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/311013.html</trackback:ping><description><![CDATA[我最近在开发一个使用Spring MVC的Web程序时遇到了一个奇怪的问题：自己写的Spring AOP切面对Controller中的方法切点不起作用。
<br /><br />后来我查了一下，Spring对自己的MVC（Controller）有特殊的拦截方法，需要在URLHandlerMapping中配置
Interceptor实现，它可以对请求进行拦截。因此直接用Spring
AOP切面拦截Controller中的任何方法都是不起作用的。（具体的实现过程我不是很清楚，但是很多文章和贴子表达的意思是这样的）
<br /><br />后来，我做了一个实验。通过IOC将一个业务对象注入Controller中，然后将AOP配置成作用于该业务对象的方法上，结果还是不起作用。
我几乎试验了所有的Spring
AOP和AspectJ的实现和配置方法，都不起作用。后来我用同样的类方法和同样的配置方式，写了一个脱离了Spring
MVC的测试程序，一切正常，切面能够起到作用。
<br /><br />如果说Spring AOP对Spring MVC的Controller的方法不起作用，难道对注入到Controller的类方法也不起作用吗？？？我想得到一个准确的答案，谢谢！！！ (bryantd)<br /><br />我对Spring的MVC并不是很熟，不过刚才仔细看了一下源码，我觉得应该之所以Spring的AOP没有对Controller应用成功的原因
是：Spring
MVC在启动的时候会根据处理器策略加载handler映射到一个map中，这个时候因为配置的原因它从容器中取到的对象是原生对象，而不是我们代理的对
象；所以不管我们的Controller做了什么操作都不会经过我们的代理，这样AOP就失去了作用；获取handler的方法应该是
DefaultListableBeanFactory的getBeanNamesForType方法；这是我自己在查看源码后总结出来的，如果有什么不
对的地方大家讨论下  (layer555)<br /><br />转自http://www.javaeye.com/problems/20363<br /><img src ="http://www.blogjava.net/leekiang/aggbug/311013.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-01-27 23:53 <a href="http://www.blogjava.net/leekiang/archive/2010/01/27/311013.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>aop配置事务</title><link>http://www.blogjava.net/leekiang/archive/2009/12/24/307216.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Thu, 24 Dec 2009 14:04:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/12/24/307216.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/307216.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/12/24/307216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/307216.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/307216.html</trackback:ping><description><![CDATA[
		<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
				<span class="Apple-style-span" style="font-family: Verdana,Geneva,Arial,Helvetica,sans-serif; font-size: 13px; line-height: 19px;">
						<b style="color: black; background-color: rgb(153, 255, 153);">事务</b>直接配到DAO上<br />&lt;bean id="transactionManager"<br />        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br />        &lt;property name="dataSource" ref="dataSource" /&gt;<br />    &lt;/bean&gt;<br /><br />    &lt;bean id="baseTxProxy"<br />        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"<br />        lazy-init="true" abstract="true"&gt;<br />        &lt;property name="transactionManager"&gt;<br />            &lt;ref bean="transactionManager" /&gt;<br />        &lt;/property&gt;<br />        &lt;property name="transactionAttributes"&gt;<br />            &lt;props&gt;<br />                &lt;prop key="update*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />            &lt;/props&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;<br /><br />    &lt;bean id="studentDaoProxy" parent="baseTxProxy"&gt;<br />        &lt;property name="target"&gt;<br />            &lt;ref bean="studentDao" /&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;<br /><br />    &lt;bean id="studentDao" class="com.dao.StudentDaoImpl"&gt;<br />        &lt;property name="dataSource" ref="dataSource" /&gt;<br />    &lt;/bean&gt;<br />    <br />    StudentDao st = (StudentDao) context.getBean("studentDaoProxy");<br />    <br />    两个bean也可以合并为<br />    &lt;bean id="studentDao" parent="baseTxProxy"&gt;<br />        &lt;property name="target"&gt;<br />            &lt;bean class="com.dao.StudentDaoImpl"&gt;<br />                &lt;property name="dataSource" ref="dataSource" /&gt;<br />                &lt;property name="kpiDao" ref="kpiDao" /&gt;<br />            &lt;/bean&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;<br />    StudentDao st = (StudentDao) context.getBean("studentDao");<br />    上述这种方式必须使用接口，为什么。<br />    <br />    <br />    第二种同样必须用接口。<b style="color: black; background-color: rgb(160, 255, 255);">配置</b>起来比第一种麻烦<br />        &lt;bean id="transactionManager"<br />        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br />        &lt;property name="dataSource" ref="dataSource" /&gt;<br />    &lt;/bean&gt;<br /><br />    &lt;bean id="transactionInterceptor"<br />        class="org.springframework.transaction.interceptor.TransactionInterceptor"&gt;<br />        &lt;property name="transactionManager" ref="transactionManager" /&gt;<br />        &lt;property name="transactionAttributes"&gt;<br />            &lt;props&gt;<br />                &lt;prop key="update*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />            &lt;/props&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;<br />    &lt;bean id="studentDaoProxy"<br />        class="org.springframework.<b style="color: black; background-color: rgb(255, 255, 102);">aop</b>.framework.ProxyFactoryBean"&gt;<br />        &lt;property name="target" ref="studentDao" /&gt;<br />        &lt;property name="interceptorNames"&gt;<br />            &lt;list&gt;<br />                &lt;value&gt;transactionInterceptor&lt;/value&gt;<br />            &lt;/list&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;<br />    <br />    &lt;bean id="studentDao" class="com.dao.StudentDaoImpl"&gt;<br />        &lt;property name="dataSource" ref="dataSource" /&gt;<br />    &lt;/bean&gt;<br />    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");<br />    StudentDao st = (StudentDao) context.getBean("studentDaoProxy");<br />    <br />    如果使用的都是接口，那么就不需要用cglib-nodep-2.1_3.jar<br />    如果service调dao没有用到接口，那么必须用cglib-nodep-2.1_3.jar</span>
		</span>
		<bean id="transactionManager">
				<bean id="baseTxProxy">
						<bean id="studentDaoProxy" parent="baseTxProxy">
								<bean id="studentDao" class="com.dao.StudentDaoImpl">
										<bean id="studentDao" parent="baseTxProxy">
												<property name="target">
														<bean id="transactionManager">
																<bean id="transactionInterceptor">
																		<bean id="studentDaoProxy">
																				<bean id="studentDao" class="com.dao.StudentDaoImpl">
																						<br />
																						<br />事务策略: 了解事务陷阱 <a href="http://www.ibm.com/developerworks/cn/java/j-ts1.html">http://www.ibm.com/developerworks/cn/java/j-ts1.html</a>
事务策略: 高并发策略
http://www.ibm.com/developerworks/cn/java/j-ts5/index.html
这是一个系列.<br /><br />http://beet.sourceforge.net<br />Beet records user behavior and performance data for your Spring-based Java application.  It can thus help you to analyze usage patterns and research production performance issues.<br /></bean>
																		</bean>
																</bean>
														</bean>
												</property>
										</bean>
								</bean>
						</bean>
				</bean>
		</bean>
<img src ="http://www.blogjava.net/leekiang/aggbug/307216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-12-24 22:04 <a href="http://www.blogjava.net/leekiang/archive/2009/12/24/307216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring jdbc笔记</title><link>http://www.blogjava.net/leekiang/archive/2009/12/23/307061.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 23 Dec 2009 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/12/23/307061.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/307061.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/12/23/307061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/307061.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/307061.html</trackback:ping><description><![CDATA[SQL标准允许基于一个带参数列表的表达式进行查询。一个典型的例子可能像这样："select * from T_ACTOR where id in (1, 2, 3)"。 不过这种参数列表的方式并不能直接被JDBC标准所支持 - 因为并不存在这种声明一个列表参数作为占位符的方式。 你不得不为此写多个占位符来表示多个参数，或者当你知道占位符的数量时，你可以动态构建SQL字符串。 NamedParameterJdbcTemplate和SimpleJdbcTemplate中所提供的命名参数的特性，采用的是后面一种做法。 当你传入参数时，你需要传入一个java.util.List类型，支持基本类型。而这个list将会在SQL执行时替换占位符并传入参数。<br />在使用IN语句时，当你传入大批量的值时要小心，JDBC标准并不确保超过100个元素在IN语句中。 有不少数据库可以超出这个值的限制，但是不同的数据库会有不同的数量限制，比如Oracle的限制数量是1000个。<br />除了基本类型之外，你还可以创建一个java.util.List的对象数组，这可以让你支持在IN表达式中编写多重表达式，例如"select * from T_ACTOR where (id, last_name) in ((1, 'Johnson'), (2, 'Harrop'))". 当然，这样做的前提是数据库底层的语法支持。 <br /><br />http://www.javaeye.com/problems/6124<br />select count(*) num from lottery_term where term_issuenum in (?) and 
term_lotteryid = ?<br />改成getJdbcTemplate().queryForInt(sql,new Object[]{new 
String[]{"2008326","2008325","2008324"},103}); <br />List 
list=new ArrayList();<br />list.add("****");<br />getJdbcTemplate().queryForInt(sql,new
 Object[]{list,103}); <br />或<br />select count(*) from info_document where category_id in 
(:category_id_list);<br />Map&lt;String,Object&gt; parm = new 
HashMap&lt;String,Object&gt;();<br />parm.put("category_id_list", idList);<br /><br /><br /><span style="font-size: 10pt; color: rgb(0, 0, 0);"><span>  </span></span><strong><span style="font-size: 10pt; color: rgb(127, 0, 85);">public</span></strong><span style="font-size: 10pt; color: rgb(0, 0, 0);"> List getAllStu() {</span><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: rgb(0, 0, 0);"><span>       </span>String sql=</span><span style="font-size: 10pt; color: rgb(42, 0, 255);">"select s_id as sid,s_name as sname,s_sex as ssex,s_brith as sbrith from stu"</span><span style="font-size: 10pt; color: rgb(0, 0, 0);">;</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: rgb(0, 0, 0);"><span>       </span>List list=</span><span style="font-size: 10pt; color: rgb(0, 0, 192);">this.getJdbcTemplate()</span><span style="font-size: 10pt; color: rgb(0, 0, 0);">.query(sql,</span><strong><span style="font-size: 10pt; color: rgb(127, 0, 85);">new</span></strong><span style="font-size: 10pt; color: rgb(0, 0, 0);"> BeanPropertyRowMapper(Stu.</span><strong><span style="font-size: 10pt; color: rgb(127, 0, 85);">class</span></strong><span style="font-size: 10pt; color: rgb(0, 0, 0);">));</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: rgb(0, 0, 0);"><span>       </span></span><strong><span style="font-size: 10pt; color: rgb(127, 0, 85);">return</span></strong><span style="font-size: 10pt; color: rgb(0, 0, 0);"> list;</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: rgb(0, 0, 0);"><span>    </span>}</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><br /><span style="font-size: 10pt; color: rgb(0, 0, 0);"></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: rgb(0, 0, 0);">关于execute和update方法之间的区别，update方法返回的是受影响的记录数目的 一个计数，并且如果传入参数的话，使用的是java.sql.PreparedStatement,而execute方法总是使用 java.sql.Statement,不接受参数，而且他不返回受影响记录的计数，更适合于创建和丢弃表的语句，而update方法更适合于插入，更新 和删除操作，这也是我们在使用时需要注意的。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><br /><span style="font-size: 10pt; color: rgb(0, 0, 0);"></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><br /><span style="font-size: 10pt; color: rgb(0, 0, 0);"></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: rgb(0, 0, 0);">Connection conn=DataSourceUtils.getConnection(getJdbcTempldate().getDataSource());</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: rgb(0, 0, 0);">conn=getJdbcTemplate().getNativeJdbcExtractor().getNativeConnection(conn);</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: rgb(0, 0, 0);">OracleConnection oconn=(OracleConnection)conn;</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; color: rgb(0, 0, 0);">通过</span><span style="font-size: 10pt; color: rgb(0, 0, 0);">DataSourceUtils获取当前线程绑定的数据连接，为了使用线程上下文相关的事务，这样写是正确的写法，如果直接从DataSource获取连接，得到的是和当前线程上下文无关的新的数据库连接实例。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">http://www.javaeye.com/topic/49932?page=2</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">http://www.javaeye.com/problems/15846</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">http://www.javaeye.com/topic/87034<br /></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">http://www.javaeye.com/topic/508799</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">http://ttitfly.javaeye.com/blog/151560</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><br /></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">jdbcTemplate的方式里如果带上int[] argTypes显示指定每个占位符所对应的字段数据类型，可以保证类型安全，当参数值为null时，提供了更好的支持。</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">-----------------------</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">上面这句话如何理解？</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><br /></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">后在http://javazoo.bokee.com/viewdiary.15850865.html找到原因了</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">今天在调试程序的时候,在后台业务逻辑类中利用JdbcTemplate进行数据同步操作时,发现当<br />执行jdbcTemplate.update(带?的SQL语句,new Object[]{tmp.getName( ),tmp.getNo( ),tmp.getSpeciality( ),tmp.getMounterofficer( ),tmp.getDesigner( ),tmp.getProductivity( ),tmp.getState( ))<br />这种操作时,如果后面参数中有值为null时,后台会报异常,细想下也是,如果是null,那就要执行jdbc的setNull(Spring底层还是用JDBC做的)方法了,但是setNull方法要知道具体的数据库字段的类型.如setNull(1,Types.VARCHAR).而在上面的方法没有体现.<br />终于体会到update方法中第三个参数new int[]的作用了.!<br />spring还是很伟大的.</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><br /></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">如果字段名和属性名是严格对应的，那么就可以不用自己写RowMapper了，使用<span><span style="">BeanPropertyRowMapper:</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span><span style="">getJdbcTemplate().query(sql, </span><span class="keyword">new</span><span style=""> BeanPropertyRowMapper(User.</span><span class="keyword">class</span><span>));  </span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">类的属性字段名称要数据库中的字段名称一样或者数据库字段名为s_id类的名称为SId,<br />如果你没有遵守这个规范则可以在select语句后面给数据库字段名取别名</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><br /></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">//绑定参数时，日期类型的写法,未经过验证<br /></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">    public void updStu(Stu stu) {<br />String sql = "update stu set s_name=?,s_sex=?,s_brith=? where s_id=?";<br />Object[] obj = new Object[] { stu.getSname(), stu.getSsex(),new java.sql.Date(stu.getSbrith().getTime()), stu.getSid() };<br />      <span><span style="">getJdbcTemplate()</span></span>.update(sql, obj, new int[] { Types.VARCHAR, Types.VARCHAR,Types.DATE, Types.INTEGER });<br />    }</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><br /></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><br /></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">ConnectionCallback的用法，使用完要手动关闭连接吗？<br /><br /><span style="font-size: 10pt; color: rgb(0, 0, 0);"></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">spring的AbstractRoutingDataSource，可以多态切换数据库?</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><br /></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">事务抽象层http://blog.csdn.net/congqian1120/archive/2008/01/16/2046311.aspx<br /></p><br /><br /><br />http://www.oracle.com/technology/global/cn/pub/articles/marx_spring.html<img src ="http://www.blogjava.net/leekiang/aggbug/307061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-12-23 17:29 <a href="http://www.blogjava.net/leekiang/archive/2009/12/23/307061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Are you running on Java 1.4 or below with Apache Crimson? Upgrade to Apache Xerces (or Java 1.5) for full XSD support</title><link>http://www.blogjava.net/leekiang/archive/2009/12/21/306768.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Mon, 21 Dec 2009 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/12/21/306768.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/306768.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/12/21/306768.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/306768.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/306768.html</trackback:ping><description><![CDATA[jdk1.4下使用spring2.5时报上述这个错误，把xerces-2.6.2.jar放进去就好了。奇怪的是spring自带的jar包里没有xerces.jar<br />jfreechart里的gnujaxp.jar<br />cewolf里的crimson-1.1.3.jar<br />j2ee自带的<span class="hilite21">xml</span>-apis.jar<br />xercesImpl.jar
<br />这些jar与Your JAXP provider有何关系
<img src ="http://www.blogjava.net/leekiang/aggbug/306768.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-12-21 10:41 <a href="http://www.blogjava.net/leekiang/archive/2009/12/21/306768.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring的JdbcTemplate用法</title><link>http://www.blogjava.net/leekiang/archive/2009/11/30/304186.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sun, 29 Nov 2009 20:46:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/11/30/304186.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/304186.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/11/30/304186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/304186.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/304186.html</trackback:ping><description><![CDATA[1，基本用法<br />http://blog.163.com/fxf_java/blog/static/59268637200822833715185/<br />2,JdbcTemplate的连接<br />http://www.javaeye.com/topic/89845<br />http://forum.springsource.org/showthread.php?t=63444<br />3,ConnectionCallback<br />http://blog.csdn.net/lin49940/archive/2009/10/22/4712883.aspx<br /><br /><dl><dt></dt><pre>public interface <b>ConnectionCallback</b></pre></dl><p>
Generic callback interface for code that operates on a JDBC Connection.
 Allows to execute any number of operations on a single Connection,
 using any type and number of Statements.

 </p><p>This is particularly useful for delegating to existing data access code
 that expects a Connection to work on and throws SQLException. For newly
 written code, it is strongly recommended to use JdbcTemplate's more specific
 operations, for example a <code>query</code> or <code>updat</code> variant.
</p><h3>
doInConnection</h3><pre><a href="http://java.sun.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a><b>doInConnection</b>(<a href="http://java.sun.com/javase/6/docs/api/java/sql/Connection.html?is-external=true" title="class or interface in java.sql">Connection</a> con)<br />                      throws <a href="http://java.sun.com/javase/6/docs/api/java/sql/SQLException.html?is-external=true" title="class or interface in java.sql">SQLException</a>,<br /><a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/dao/DataAccessException.html" title="class in org.springframework.dao">DataAccessException</a></pre><dl><dd>Gets called by <code>JdbcTemplate.execute</code> with an active JDBC
 Connection. Does not need to care about activating or closing the
 Connection, or handling transactions.

 <p>If called without a thread-bound JDBC transaction (initiated by
 DataSourceTransactionManager), the code will simply get executed on the
 JDBC connection with its transactional semantics. If JdbcTemplate is
 configured to use a JTA-aware DataSource, the JDBC Connection and thus
 the callback code will be transactional if a JTA transaction is active.

 </p><p>Allows for returning a result object created within the callback, i.e.
 a domain object or a collection of domain objects. Note that there's special
 support for single step actions: see <code>JdbcTemplate.queryForObject</code>
 etc. A thrown RuntimeException is treated as application exception:
 it gets propagated to the caller of the template.
</p><p></p></dd><dd><dl><dt><b>Parameters:</b></dt><dd><code>con</code> - active JDBC Connection
</dd><dt><b>Returns:</b></dt><dd>a result object, or <code>null</code> if none
</dd><dt><b>Throws:</b></dt><dd><code><a href="http://java.sun.com/javase/6/docs/api/java/sql/SQLException.html?is-external=true" title="class or interface in java.sql">SQLException</a></code> - if thrown by a JDBC method, to be auto-converted
 to a DataAccessException by a SQLExceptionTranslator
</dd><dd><code><a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/dao/DataAccessException.html" title="class in org.springframework.dao">DataAccessException</a></code> - in case of custom exceptions</dd><dt><b>See Also:</b></dt><dd><a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/jdbc/core/JdbcTemplate.html#queryForObject%28java.lang.String,%20java.lang.Class%29"><code>JdbcTemplate.queryForObject(String, Class)</code></a>, 
<a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/jdbc/core/JdbcTemplate.html#queryForRowSet%28java.lang.String%29"><code>JdbcTemplate.queryForRowSet(String)</code></a></dd></dl></dd></dl><br /><br />2,<br /><img src ="http://www.blogjava.net/leekiang/aggbug/304186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-11-30 04:46 <a href="http://www.blogjava.net/leekiang/archive/2009/11/30/304186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring security笔记</title><link>http://www.blogjava.net/leekiang/archive/2009/02/03/253015.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Mon, 02 Feb 2009 19:29:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/02/03/253015.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/253015.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/02/03/253015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/253015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/253015.html</trackback:ping><description><![CDATA[1,FilterSecurityInterceptor的objectDefinitionSource定义的是url与角色的关系，既可以在xml里写死，也可以自定义一个FilterInvocationDefinitionSource，实现其public ConfigAttributeDefinition getAttributes(Object filter)方法。这个关系好像也可以定义在FilterChainProxy的filterInvocationDefinitionSource<br />http://www.javaeye.com/topic/113436<br />http://www.blogjava.net/redhatlinux/archive/2008/09/01/226010.html<br />http://www.webasp.net/article/29/28097_print.htm<br /><br />定义好角色与url的关系，同时告诉acegi该用户拥有的角色，那么acegi会根据投票规则去验证是否有权限。<br /><br />2，必须要设置httpSessionContextIntegrationFilter，否则就会报<br />org.springframework.security.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext<br /><br />3,<br />其实所有的权限问题最终可以总结为: 当前的登陆用户是谁，他拥有那些资源，<br />他现在所访问的资源是否与与其匹配。 这个就是最基本的 用户-资源 后来因用户和资源经常性变化，<br />单一的用户资源模型会导致经常性维护的麻烦，所以人们加入了角色一层，以方便更好的管理，<br />这就是 用户-角色-资源(RBAC)模型。随着系统的不断增大，用户和资源越来越多，<br />根据不同的项目的需要，人们又按需开发了不少模型，如 用户-角色-权限-资源 模型, <br />用户-角色-角色组-权限-资源 模型，用户-角色-角色组-权限-操作-资源 模型等，<br />其实无论中间加入多少层，如何扩展，也都是万变不离其宗：用户-资源。<br /><br />4，<br />手册 http://family168.com/oa/springsecurity/html/<br /><br />http://www.javaeye.com/topic/17896<br /><img src ="http://www.blogjava.net/leekiang/aggbug/253015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-02-03 03:29 <a href="http://www.blogjava.net/leekiang/archive/2009/02/03/253015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对org.springframework.beans. CachedIntrospectionResults 的理解</title><link>http://www.blogjava.net/leekiang/archive/2009/02/02/252896.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sun, 01 Feb 2009 20:56:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/02/02/252896.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/252896.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/02/02/252896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/252896.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/252896.html</trackback:ping><description><![CDATA[CachedIntrospectionResults 缓存了所有的bean的信息(主要是属性)，是用static缓存的，对于同一个class的信息只要执行一次就可以了，所以采用了工厂模式。我怎么觉得是单例模式。<br />这个类里有很多东西，什么弱引用之类。与内存泄漏有关系。<br /><br />参见:<br />http://www.blogjava.net/killme2008/archive/2007/06/26/126282.html<br />http://calvin.redsaga.com/viewthread.php?tid=391<br /><br /><img src ="http://www.blogjava.net/leekiang/aggbug/252896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-02-02 04:56 <a href="http://www.blogjava.net/leekiang/archive/2009/02/02/252896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring测试笔记</title><link>http://www.blogjava.net/leekiang/archive/2009/02/02/252895.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sun, 01 Feb 2009 19:38:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/02/02/252895.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/252895.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/02/02/252895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/252895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/252895.html</trackback:ping><description><![CDATA[1,<a href="http://www.infoq.com/articles/testing-in-spring">Software Testing With Spring Framework</a><br /><br /><br /><br /><a href="http://www.infoq.com/cn/articles/programmer-interview;jsessionid=9B6B17374949C71A8DDECEB65F8937F0">软件开发者面试百问</a><br /><br /><img src ="http://www.blogjava.net/leekiang/aggbug/252895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-02-02 03:38 <a href="http://www.blogjava.net/leekiang/archive/2009/02/02/252895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring mvc笔记</title><link>http://www.blogjava.net/leekiang/archive/2009/01/08/250444.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Thu, 08 Jan 2009 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/01/08/250444.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/250444.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/01/08/250444.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/250444.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/250444.html</trackback:ping><description><![CDATA[1,&lt;spring:bind&gt;是spring2.0以前的写法。<br />2,public ModelAndView login(HttpServletRequest request,<br />            HttpServletResponse response,HttpSession session,User user)<br />  public ModelAndView login(HttpServletRequest request,<br />            HttpServletResponse response,User user)<br />MultiActionController自动把最后一个参数当作Command对象。<br />也可以覆盖protected Object newCommandObject(Class clazz)方法，但这样每个 Controller的Command对象就是同一个iele，<br />同时要改为<br />public ModelAndView login(HttpServletRequest request,<br />            HttpServletResponse response,Object command)再对command造型<br />            <br />3，重定向写法<br />return new ModelAndView("redirect:/system/user.do?do=addUserForm");<br /><br />4，有2个JsonView的，或者更适合Ajax，当然自己写一个JsonView都很简单
<br />1) json-lib-ext-spring 
<br />http://sourceforge.net/projects/json-lib/files/
<br />2) spring json view
<br />http://spring-json.sourceforge.net/download.html<br />http://article.yeeyan.org/view/jdonee/10145<br /><br />5, 绑定的基本写法<br />ServletRequestDataBinder binder = new ServletRequestDataBinder(obj);<br />        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");<br />        binder.registerCustomEditor(Date.class, new CustomDateEditor(<br />                dateFormat, true));<br />        binder.setDisallowedFields(new String[]{"endtime"});<br />        binder.bind(request);<br /><img src ="http://www.blogjava.net/leekiang/aggbug/250444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-01-08 09:31 <a href="http://www.blogjava.net/leekiang/archive/2009/01/08/250444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring2.5与junit整合的笔记</title><link>http://www.blogjava.net/leekiang/archive/2009/01/04/249776.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sun, 04 Jan 2009 10:13:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/01/04/249776.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/249776.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/01/04/249776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/249776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/249776.html</trackback:ping><description><![CDATA[1,为了尽量平稳过渡，继续用junit3.8,而不是直接使用junit4<br />2,@ContextConfiguration(locations = { "classpath:applicationContext-sys.xml",<br />        "classpath:applicationContext.xml" })<br />public class BaseTests extends AbstractTransactionalJUnit38SpringContextTests {<br />}<br />所有的TestCase都继承上面这个类，使得spring配置文件重用，同时ApplicationContext也是同一个。<br /><br />3,要测试的service类通过@Autowired注入，例如<br />    @Autowired<br />    private UserDAO  userDAO;<br />    <br />4，注意，对于继承了BaseTests的测试类里的每一个test方法，运行测试时都会按<br />   setUp()--&gt;test方法--&gt;tearDown()的顺序执行，而且这3个组成一个事务，执行完后默认会回滚。<br />   如果不想回滚，在类名前面@TransactionConfiguration(defaultRollback = false)<br />   <br />5，因为还是用的junit3.8,故TestSuite的写法照旧<br />  public class SuiteTests {<br />    public static Test suite() {<br />        TestSuite suite = new TestSuite("运行所有测试");<br />        suite.addTestSuite(UserServiceTests.class);<br />        suite.addTestSuite(RoleServiceTests.class);<br />        return suite;<br />    }<br />}<br /><br />6，测试类并没有当作bean配置在application.xml文件中，<br />   spring测试框架是如何使"setUp()--&gt;test方法--&gt;tearDown()"处于同一个事务的呢？<br />   具体就要看AbstractTransactionalJUnit38SpringContextTests了，是通过注解实现的。<br />   service方法在test方法里面，这两个方法都配置有事务，即形成了事务的嵌套，这里有点复杂了，我还没想清楚。<br />   不过可以肯定的是，如果test方法的事务不提交，那么service方法的事务也不会提交。<br />   <br />7，如果想在jdk1.4下重用ApplicationContext，可采用以下的办法，出处再补上。这个办法与前面的进行比较，<br />   我觉得最大的区别是这种写法要手动进行测试数据的清除。<br />public class BaseTestCase extends TestCase {<br />     static ApplicationContext context = null;<br /><br />    static {<br />        // perform the "global" set up logic<br />        // 这里的代码会在类初始化时执行，所以相当于BeforeClass<br />        String[] CONFIG_FILES_MIN = { "applicationContext-sys.xml",<br />                "applicationContext.xml" };<br />        context = new ClassPathXmlApplicationContext(CONFIG_FILES_MIN);<br />        System.out.println("setup");<br /><br />        // and now register the shutdown hook for tear down logic<br />        // 将一个匿名方法写到这里，就相当于AfterClass<br />        Runtime.getRuntime().addShutdownHook(new Thread() {<br />            public void run() {<br />                System.out.println("shutdown");<br />            }<br />        });<br />    }<br /><br />    protected void setUp() throws Exception {<br />    }<br />}<br /><br />8，如果用junit-4.jar，去官网下载junit4.4.jar。不要采用myeclipse自带的junit4.jar，因为这个不带JUnit4ClassRunner类。<br />   另外不要用junit-4.5.jar,据说与spring2.5有冲突，<br />   详见Spring Test Context Framework not compatible with JUnit 4.5，http://jira.springframework.org/browse/SPR-5145<br /><br /><br />9，String htmlContent  = "&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;html content&lt;/body&gt;&lt;/html&gt;";<br />
      String plainContent = "plain content";<br /><br />
      MockMultipartHttpServletRequest req = new MockMultipartHttpServletRequest();<br />req.setContentType("multipart/form-data");<br />//req.addHeader("Content-type", "multipart/form-data");//这样写应该是一样的<br />
      req.setMethod("POST");<br />
      req.addFile( new MockMultipartFile("file","test1.html","text/html", htmlContent.getBytes( "US-ASCII" ) ) );<br />
      req.addFile( new MockMultipartFile("file","test2.html","text/html", htmlContent.getBytes( "US-ASCII" ) ) );<br />
      req.addFile( new MockMultipartFile("file","test.txt", "text/plain",plainContent.getBytes( "US-ASCII" ) ) );<br />assertTrue( ServletFileUpload.isMultipartContent( req ) );<br />int content_length = req.getContentLength();<br /><br />10，AbstractTransactionalJUnit38SpringContextTests<br />    AbstractTransactionalSpringContextTests<br />    AbstractTransactionalDataSourceSpringContextTests<br />的区别?<br /><br />11,MockHttpServletRequest的addParameter方法和setParameter的区别<br /><br /><br />参考:<br /><a href="http://www.uml.org.cn/j2ee/200905074.asp">详细讲解在Spring中进行集成测试</a><br />http://www.javaeye.com/topic/68185<br />http://www.google.cn/codesearch/p?hl=zh-CN#Vq-IOboH1tI/trunk/test/es/peerreview/service/TestPeerReviewSpring.java<br /><a href="http://www.yybean.com/junit-with-spring-framework-provided-by-the-expansion-of-the-dao-or-the-service-layer-unit-test">用Spring提供的JUnit框架扩展对DAO或Service层进行单元测试</a><br />http://code.google.com/p/anewssystem/source/browse/trunk/anewssystem/parent/core/src/main/java/anni/core/test/?r=105<br />http://docs.huihoo.com/spring/2.5.x/zh-cn/testing.html<br />http://arkxu.javaeye.com/blog/261679<br />http://www.ibm.com/developerworks/cn/java/j-cb06066.html<br />http://www.ibm.com/developerworks/cn/java/j-lo-spring25-test/<br /><a href="http://mingxinzhicheng.blog.51cto.com/15/3219">基于mock对象和JUnit框架简化Spring Web组件单元测试</a><br />http://www.blogjava.net/calvin/archive/2005/09/21/13628.html<br />http://www.yybean.com/testing-framework-to-use-spring-integration-testing<br /><br /><br /><img src ="http://www.blogjava.net/leekiang/aggbug/249776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-01-04 18:13 <a href="http://www.blogjava.net/leekiang/archive/2009/01/04/249776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在spring中使用quartz</title><link>http://www.blogjava.net/leekiang/archive/2008/07/11/214364.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Fri, 11 Jul 2008 15:44:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2008/07/11/214364.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/214364.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2008/07/11/214364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/214364.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/214364.html</trackback:ping><description><![CDATA[0 0-15 23 * * ?   每天23:00至23:15每分钟触发一次<br /><span style="color: windowtext; font-family: Verdana;" lang="EN-US">0 0/5 * * * ?</span>     每隔5分钟触发一次<br />0 15 10 L * ?     每月最后一日的上午10:15触发  <br /><br />bean配置的顺序:<br />定时器的工厂bean--&gt;cronbean--&gt;具体实现的bean<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">bean<br />        </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">="org.springframework.scheduling.quartz.SchedulerFactoryBean"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="triggers"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">list</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />                </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ref </span><span style="color: rgb(255, 0, 0);">bean</span><span style="color: rgb(0, 0, 255);">="cronExpReport"</span><span style="color: rgb(255, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">list</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">bean</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br />    </span><span style="color: rgb(0, 128, 0);">&lt;!--</span><span style="color: rgb(0, 128, 0);"> 每天23:00至23:15每分钟一次触发 </span><span style="color: rgb(0, 128, 0);">--&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">bean </span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">="cronExpReport"</span><span style="color: rgb(255, 0, 0);"><br />        class</span><span style="color: rgb(0, 0, 255);">="org.springframework.scheduling.quartz.CronTriggerBean"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="jobDetail"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ref </span><span style="color: rgb(255, 0, 0);">bean</span><span style="color: rgb(0, 0, 255);">="detailBean"</span><span style="color: rgb(255, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="cronExpression"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">0 0-15 23 * * ?</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">bean</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br /></span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">bean </span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">="detailBean"</span><span style="color: rgb(255, 0, 0);"><br />        class</span><span style="color: rgb(0, 0, 255);">="org.springframework.scheduling.quartz.JobDetailBean"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="jobClass"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">com.bo.detailBO</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="jobDataAsMap"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">map</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />                 </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">entry </span><span style="color: rgb(255, 0, 0);">key</span><span style="color: rgb(0, 0, 255);">="baseBO"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />                    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ref </span><span style="color: rgb(255, 0, 0);">bean</span><span style="color: rgb(0, 0, 255);">="baseBO"</span><span style="color: rgb(255, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />                </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">entry</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">map</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">property</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">bean</span><span style="color: rgb(0, 0, 255);">&gt;</span></div><br /><h4 style="margin-bottom: 0px;" id="subjcns!7032cce18bd46f6f!213">Define of cronExpression</h4><div id="msgcns!7032cce18bd46f6f!213" class="bvMsg">+------------------------------------+<br />| Position | Meaning | Value Scope   |<br />+------------------------------------+<br />| 1        | second  | 0-59          |<br />+------------------------------------+<br />| 2        | minute  | 0-59          |<br />+------------------------------------+<br />| 3        | hour    | 0-23          |<br />+------------------------------------+<br />| 4        | day     | 1-31          |<br />+------------------------------------+<br />| 5        | month   | 1-12          |<br />+------------------------------------+<br />| 6        | week    | 1-7           |<br />+------------------------------------+<br />| 7  可选  | year    | 1970-2099     |<br />+------------------------------------+</div><br />http://hi.baidu.com/tonent/blog/item/894e8b525124960a0cf3e3a1.html<br />http://blog.csdn.net/changsure/archive/2007/03/27/1542194.aspx<br />http://www.xici.net/b391997/d26742282.htm<br /><img src ="http://www.blogjava.net/leekiang/aggbug/214364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2008-07-11 23:44 <a href="http://www.blogjava.net/leekiang/archive/2008/07/11/214364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring使用笔记</title><link>http://www.blogjava.net/leekiang/archive/2008/07/11/214361.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Fri, 11 Jul 2008 15:36:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2008/07/11/214361.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/214361.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2008/07/11/214361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/214361.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/214361.html</trackback:ping><description><![CDATA[1，service方法的transactionAttributes配置为readonly时,<br />批处理中出现错误: ORA-01456: 不可以在 READ ONLY 事务处理中执行插入/删除/更新操作<br /><br />2,Failed to convert property value of type<br />错误的原因是service属性应该是接口，而不能是一个类<br /><br />3,spring2.5支持jdk1.4<br />readme.txt里有这样一句:<br />The Spring Framework 2.5 requires JDK 1.4.2 and J2EE 1.3 (Servlet 2.3, JSP 1.2, JTA 1.0, EJB 2.0). JDK 1.6 is<br />required for building the framework; for the full build including all aspects, AspectJ is required as well.<br />core包下有个JdkVersion类，用来判断jdk版本.代码里的相关位置对环境变量进行了判断，有时候做同一件事提供了两套方案,高于1.5(或1.6)一种,低于1.5(或1.6)又是一种,构建时用1.6版本以1.4编译,就能在1.4上用了。<br /><br />4,spring启动时ApplicationContext<br />http://www.blogjava.net/jiake/archive/2009/01/07/250235.html<br /><br />5,属性命名时不支持第一个字母是小写，而第二个字母是大写。<br />也就是说，对于JavaBean来讲，第一个与第二个字母都要小写<br />参考：<br />http://www.javaeye.com/topic/103184<br />http://www.javaeye.com/topic/88921<br />http://www.javaeye.com/problems/6293<br />javabean
specification，规定了一般的属性名称首字母小写，如果遇到前两个字母大写的属性，则getter方法保持属性名称不变，例如URL属性的
getter方法为getURL，但是并没有规定类似eTypeName这样的属性的getter方法写成geteTypeName的形式。<br />如果要符合javabean规范，则只能将eTypeName改成ETypeName<br /><br /><br />8,springfuse<br />Code generation for Spring-based Web applications  <br /><img src ="http://www.blogjava.net/leekiang/aggbug/214361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2008-07-11 23:36 <a href="http://www.blogjava.net/leekiang/archive/2008/07/11/214361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring的缺点(转)</title><link>http://www.blogjava.net/leekiang/archive/2007/11/21/162228.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 21 Nov 2007 14:44:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2007/11/21/162228.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/162228.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2007/11/21/162228.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/162228.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/162228.html</trackback:ping><description><![CDATA[来自:http://www.javaeye.com/topic/17518?page=1<br />问题是我觉得rich domain object 和domain Dao双向依赖的关系我也很不喜欢。我觉得那么就像现在那么样，thin
domain
object，外加Dao层和Service层，单向依赖，分层很清楚，要么就向rails那样，就是一个model，管你dao还是service，全
部都在model里面。<br />赫赫，请问，没有domain model ,何来dao ，何来敲击键盘而来的代码？
<br />dao依赖domain model是很理所当然的。 不过让domain model依赖于dao，确实很拗口，所以dao肯定需要一个接口，domain model依赖于dao的接口也是很合理的。这里的关键在于：
<br />把DAO已经published的接口作为整个领域模型比较核心的一部分。 如果设计比较好的ORM 关联可能会把引入query 导致的双向依赖的危险减至最小，不会因为DAO接口实现的失败导致整个领域模型的错误，而把这种错误转变为领域模型关联关系的设计错误。

<p>这里有个publish接口容易导致被误用的危险，DAO接口如果是领域模型提出的请求实现，那么这个设计就会很冒风险，因为如果一旦你的DAO接
口publish了，你就要冒着别的正在写domain
model的开发人员会耦合于你的接口，一旦你的接口publish了，改动就非常困难了，而且如果一旦发现因为需求分析不够导致的DAO接口逻辑有问
题，那么这个将是非常痛苦的重构/修改过程。
<br />所以关键在于让合理的关联代替复杂的查询。</p><p>说到接口，顺便说说对满天飞的interface的反感，我以前就是那样满天飞的，先在感觉飞的太高了。</p><p>接口其实就等同于代码隐藏，说句不好听的话就是代码私有化。 我发布一个接口，加上一些比较清晰的说明。
调用着一般都会只看接口说明感觉合适就直接IOC进来用了，久而久之就有可能被误用接口的危险。
如果没有接口，依赖代码就是文档的和相互可以修改的原则，那么大家都可以直入对方的正体，看一下对方代码的具体实现逻辑，有问题可以直接提出来探讨，这样
就减少了程序风险，而且也省去了来来回回反反复复修改interface 和实现的麻烦。
<br />接口就如同是一个盖子，盖住了很多东西，然而在代码极度共享和互改的环境中，还是少用为妙。</p>我的观点是一个重要的接口都应该提供一个抽象类来实现基本的骨架!这样当你的接口改动时只影响你的抽象类。而对实现接口的继承抽象类的子类没有影响。
其实接口只是定义mixin(混合类型)的理想选择(java中接口才允许多继承)，
例如：一个教练本身也是球员。那么我们可以定义一个mixin接口，组合一些新的方法让实现这个mixin的抽象类不仅具有Train和Play的职责，
还有组合产生的特性。<br />一个缺点：不支持分布式部署。无法把一个bean给fail over或者re-deploy。
<br />实际上，所有轻量级ioc容器真用起来都没什么用处，因为它们都无法应付分布式的需求。（jboss mc的作者跟我说的）<br /><p>呵呵？谁有分布式的需求？</p><p>spring不是支持集群了吗？分布式就用不着了吧</p><p>有一个收费的T字头的方案能帮助spring实现分布式吧，没有免费的实现是挺麻烦的。</p><p>我们的做法是在5台tomcat服务器前面放一台四层交换机之类的硬件，这样，相同的ip来访问时会被指派到同一台tomcat,因此不需要http session共享，也能达到类似的分布式效果，还节约了session共享的消耗。</p><div class="quote_div">说到接口，顺便说说对满天飞的interface的反感，我以前就是那样满天飞的，先在感觉飞的太高了。
<br /></div><p>一直觉得interface就是C++里的.h 头文件，好不容易java里不需要.h,脱了苦海，现在大家又争先恐后再入火坑。 </p><p>其实如果把interface用于动态proxy, cglib已经提供了解决方案，spring的OAOP,测试时的easyMock,都有cglib实现，性能比基于interface proxy的更高一点点。</p><p>如果是代码设计方面的，一定要看清楚实际情况再决定是否抽象interface。我觉得interface在代码设计方面最主要的应用其实是多重继承吧和firebody说的盖子功能吧。</p><p>所以springside里只有几个用到多重继承和webservice盖子的时候才用了interface. 比如dao, appfuse等sample为了演示多种dao方案才用interface阿，我们没事又不会换orm方案的，忙活这个接口没意义呀。</p><br /><img src ="http://www.blogjava.net/leekiang/aggbug/162228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2007-11-21 22:44 <a href="http://www.blogjava.net/leekiang/archive/2007/11/21/162228.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>事务</title><link>http://www.blogjava.net/leekiang/archive/2007/05/14/117419.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Mon, 14 May 2007 11:53:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2007/05/14/117419.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/117419.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2007/05/14/117419.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/117419.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/117419.html</trackback:ping><description><![CDATA[EJB中的事务配置是6种，而spring的是7种
<img src ="http://www.blogjava.net/leekiang/aggbug/117419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2007-05-14 19:53 <a href="http://www.blogjava.net/leekiang/archive/2007/05/14/117419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>