SpringMVC配置
配置数据源
<!-- 引入外部数据源配置信息 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:${env.active}/jdbc.properties</value>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 使用JNDI -->
<!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> -->
<!-- <property name="jndiName"> -->
<!-- <value>crm</value> -->
<!-- </property> -->
<!-- </bean> -->
<!-- 配置Session工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis.cfg.xml"/>
<property name="mapperLocations" value="classpath*:com/*/*/sql/*.xml"/>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<bean id="basicDao" class="com.jdf.core.dao.BasicDaoImpl">
<property name="sqlSessionTemplate" ref="sqlSession"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 定义个通知,指定事务管理器 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="tx*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="load*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="search*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!-- 配置一个切入点 -->
<aop:pointcut id="devServiceMethods" expression="execution(* com.swxc.*.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="devServiceMethods"/>
</aop:config>
</beans>
配置DispatcherServlet
servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 可以自定义servlet.xml配置文件的位置和名称,默认为WEB-INF目录下,名称为[<servlet-name>]-servlet.xml,如spring-servlet.xml
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value> 默认
</init-param>
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!– 扫描controller处理类.为了创建对象. –>
<context:component-scan base-package=”cn.bdqn.controller”></context:component-scan>
<!– 支持映射器的注解使用. –>
<mvc:annotation-driven></mvc:annotation-driven>
<!– 配置视图解析器 –>
<bean
class=”org.springframework.web.servlet.view.InternalResourceViewResolver”>
<property name =”prefix” value=”/” />
<property name = “suffix” value=”.jsp” />
</bean>
<!– 静态资源的配置: 可直接设置其WEB-INF外的资源访问. 不支持内部资源访问.因为此配置将进行的是重定向的形式进行资源访问的.–>
<mvc:resources location=”/resource/js/” mapping=”/resource/js/**”></mvc:resources>
<mvc:resources location=”/resource/css/” mapping=”/resource/css/**”></mvc:resources>
<mvc:resources location=”/resource/img/” mapping=”/resource/img/**”></mvc:resources>
<!– 拦截器配置 –>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path=”/**”/>
<bean class=”cn.bdqn.utils.LoginInterceptor”></bean>
</mvc:interceptor>
</mvc:interceptors>
<!– 配置错误处理器: –>
<bean id=”handlerExceptionResolver” class=”cn.bdqn.utils.MyExceptionResolver”></bean>
<!– 配置上传解析器: –>
<bean id=”multipartResolver” class=”org.springframework.web.multipart.commons.CommonsMultipartResolver”>
<!– 配置上传限制大小: 2M–>
<property name=”maxUploadSize”>
<value>2097152</value>
</property>
</bean>
</beans>
Mybatis配置
延迟加载:
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
<setting name="lazyLoadTriggerMethods" value="true"/>
</settings>
aggressiveLazyLoading:当该参数设置为true时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载,反之,每种属性都将按需加载。当我们从数据库中查询到数据后会给实体类中关联对象赋值,会调用关联对象属性的setter方法,这会触发上述规则,导致本该延迟加载的属性直接加载,为了避免这种情况,需要将其设置为false。
lazyLoadingEnabled:开启全局延迟加载,不用手动在单个关联中配置。
lazyLoadTriggerMethods:当调用配置中的方法时,加载全部的延迟加载数据。默认值是“equals,clone,hashCode,toString”。
延迟加载有时候会取不到值的问题:mybatis延迟加载时通过动态代理实现的,当调用配置为延迟加载的属性方法时,动态代理的操作会被触发,这些额外的操作就是通mybatis的sqlSession去执行嵌套的SQL的。由于在和某些框架集成时,sqlSession的生命周期交给了框架来管理,因此当对象超出sqlsession生命周期调用时,会由于链接关闭等问题而抛出异常。在和spring集成时,要确保只能在Service层调用延迟加载的属性。当结果从service层返回至Controller层时,如果获取延迟加载的属性值,会因sqlsession已经关闭而抛出异常。
事务回滚
spring-mvc.xml中配置了
<!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 -->
<context:component-scan base-package="com.ms.controller" />
开启了自动扫描,发现service层并不能回滚。
在spring-mvc.xml添加
<context:component-scan base-package="com.njzaizao">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
此为:扫描所有的controller 但是不扫描service
这样service层就能自动开启事务了
但是这样有个问题,service层不能使用try catch
如果必须在service层捕捉异常的话可使用 注解 @Transactional
maven生命周期
idea工具maven projects里面有9种生命周期,生命周期是包含在一个项目构建中的一系列有序的阶段。clean、validate、compile、test、package、verify、install、build、site和deploy。
最常用的两种打包方法:
- clean,package(如果报错,很可能就是jar依赖的问题)
- clean,install
clean
我们在使用maven的构建项目会产生一个target文件,但我们修改了代码后就需要使用clean清楚target,重新生成target。
compile
编译源码,编译生成class文件,编译命令,只编译选定的目标,不管之前是否已经编译过,会在你的项目路径下生成一个target目录,在该目录中包含一个classes文件夹,里面全是生成的class文件及字节码文件。
package
打包,将工程文件打包为指定的格式,例如JAR,WAR等。这个命令会在你的项目路径下一个target目录,并且拥有compile命令的功能进行编译,同时会在target目录下生成项目的jar/war文件。如果a项目依赖于b项目,打包b项目时,只会打包到b项目下target下,编译a项目时就会报错,因为找不到所依赖的b项目,说明a项目在本地仓库是没有找到它所依赖的b项目,这是可以用install命令。
install
安装至本地仓库,将包安装至本地仓库,以让其它项目依赖。该命令包含了package命令功能,不但会在项目路径下生成class文件和jar包,同时会在你的本地maven仓库生成jar文件,供其他项目使用。