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

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同时云云这些异常

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

M1ko

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值