<?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:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> <!-- 读取资源文件 --> <!-- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties" /> </bean> --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <!-- <value>file:${configPath}/dataSource.properties</value> --> <value>classpath:dataSource.properties</value> <!-- <value>/WEB-INF/config/dataSource.properties</value> --> </list> </property> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>${driverClassName}</value> </property> <property name="password"> <value>${password}</value> </property> <property name="username"> <value>${username}</value> </property> <property name="url"> <value>${url}</value> </property> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis-config.xml" /> <property name="dataSource" ref="dataSource" /> </bean> <!-- spring 事物管理针对anotation的问题 <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /> 只能针对Web层Service,DAO层不能包含在里面. 如果有多个package,使用","分隔即可. 2.在XML中需要声明service的名字与class <context:component-scan base-package="com.tanghsk.mock.admin.right.action"/> <bean id="examRightService" class="com.tanghsk.mock.admin.right.service.ExamRightService"></bean> --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.tanghsk.mock.admin" /> </bean> <bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" /> <!-- 启用用户的缓存功能 --> <!-- <bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache"> <property name="cache" ref="userEhCache" /> </bean> <bean id="userEhCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheName" value="userCache" /> <property name="cacheManager" ref="cacheManager" /> </bean> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" /> spring security自带的与权限有关的数据读写Jdbc模板 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean> 在这个类中,你就可以从数据库中读入用户的密码,角色信息,是否锁定,账号是否过期等 用户详细信息管理:数据源、用户缓存(通过数据库管理用户、角色、权限、资源)。 <bean id="userDetailsManager" class="avatar.base.security.MyUserDetailsService"> <property name="pubUsersHome" ref="pubUsersHome" /> <property name="pubAuthoritiesResourcesHome" ref="pubAuthoritiesResourcesHome" /> <property name="dataSource" ref="dataSource" /> <property name="userCache" ref="userCache" /> </bean> --> <!-- <bean id="exceptionHandler" class="com.tanghsk.util.MyException"></bean> --> <!-- 事务配置 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="logs" class="com.tanghsk.mock.admin.interceptor.LogInterceptor"></bean> <!--事务拦截器 xml schema配置方法 注解的配置与此不同--> <!-- 以下为spring 事务设置 --> <!-- 拦截代理对象,为了给业务逻辑对象增加事务处理 --> <!-- transactionAttributes属性可以设置事务处理的方式,事务隔离级别,是否只读三个属性,用逗号隔开 事务隔离级别各数据库系统不完全支持, 一般不设置,用默认的即可 。 事务处理选项有如下几个: (前面2个常用) PROPAGATION_REQUIRED - 需要事务处理。如果当前不存在事务环境,则创建一个 PROPAGATION_SUPPORTS - 如果当前存在事务环境,则作为其中的一部分。如果不存在,则按非事务方式执行 PROPAGATION_REQUIRES_NEW - 需要事务处理。 并总是开启一个新事务。如果已经存在事务环境,则挂起之 PROPAGATION_MANDATORY - 执行到指定方法时,必须已经存在事务环境,否则出错 PROPAGATION_NEVER - 不支持事务操作,如果存在事务环境会出错 PROPAGATION_NOT_SUPPORTED - 不支持事务操作。如果存在事务,则挂起 --> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="transactionAttributes"> <props> <!-- key表示匹配DAO中的方法名,例如:save*表示所有前缀为save的方法 --> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="del*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <!-- 自动代理 xml schema的配置方式--> <!-- 自动代理 非AspectJ切面,非注解的方式 产生代理的是类,不能是接口 Spring代理有两种方式,一种时对接口的代理,另一种是用CGLIB代理方式,对接口的代理是JDK采用的代理方式, 但在没有接口的情况下Srping通过设置proxyTargetClass等于 true来使用CGLIB代理,CGLIB是一种面向继承的代理方式。 同时还有一个proxyTarget属性用来指定代理的目标对象类。 --> <bean id="autoproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="proxyTargetClass"> <value>true</value> </property> <!-- 可以是Service或DAO层(最好是针对业务层*Service) --> <property name="beanNames"> <list> <value>*Service</value> </list> </property> <property name="interceptorNames"> <list> <value>logs</value> <value>transactionInterceptor</value> </list> </property> </bean> <!-- 基于@Transactional注解方式的事务管理 必要条件:1.须在×Service类里加上@Transactional注解 2.还需要在spring配置文件中加入下面这段 对标注了@Transactional注解的bean进行加工,织入事务管理切面 <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> 加入了此配置,spring就会自动装载那些使用了service等注解的bean,并为其设置属性 <context:component-scan base-package="com.maxjay.bank.service"/> // @Transactional可以使用在类和方法上,其默认的事务传播行为是REQUIRED,隔离级别为ISOLATION_DEFAULT,读写事务属性为读/写事务 // 该注解的属性有 propagation:事务传播行为;isolation:事务隔离级别,可以通过Isolation枚举类来设置; // readOnly:事务读写性;timeout:超时时间,int型,单位秒; // rollbackFor:定义需要进行回滚的异常类,如@Transactional(rollBackForClassName={SQLException.class,..}); // noRollBackFor:定义遇到时不回滚的类 --> <tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/> <!-- aspect 的声明 注解方式--> <!-- 自动代理AspectJ切面,两种方法 1、在配置文件里声明AnnotationAwareAspectJAutoProxyCreator进行自动代理。 <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" /> 2、也可以使用<aop:aspectj-autoproxy />标签自动代理。 --> <aop:aspectj-autoproxy proxy-target-class="true" /> <bean id="myAspect" class="com.tanghsk.mock.admin.aop.LogsAspect"></bean> <!-- spring context配置文件 --> <!-- 先排除*action$的扫描,因为程序里spring和springmvc的配置文件分开导入的,当spring-application加载时,spring-servlet还没完成加载, 所以扫描*action$里springmvc注解时会发生错误 --> <context:component-scan base-package="com.tanghsk.mock.admin"> <context:exclude-filter type="regex" expression=".*action$" /> </context:component-scan> <bean id="rightServiceCreat" class="com.tanghsk.mock.admin.right.service.ExamRightService"></bean> <!-- <bean id="RoleService" class="com.tanghsk.mock.admin.right.service.ExamRightService"></bean> --> </beans>