SSM整合:Spring XML文件
Posted 胡乐天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSM整合:Spring XML文件相关的知识,希望对你有一定的参考价值。
SSM整合可能用到的XML文件:
》数据库注解文件扫描
》spring注解扫描
》Mapper扫描bean
》配置数据源
》配置工厂bean
》事务管理bean及切面
》SchemaBased方式组成切面
》Aspectj方式组成切面
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"><!--设置自动注入-->
<!--属性文件扫描-->
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<!--配置注解扫描-->
<context:component-scan base-package="com.lt.service.impl"></context:component-scan>
<!--配置数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="$driver"></property>
<property name="url" value="$url"></property>
<property name="username" value="$user"></property>
<property name="password" value="$password"></property>
</bean>
<!--配置工厂bean-->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="typeAliasesPackage" value="com.lt.pojo"></property>
</bean>
<!--配置Mapper扫描bean-->
<bean id="mapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--如果使用sqlSessionFactory,则会导致properties文件还没加载,就实例化了,导致出错-->
<property name="sqlSessionFactoryBeanName" value="factory"></property>
<property name="basePackage" value="com.lt.mapper"></property>
</bean>
<!--配置事务管理bean-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<!--那些方法需要有事务控制,支持通配符*
readonly="true" 是否是只读事务,如果为true,则告诉数据库此事务为只读数据,对性能有一定提升,所以只要是查询方法,建议使用只读事务
如果未false(默认值) 则说明事务需要提交-->
<!--
propagation=""
事务传播行为:
- required(默认值) 如果当前有事务,就在事务中执行,如果没有事务,新建一个事务
- supports:如果当前有事务就在事务中执行,如果当前没有事务,就在非事务状态下执行
- mandatory:必须在事务内部执行,如果当前有事务,就在事务中执行,如果当前没有事务,则报错
- requires_new:必须在事务中执行,如果当前没有事务,则新建事务,如果当前有事务,把当前事务挂起,并开启一个新的事务
- not_supported:必须在非事务状态下执行,如果当前没有事务,正常执行,如果当前有事务,把当前事务挂起
- never:必须在非事务状态下执行,如果当前没有事务,正常执行,如果当前有事务,报错
- nested:必须在事务状态下执行,如果没有事务,新建事务,如果有事务,创建一个嵌套事务
-->
<!--
isolation=""
事务隔离级别:
事务隔离级别(4种):为了解决上边提及的并发问题,主流关系型数据库都会提供四种事务隔离级别。
- 读未提交(Read Uncommitted):可能会造成脏读、不可重复读、幻读
- 读已提交(Read Committed):可能会导致不可重复读、幻读
- 可重复读(Repeatable Read):mysql默认事务隔离级别,避免了脏读和不可重复读,但是有可能会造成幻读。
》造成幻读的原因:mysql的《持续非锁定读》,它的多版本化来给一个查询展示某个时间点处数据库的快照。查询看到在那个时间点之前被提交的那些确切事务做的更改,并且没有其后的事务或未提交事务做的改变。这个规则的例外是,查询看到发布该查询的事务本身所做的改变。这个例外导致了可能会发生幻读。
A事务中读取两次(select * from table_A),在第一次读取之后,在第二次读取之前,事务B插入到table_A中一条数据,这个时候,读取的依旧是原先的快照,但是如果在事务A读取第二次之前,事务A做了增删改操作,这时候就会导致快照更新,事务A读取第二次就会是新的快照,再次查询(select * from )时 ,所得到的集合就和第一次不一致了。
- Serializable(可序列化、可串行):提供严格的事务隔离级别,事务执行一个接着一个的执行,不能并发。仅仅通过行级锁是无法实现序列化的
-->
<tx:method name="sel*" read-only="true"/>
<tx:method name="ins*"/>
<tx:method name="up*"/>
<tx:method name="del*"/>
</tx:attributes>
</tx:advice>
<!--配置事务管理切面-->
<aop:config>
<aop:pointcut id="mp" expression="execution(* com.bjsxt.service.impl.*.*(..))"/>
<aop:advisor advice-ref="advice" pointcut-ref="mp"></aop:advisor>
</aop:config>
<!--Aop组装:SchemaBased方式的配置-->
<bean id="before" class="com.lt.advice.MyAdviceMethodBeforeAdvice"></bean>
<bean id="after" class="com.lt.advice.MyAdviceAfterReturningAdvice"></bean>
<bean id="round" class="com.lt.advice.MyAdviceMethodInterceptor"></bean>
<bean id="myThrow" class="com.lt.advice.MyThrow"></bean>
<!--aop组装规则-->
<aop:config>
<aop:pointcut id="point" expression="execution(* com.lt.service.impl.UserInfoServiceImpl.userLogin(..))"/>
<aop:advisor advice-ref="before" pointcut-ref="point"></aop:advisor>
<aop:advisor advice-ref="after" pointcut-ref="point"></aop:advisor>
<aop:advisor advice-ref="round" pointcut-ref="point"></aop:advisor>
<!--异常通知-->
<aop:advisor advice-ref="myThrow" pointcut-ref="point"></aop:advisor>
</aop:config>
<!--Spring AOP配置:Aspectj方式-->
<!-- 配置切点bean-->
<bean id="us" class="com.lt.service.impl.TestServiceImpl"></bean>
<!-- 配置通知bean-->
<bean id="advice" class="com.lt.advice.MyAdvice"></bean>
<!-- 组装切面-->
<aop:config>
<aop:aspect ref="advice">
<aop:pointcut id="my" expression="execution(* com.lt.service.impl.TestServiceImpl.point(String,int)) and args(name,age)"></aop:pointcut>
<aop:pointcut id="my1" expression="execution(* com.lt.service.impl.TestServiceImpl.point(String,int))"></aop:pointcut>
<aop:before method="testBefore" pointcut-ref="my" arg-names="name,age"></aop:before>
<aop:around method="testRound" pointcut-ref="my" arg-names="name,age"></aop:around>
<!-- <aop:after method="testAfter" pointcut-ref="my"></aop:after>-->
<aop:after-returning method="testAfter" pointcut-ref="my" arg-names="name,age"></aop:after-returning>
<aop:after-throwing method="testException" pointcut-ref="my" arg-names="name,age"></aop:after-throwing>
</aop:aspect>
</aop:config>
</beans>
以上是关于SSM整合:Spring XML文件的主要内容,如果未能解决你的问题,请参考以下文章