17年2月27日Java后台学习记录,SSM架构最终配置,Spring回滚机制。

来源:互联网 发布:初中校园网络文化活动 编辑:程序博客网 时间:2024/06/05 06:06

N:
1.之前Spring 托管 Mybatis时将配置写在同一个xml中,现在分成三部分dao service spring-mvc
spring-dao中 主要配置连接池、mybatis sqlSessionFactory、dao 包的位置:

<?xml version="1.0" encoding="UTF-8"?><beans ...>    <!-- 引入配置文件 -->    <bean id="propertyConfigurer"          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">        <property name="location" value="classpath:jdbc.properties" />    </bean>    <!--数据库连接池-->    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"          destroy-method="close">          ...    </bean>    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">        <property name="dataSource" ref="dataSource" />        <!--配置mybatis全局配置文件:mybatis-config.xml-->        <property name="configLocation" value="classpath:mybatis-config.xml"/>        <!--扫描entity包,使用别名,多个用;隔开-->        <property name="typeAliasesPackage" value="org.seckill.entity"/>        <!--扫描sql配置文件:mapper需要的xml文件-->        <property name="mapperLocations" value="classpath:mapper/*.xml"/>    </bean>    <!-- DAO接口所在包名,Spring会自动查找其下的类 -->    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">        <property name="basePackage" value="org.seckill.dao" />        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>    </bean></beans>

spring-service中配置service,component-scan扫描service包的位置,配置事务:

<?xml version="1.0" encoding="UTF-8"?><beans ...>    <context:component-scan base-package="org.seckill.service"/>    <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->    <bean id="transactionManager"          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <!--注入数据库的连接池-->        <property name="dataSource" ref="dataSource" />    </bean>    <tx:annotation-driven transaction-manager="transactionManager"/></beans>

spring-mvc中则是配置controller以及相关设置:

<?xml version="1.0" encoding="UTF-8"?><beans ...>    <!--1.开启SpringMvc的注解模式    2.提供一系列的支持,支持日期format xml json的默认支持-->    <mvc:annotation-driven/>    <!--静态资源配置    1.加入静态资源的处理    2.允许使用/做整体映射-->    <mvc:default-servlet-handler />    <context:component-scan base-package="org.seckill.controller"/>    <!-- 定义跳转的文件的前后缀 ,视图模式配置-->    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->        <property name="prefix" value="/WEB-INF/jsp/"/>        <property name="suffix" value=".jsp"/>    </bean></beans>

web.xml中之前是单独写一个content scan,servlet中单独配置 spring-mvc
现在则改为所有的 spring-*.xml都放在servlet中:

<?xml version="1.0" encoding="UTF-8"?><web-app ...>  <display-name>Archetype Created Web Application</display-name>  <!-- Spring MVC servlet -->  <servlet>    <servlet-name>SpringMVC</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>      <param-name>contextConfigLocation</param-name>      <param-value>classpath:spring/spring-*.xml</param-value>    </init-param>    <load-on-startup>1</load-on-startup>    <async-supported>true</async-supported>  </servlet>  <servlet-mapping>    <servlet-name>SpringMVC</servlet-name>    <!-- 此处可以可以配置成*.do,对应struts的后缀习惯 -->    <url-pattern>/</url-pattern>  </servlet-mapping>  <welcome-file-list>    <welcome-file>/index.jsp</welcome-file>  </welcome-file-list></web-app>

2.log4f使用:Logger logger = LoggerFactory.getLogger(this.getClass());
同时必须有配置文件,默认在resources中,logback.xml或者 logback-test.xml 配置官方说明

N:异常回滚问题
在spring-service中

    <bean id="transactionManager"          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <!--注入数据库的连接池-->        <property name="dataSource" ref="dataSource" />    </bean>    <tx:annotation-driven transaction-manager="transactionManager"/>

开启注释事务机制,在service的实现类中需要回滚的方法上添加@Transactional

需要注意的是spring只有捕捉到runtime异常才能回滚这就有两个问题:

(1)要使用回滚机制,第一种方式不能添加try-catch,直接throw抛出,第二种方式是在try-catch中再次将异常抛出:

throw new SeckillException("seckill data(md5) rewrite "); 或者catch (RepeatKillException e2) {            throw e2;    }

(2)第二个问题就是非runtime问题,如数据库断开连接,这些异常必须转化为runtime异常:

catch (Exception e) {            logger.error(e.getMessage(), e);            /**所有编译期异常(insert超时,数据库连接错误)转化为运行期异常             * 有错误就回滚*/            throw new SeckillException("seckill inner error", e);        }

N:1.AJAX app等需要json,添加一个dto层,存放Json映射对象
2.controller中调用service,进行异常处理。因为出现异常后,程序直接停止运行,因此需要try-catch同时云云这些异常

0 0
原创粉丝点击