(由于实在是被2本800多页的SSH框架学习资料吓到之后,开始了‘投机取巧’的学习过程)
于是挑着看了资料书和网上关于struts2、spring、hibernate核心简介的内容,在了解这三个框架各自的工作流程之后,直接大胆的开始学习SSH框架整合(虽然网上资料太多太杂但多找几篇并对比学习还是能迅速掌握)。
在与各种Error打了一整天交道之后,终于整合出了第一个启动Tomcat无错的环境,感觉那叫一个爽,故而删了又搭建,来回爽了3、4次确认可以迅速搭建环境。
但是此时我对于其运行原理还是一窍不通,也就是虽然我搭建起了SSH的开发环境,但是我还不会写一个最简单的Helloword,囧一个先。
此时又被源码吓着了,其实主要是不会有效的看源码,于是乎放弃看源码学习的方法。好吧,怎么办呢?Baidu啊,Baidu不行就Google呗'SSH2 Demo',下了好多别人的demo,但是无奈发现很多看不懂(现在看来我看不懂的原因不仅仅在于我本人...)。
细细筛选下挑出一个实现基本增删改查功能的demo,拉进eclipse里,整体浏览了下目录结构,瞅了下web.xml,又瞄了下struts.xml发现挺冷清的,看来主场不再这诶。跟着线继续走,打开applicationContext.xml,哇塞!热闹诶!开会诶...看来在这里能解决大部分问题了!
慢慢研读这个applicationContext.xml(感叹一下,有网真赞!),在又经历一天各处取经之后。终于搞明白了SSH整合之后的工作原理,立马有一种拨开云雾见青天的感觉..原来,是这样...终于会简单的使用SSH框架了,剩下的就好办了!
唠叨完了 . . . 跟上笔记和感悟。
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- 定义使用C3P0连接池的数据源 -->
<bean id="mysql" class="org.apache.commons.dbcp.BasicDataSource">
<!-- 指定连接数据库的JDBC驱动 -->
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<!-- 连接数据库所用的URL -->
<property name="url"
value="jdbc:mysql://localhost:3306/travis">
</property>
<!-- 连接数据库的用户名及密码 -->
<property name="username" value="root"></property>
<property name="password" value="123"></property>
</bean>
<!-- 定义Hibernate的SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 依赖注入上面定义的数据源dataSource -->
<property name="dataSource">
<ref bean="mysql" />
</property>
<!-- 设置Hibernate的相关属性 -->
<property name="hibernateProperties">
<props>
<!-- 设置Hibernate的数据库方言 -->
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<!-- 设置Hibernate是否在控制台输出SQL语句,开发调试阶段通常设为true -->
<prop key="show_sql">true</prop>
<!-- 设置Hibernate一个提交批次中的最大SQL语句数 -->
<prop key="hibernate.jdbc.batch_size">20</prop>
</props>
</property>
</bean>
<!--定义Hibernate的事务管理器HibernateTransactionManager -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- 依赖注入上面定义的sessionFactory -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--定义Spring的事务拦截器TransactionInterceptor -->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!-- 依赖注入上面定义的事务管理器transactionManager -->
<property name="transactionManager" ref="transactionManager" />
<!-- 定义需要进行事务拦截的方法及所采用的事务控制类型 -->
<property name="transactionAttributes">
<props>
<!-- 以browse、list、load、get及is开头的所有方法采用只读型事务控制类型 -->
<prop key="browse*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="list*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
<!-- 所有方法均进行事务控制,如果当前没有事务,则新建一个事务 -->
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 定义BeanNameAutoProxyCreatorf进行Spring的事务处理-->
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 针对指定的bean自动生成业务代理 -->
<property name="beanNames">
<list>
<value>userService</value>
<value>*Service</value>
</list>
</property>
<!-- 这个属性为true时,表示被代理的是目标类本身而不是目标类的接口 -->
<property name="proxyTargetClass">
<value>true</value>
</property>
<!-- 依赖注入上面定义的事务拦截器transactionInterceptor -->
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
<!-- 装配通用数据库访问类BaseDAOImpl -->
<bean id="userDAO" class="com.hibernate.UserDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!-- 部署系统用户管理业务逻辑组件userServiceImpl -->
<bean id="userService"
class="com.service.userServiceImpl">
<property name="userDAO" ref="userDAO" />
</bean>
<!-- 部署Struts2负责系统用户管理的控制器userAction -->
<bean id="userAction" class="com.action.userAction"
scope="prototype">
<property name="service" ref="userService" />
</bean>
</beans>
其中引起注意的部分是进行spring事务处理部分的配置,因为看的资料多,所以发现竟然出现了很多种不同的class属性,如下:
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<bean class="org.springframework.aop.framework.autoproxy.TransactionProxyFactoryBean">
<bean id="userService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
2.示例代码
<!-- 定义TransactionProxyFactoryBean,该bean是个bean后处理器,无需被引用,因此没有id属性-->
<bean class="org.springframework.aop.framework.autoproxy.TransactionProxyFactoryBean">
<!-- 指定对满足哪些bean name的bean自动生成业务代理 -->
<property name="beanNames">
<!-- 下面是所有需要自动创建事务代理的bean-->
<list>
<value>*Dao</value>
</list>
<!-- 此处可增加其他需要自动创建事务代理的bean-->
</property>
<!-- 下面定义TransactionProxyFactoryBean所需的事务拦截器-->
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
<!-- 此处可增加其他新的Interceptor -->
</list>
</property>
</bean>
3.示例代码
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="myProxy" parent="baseTransactionProxy">
<property name="target" ref="myTarget"/>
</bean>
<bean id="yourProxy" parent="baseTransactionProxy">
<property name="target" ref="yourTarget"/>
</bean>
注意target
<!-- 截自某个配置文件 --!>
<bean id="userServiceTarget"
class="com.test.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target" ref="userServiceTarget"></property>
<property name="transactionManager" ref="transactionManager"></property>
<property name="transactionAttributes">
<props>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="saveUserAction"
class="com.test.action.user.SaveUserAction" scope="prototype">
<property name="service" ref="userService"></property>
</bean>
<bean id="listUserAction"
class="com.test.action.user.ListUserAction" scope="prototype">
<property name="service" ref="userService"></property>
</bean>
笔记记录中...
(如果您知道我在文中所提及的疑惑,麻烦给予指点!谢谢!)