
本站地址:http://www.bajiao123.com

基于struts+spring+ibatis的轻量级J2EE开发
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"> public String myActionMethod() {</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>//..work</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>return "success";</span></span>
<span style="color: #333333"><span style="font-size: 10pt"> }</span></span>
<span style="font-size: 10pt"><span style="color: #333333"> </span></span>
方法的返回值直接就是字符串,对应的是forward的名称,而不再是ActionForward对象,创建ActionForward对象的任务已经由BeanAction类代劳了。
另外,程序还提供了ActionContext工具类,该工具类封装了request 、response、form parameters、request attributes、session attributes和 application attributes中的数据存取操作,简单而线程安全,form bean类使用该工具类可以进一步从表现层框架解耦。
在这里需要特别指出的是,BeanAction类是对struts扩展的一个有益尝试,虽然提供了非常好的应用开发模式,但是它还非常新,一直在发展中。
图2 JpetStore 4.0具体实现
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction"</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>name="orderBean" scope="session"</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>validate="false"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><forward name="success" path="/order/ViewOrder.jsp"/></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></action></span></span>
<span style="font-size: 10pt"><span style="color: #333333"><span> </span></span></span>
此种方式表示,控制将被转发到"orderBean"这个form bean对象的"viewOrder"方法(行为)来处理。方法名取"path"参数的以"/"分隔的最后一部分。
2. Method Parameter
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction"</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>name="orderBean" parameter="viewOrder" scope="session"</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>validate="false"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><forward name="success" path="/order/ViewOrder.jsp"/></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></action></span></span>
<span style="font-size: 10pt"><span style="color: #333333"><span> </span></span></span>
此种方式表示,控制将被转发到"orderBean"这个form bean对象的"viewOrder"方法(行为)来处理。配置中的"parameter"参数表示form bean类上的方法。"parameter"参数优先于"path"参数。
3. No Method call
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction"</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>name="orderBean" parameter="*" scope="session"</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>validate="false"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><forward name="success" path="/order/ViewOrder.jsp"/></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></action></span></span>
<span style="font-size: 10pt"><span style="color: #333333"><span> </span></span></span>
此种方式表示,form bean上没有任何方法被调用。如果存在"name"属性,则struts把表单参数等数据填充到form bean对象后,把控制转发到"success"。否则,如果name为空,则直接转发控制到"success"。
这就相当于struts内置的org.apache.struts.actions.ForwardAction的功能
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"> <action path="/shop/viewOrder" type="org.apache.struts.actions.ForwardAction"</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>parameter="/order/ViewOrder.jsp " scope="session" validate="false"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"> </action></span></span>
<span style="font-size: 10pt"><span style="color: #333333"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><set-property property="contextConfigLocation"</span></span>
<span style="color: #333333"><span style="font-size: 10pt">value="/WEB-INF/applicationContext.xml" /></span></span>
<span style="color: #333333"><span style="font-size: 10pt"></plug-in></span></span>
Spring在设计时就充分考虑到了与Struts的协同工作,通过内置的Struts Plug-in在两者之间提供了良好的结合点。但是,因为在这里我们一点也不改动JPetStore的控制层(这是JpetStore4.0的精华之一),所以本文不准备采用此方式来加载ApplicationContext。我们利用的是spring framework 的BeanFactory机制,采用自定义的工具类(bean工厂类)来加载spring的配置文件,从中可以看出Spring有多灵活,它提供了各种不同的方式来使用其不同的部分/层次,您只需要用你想用的,不需要的部分可以不用。
具体的来说,就是在com.ibatis.spring包下创建CustomBeanFactory类,spring的配置文件applicationContext.xml也放在这个目录下。以下就是该类的全部代码,很简单:
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt">public final class CustomBeanFactory {</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>static XmlBeanFactory factory = null;</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>static {</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>Resource is = new</span></span>
<span style="color: #333333"><span style="font-size: 10pt">InputStreamResource( CustomBeanFactory.class.getResourceAsStream("applicationContext.xml"));</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>factory = new XmlBeanFactory(is);<span> </span></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>}</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>public static Object getBean(String beanName){</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>return factory.getBean(beanName);</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>}</span></span>
<span style="color: #333333"><span style="font-size: 10pt">}</span></span>
实际上就是封装了Spring 的XMLBeanFactory而已,并且Spring的配置文件只需要加载一次,以后就可以直接用CustomBeanFactory.getBean("someBean")来获得需要的对象了(例如someBean),而不需要知道具体的类。CustomBeanFactory类用于{耦合1}的解耦。
CustomBeanFactory类在本文中只用于表现层的form bean对象获得service类的对象,因为我们没有把form bean对象配置在applicationContext.xml中。但是,为什么不把表现层的form bean类也配置起来呢,这样就用不着这CustomBeanFactory个类了,Spring会帮助我们创建需要的一切?问题的答案就在于form bean类是struts的ActionForm类!如果大家熟悉struts,就会知道ActionForm类是struts自动创建的:在一次请求中,struts判断,如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。因此formbean类的对象就不能由spring来创建,但是service类以及数据层的DAO类可以,所以只有他们在spring中配置。
所以,很自然的,我们就创建了CustomBeanFactory类,在表现层来衔接struts和spring。就这么简单,实现了另一种方式的{耦合一}的解耦。
3.3. 表现层
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>private static final AccountService accountService = AccountService.getInstance();</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>private static final CatalogService catalogService = CatalogService.getInstance();</span></span>
<span style="font-size: 10pt"><span style="color: #333333"><span> </span></span></span>
改造后的源代码如下
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>private static final AccountService accountService = (AccountService)CustomBeanFactory.getBean("AccountService");</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>private static final CatalogService catalogService = (CatalogService)CustomBeanFactory.getBean("CatalogService");</span></span>
其他的几个presentation类以同样方式改造。这样,表现层就完成了。关于表现层的其它部分如JSP等一概不动。也许您会说,没有看出什么特别之处的好处啊?你还是额外实现了一个工厂类。别着急,帷幕刚刚开启,spring是在表现层引入,但您发没发现:
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt">public class BaseSqlMapDao extends SqlMapClientDaoSupport {</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>protected static final int PAGE_SIZE = 4;</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>protected SqlMapClientTemplate smcTemplate = this.getSqlMapClientTemplate();</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>public BaseSqlMapDao() { </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>}</span></span>
<span style="color: #333333"><span style="font-size: 10pt">}</span></span>
使BaseSqlMapDao类改为继承于Spring提供的SqlMapClientDaoSupport类,并定义了一个保护属性smcTemplate,其类型为SqlMapClientTemplate。关于SqlMapClientTemplate类的详细说明请参照附录中的"Spring中文参考手册"
2、修改DAO实现类
所有的DAO实现类还是继承于BaseSqlMapDao类,实现相应的DAO接口,但其相应的DAO操作委托SqlMapClientTemplate来执行,以AccountSqlMapDao类为例,部分代码如下:
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>public List getUsernameList() {</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>return smcTemplate.queryForList("getUsernameList", null);</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>}</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>public Account getAccount(String username, String password) {</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>Account account = new Account();</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>account.setUsername(username);</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><span> </span>account.setPassword(password);</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>return (Account) smcTemplate.queryForObject("getAccountByUsernameAndPassword", account);</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>}</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>public void insertAccount(Account account) {</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><span> </span>smcTemplate.update("insertAccount", account);</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><span> </span>smcTemplate.update("insertProfile", account);</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><span> </span>smcTemplate.update("insertSignon", account);</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>}</span></span>
<span style="font-size: 10pt"><span style="color: #333333"><span> </span></span></span>
就这么简单,所有函数的签名都是一样的,只需要查找替换就可以了!
3、除去工厂类以及相应的配置文件
除去DaoConfig.java这个DAO工厂类和相应的配置文件dao.xml,因为DAO的获取现在要用spring来管理。
4、DAO在Spring中的配置(applicationContext.xml)
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><bean id="dataSource" </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>class="org.springframework.jdbc.datasource.DriverManagerDataSource"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><property name="driverClassName"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><value>org.hsqldb.jdbcDriver</value></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></property></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><property name="url"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><value>jdbc:hsqldb:hsql://localhost/xdb</value></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></property></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><property name="username"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><value>sa</value></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></property></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><property name="password"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><value></value></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></property></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></bean><span> </span></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><!-- ibatis sqlMapClient config --></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><bean id="sqlMapClient" </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><property name="configLocation"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><value> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>classpath:com\ibatis\jpetstore\persistence\sqlmapdao\sql\sql-map-config.xml</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></value></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></property></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><property name="dataSource"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><ref bean="dataSource"/></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></property><span> </span></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></bean></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><!-- Transactions --></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><span> </span><bean id="TransactionManager" </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>class="org.springframework.jdbc.datasource.DataSourceTransactionManager"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><property name="dataSource"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><ref bean="dataSource"/></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></property></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></bean></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><!-- persistence layer --></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><bean id="AccountDao" </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>class="com.ibatis.jpetstore.persistence.sqlmapdao.AccountSqlMapDao"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><property name="sqlMapClient"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><ref local="sqlMapClient"/></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></property></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></bean></span></span>
<span style="font-size: 10pt"><span style="color: #333333"><span> </span></span></span>
具体的语法请参照附录中的"Spring中文参考手册"。在这里只简单解释一下:
1. 我们首先创建一个数据源dataSource,在这里配置的是hsqldb数据库。如果是ORACLE数据库,driverClassName的值是"oracle.jdbc.driver.OracleDriver",URL的值类似于"jdbc:oracle:thin:@wugfMobile:1521:cdcf"。数据源现在由spring来管理,那么现在我们就可以去掉properties目录下database.properties这个配置文件了;还有不要忘记修改sql-map-config.xml,去掉<properties resource="properties/database.properties"/>对它的引用。
2. sqlMapClient节点。这个是针对ibatis SqlMap的SqlMapClientFactoryBean配置。实际上配置了一个sqlMapClient的创建工厂类。configLocation属性配置了ibatis映射文件的名称。dataSource属性指向了使用的数据源,这样所有使用sqlMapClient的DAO都默认使用了该数据源,除非在DAO的配置中另外显式指定。
3. TransactionManager节点。定义了事务,使用的是DataSourceTransactionManager。
4. 下面就可以定义DAO节点了,如AccountDao,它的实现类是com.ibatis.jpetstore.persistence.sqlmapdao.AccountSqlMapDao,使用的SQL配置从sqlMapClient中读取,数据库连接没有特别列出,那么就是默认使用sqlMapClient配置的数据源datasource。
这样,我们就把持久层改造完了,其他的DAO配置类似于AccountDao。怎么样?简单吧。这次有接口了:) AccountDao接口->AccountSqlMapDao实现。
3.5. 业务层
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><bean id="OrderService" </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><property name="transactionManager"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><ref local="TransactionManager"></ref></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></property></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><property name="target"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><bean class="com.ibatis.jpetstore.service.OrderService"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><property name="itemDao"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><span> </span><ref bean="ItemDao"/></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></property></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><property name="orderDao"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><ref bean="OrderDao"/></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></property></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><property name="sequenceDao"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><ref bean="SequenceDao"/></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></property></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></bean></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></property></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><property name="transactionAttributes"></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><props></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span><prop key="insert*">PROPAGATION_REQUIRED</prop></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></props></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></property></span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span></bean></span></span>
<span style="font-size: 10pt"><span style="color: #333333"><span> </span></span></span>
定义了一个OrderService,还是很容易懂的。为了简单起见,使用了嵌套bean,其实现类是com.ibatis.jpetstore.service.OrderService,分别引用了ItemDao,OrderDao,SequenceDao。该bean的insert*实现了事务管理(AOP方式)。TransactionProxyFactoryBean自动创建一个事务advisor,该advisor包括一个基于事务属性的pointcut,因此只有事务性的方法被拦截。
2、业务类的修改
以OrderService为例:
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt">public class OrderService {</span></span>
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>/* Private Fields */</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>private ItemDao itemDao;</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>private OrderDao orderDao;</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>private SequenceDao sequenceDao;</span></span>
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>/* Constructors */</span></span>
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>public OrderService() {</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>}</span></span>
<span style="color: #333333"><span style="font-size: 10pt"> </span></span>
<span style="color: #333333"><span style="font-size: 10pt">/**</span></span>
<span style="color: #333333"><span style="font-size: 10pt"> * @param itemDao è¦?设置ç?? itemDaoã??</span></span>
<span style="color: #333333"><span style="font-size: 10pt"> */</span></span>
<span style="color: #333333"><span style="font-size: 10pt">public final void setItemDao(ItemDao itemDao) {</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>this.itemDao = itemDao;</span></span>
<span style="color: #333333"><span style="font-size: 10pt">}</span></span>
<span style="color: #333333"><span style="font-size: 10pt">/**</span></span>
<span style="color: #333333"><span style="font-size: 10pt"> * @param orderDao è¦?设置ç?? orderDaoã??</span></span>
<span style="color: #333333"><span style="font-size: 10pt"> */</span></span>
<span style="color: #333333"><span style="font-size: 10pt">public final void setOrderDao(OrderDao orderDao) {</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>this.orderDao = orderDao;</span></span>
<span style="color: #333333"><span style="font-size: 10pt">}</span></span>
<span style="color: #333333"><span style="font-size: 10pt">/**</span></span>
<span style="color: #333333"><span style="font-size: 10pt"> * @param sequenceDao è¦?设置ç?? sequenceDaoã??</span></span>
<span style="color: #333333"><span style="font-size: 10pt"> */</span></span>
<span style="color: #333333"><span style="font-size: 10pt">public final void setSequenceDao(SequenceDao sequenceDao) {</span></span>
<span style="color: #333333"><span style="font-size: 10pt"><span> </span>this.sequenceDao = sequenceDao;</span></span>
<span style="color: #333333"><span style="font-size: 10pt">}</span></span>
<span style="color: #333333"><span style="font-size: 10pt">//å?©ä¸?ç??é?¨å??</span></span>
<span style="font-size: 10pt"><span style=""Courier New"; color: #333333">……</span><span style="color: #333333">.</span></span>
<span style="color: #333333"><span style="font-size: 10pt">}</span></span>
红色部分为修改部分。Spring采用的是Type2的设置依赖注入,所以我们只需要定义属性和相应的设值函数就可以了,ItemDao,OrderDao,SequenceDao的值由spring在运行期间注入。构造函数就可以为空了,另外也不需要自己编写代码处理事务了(事务在配置中声明),daoManager.startTransaction();等与事务相关的语句也可以去掉了。和原来的代码比较一下,是不是处理精简了很多!可以更关注业务的实现。
4. 结束语
本站地址:http://www.bajiao123.com

