终于来到了Spring整合Mybatis、Struts2
一、稍微简单一点的Struts2的整合
其核心思想在于使用Ioc容器来管理Struts2中Action的生命周期,这样才能使得Action中所依赖的对象被注入。接下来就是快速整合的过程
:
1、更改web.xml
让Web容器来接手Ioc容器的创建!
<!-- Spring配置 -->
<!-- 配置Spring配置文件路径,好让ContextLoaderListener对其加载与解析-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:applicationContext.xml
</param-value>
</context-param>
<!-- 配置Spring上下文监听器,它的作用就是在启动WEB容器时,就会自动装在我们applicationContext.xml配置-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
2、设置Struts2中的常量struts.objectFactory
这一操作是告诉Struts2,它已经被Spring接手了
struts.objectFactory=spring
(我这里的设置是在struts.properties
中设置的,其他设置方式自行百度吧)
3、在applicationContext.xml中注册所有Action
对!就是bean那玩意儿
<!-- 注册action -->
<!--id这这儿--!>
<bean id="addBook" class="com.woniu.lib.action.addBook">
<property name="bookBeanDao" ref="BookBeanDaoImp"></property>
</bean>
基本步骤就是上面三步了,比把大象放入冰箱中简单多了。值得注意的是:struts.xml中action标签中的class要和上面的id对应!!!
<--!class在这儿!-->
<action name="addBook" class="addBook" method="add">
<result name="input">/manager.jsp</result>
</action>
二、稍微难一点的Mybatis的整合
1、先基操一波applicationContext.xml
a).先将mybaits数据源注入到容器
..( 同时将MyBatis.xml中的environments标签中的内容去掉)
<!-- 先将mybaits数据源注入到容器 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/lib_manage?useSSL=true"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
b).注册一个sqlsessionfactory对象
<!-- 注册一个sqlsessionfactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 在spring容器中加载mybaits配置文件 -->
<property name="configLocation" value="classpath:config.xml"></property>
</bean>
c).注册一个自动扫描接口的玩意儿
<!-- 自动扫描接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描dao下所有接口,批量生成实现 -->
<property name="basePackage" value="com.woniu.lib.dao"></property>
<!-- 自动注入sqlsessionfactory -->
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
有了这个东西就不用再单独去写Mybatis中sql语句接口的实现类了
要想得到接口的实现类可以直接getBean那个实现类的名字
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
context.getBean("IBookBeanDao");
}
2、有一点麻烦的事物
一旦牵涉到数据库就离不开事物,一说起事物我就头大!!!不吐槽了,直接进入快乐的代码搬运阶段-。-
a).首先得注册事物管理器
Spring接手Mybatis后事物默认自动提交
(貌似可以设置)
<!-- 注册一个事务管理器 -->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
b1).在xml中设置事物属性
这里的核心思想就是使用AOP编程将事物提升到业务层
<!-- 使用aop编程,将事务提升到业务层 -->
<bean id="tranProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!--增强的目标对象--!>
<property name="target" ref="transferService"></property>
<!--将事务提升到业务的核心配置--!>
<property name="transactionManager" ref="transactionManager"></property>
<!--配置事务的属性--!>
<property name="transactionAttributes">
<props>
<!--配置隔离级别和传播特性--!>
<prop key="transfer">PROPAGATION_REQUIRED,ISOLATION_DEFAULT</prop>
<prop key="transfer">-TransactionException</prop>
</props>
</property>
</bean>
使用这种方式配置事物的话,问题就在于每一个Service都要给它配一个TransactionProxyFactoryBean,就比较麻烦(官方文档上有一种写法不麻烦,这里我就我写出来了,因为我打算以后用注解来搞定)。
b2).注解设置事物属性
@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,rollbackFor=TransactionException.class)
@Override
public void transfer(int aid, int bid, int money) {
//a账户要减钱
sdao.update(aid, money);
if(1==1){
throw new TransactionException("受检查异常");
}
//b账户要加钱
bdao.update(bid, money);
}
单看代码和配置事物这一块是不麻烦的,但是要搞定什么隔离级别和传播特性以及什么时候用什么就有点头大了。