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>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="typeAliasesPackage" value="org.seckill.entity"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<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"/>
<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 ...>
<mvc:annotation-driven/>
<mvc:default-servlet-handler />
<context:component-scan base-package="org.seckill.controller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<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>
<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>
<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同时云云这些异常