目录
1.9 让 SpringMVC 扫描,不让 Spring 扫描
一、SSM整合步骤
1.1 整合步骤概述
1.1.1 整合思路
(1):先搭建整合的环境
(2):先把Spring的配置搭建完成
(3):再使用Spring整合SpringMVC框架
(4):最后使用Spring整合MyBatis框架
1.1.2 整合步骤
(1)开发准备
第一步:创建web工程
第二步:导入jar包
第三步:创建实体类
第四步:创建Dao
第五步:创建Service
第六步:创建Controller
(2)搭建Spring的环境
第一步:applicationContext.xml
第二步:log4j.properties文件
第三步:AccountService.java
第四步:测试类
(3)搭建SpringMVC环境
第一步:web.xml
第二步:springmvc.xml
第三步:AccountController.java
第四步:index.jsp
第五步:success.jsp(WEB-INF/pages/success.jsp)
(4)Spring整合SpringMVC框架
第一步:web.xml
第二步:AccountController.java(注入Service)
(5)Mybatis框架
第一步:sqlMapConfig.xml
第二步:AccountDao.java(AccountDao.xml)
第三步:测试TestMybatis.java
(6)Spring整合Mybatis框架
第一步:applicationContext.xml(重点)
第二步:AccountDao.java
第三步:TestSpringMybatis.java
第四步:AccountServiceImpl.java
第五步:AccountController.java
第六步:success.jsp
(7)配置Spring的声明式事务处理
第一步:applicationContext.xml
第二步:index.jsp(新增表单)
第三步:AccountController.java(保存)
1.2 开发准备
1.2.1 导入 jar 包
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<mysql.version>5.1.6</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
</properties>
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<finalName>ssm</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
</plugins>
</build>
1.2.2 创建实体类
public class Account implements Serializable{
private Integer id;
private String name;
private Double money;
}
1.2.3 创建 Dao
public interface AccountDao {
public List<Account> findAll();
public void saveAccount(Account account);
}
1.2.4 创建 Service
AccountService.java 接口
public interface AccountService {
public List<Account> findAll();
public void saveAccount(Account account);
}
AccountServiceImpl.java 实现类
public class AccountServiceImpl implements AccountService {
AccountDao accountDao;
@Override
public List<Account> findAll() {
System.out.println("执行 AccountService 的 findAll 方法...");
List<Account> list = accountDao.findAll();
}
@Override
public int saveAccount(Account account) {
System.out.println("执行 AccountService 的 saveAccount 方法...");
accountDao.saveAccount(account);
}
}
1.2.5 创建 Controller
public class AccountController {
AccountService accountService;
public String findAll(){
System.out.println("执行了 AccountController 中的 findAll 方法...");
List<Account> list = accountService.findAll();
System.out.println(list);
return "success";
}
public String saveAccount(Account account){
System.out.println("执行了 AccountController 中的 findAll 方法...");
accountService.saveAccount(account);
return "success";
}
}
1.3 搭建 Spring 的环境
1.3.1 applicationContext.xml
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.cpz.ssm">
<!-- 忽略某些注解,把Controller给忽略了 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
1.3.2 log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:/axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
1.3.3 AccountService.java
@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {
}
1.3.4 测试类
public class TestService {
// 测试 Service 层
@Test
public void testService(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
AccountService accountService = ac.getBean("accountService", AccountService.class);
accountService.findAll();
}
}
1.4 SpringMVC 框架
1.4.1 web.xml
<!--1:springmvc的核心控制器-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--2:解决post请求的乱码过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1.4.2 springmvc.xml
<!-- 1:组件扫描配置,扫描controller的注解,排除Service注解的扫描 -->
<context:component-scan base-package="com.cpz.ssm">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<!-- 排除Service注解的扫描,让spring扫描,否则事务可能会失效 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
<!-- 2:配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 3:设置静态资源不过滤,可以使用:-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!-- 4:开启对SpringMVC注解的支持 -->
<mvc:annotation-driven></mvc:annotation-driven>
1.4.3 AccountController.java
@Controller
@RequestMapping(value = "/account")
public class AccountController {
@Autowired
AccountService accountService;
@RequestMapping(value = "/findAll")
public String findAll(){
System.out.println("执行了 AccountController 中的 findAll 方法...");
List<Account> list = accountService.findAll();
System.out.println(list);
return "success";
}
1.4.4 index.jsp
<h3>账号操作</h3>
<a href="account/findAll">查询所有账号</a>
1.4.5 success.jsp
<h1>访问成功</h1>
1.5 Spring 整合 SpringMVC 框架
1.5.1 web.xml
<!-- 配置Spring的监听器,默认加载WEB-INF下的applicationContext.xml -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 该监听器默认只加载WEB-INF下的applicationContext.xml配置文件,通过contextConfigLocation改变位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
1.5.2 AccountController.java
@Controller
@RequestMapping(value = "/account")
public class AccountController {
@Autowired
AccountService accountService;
@RequestMapping(value = "/findAll")
public String findAll(){
System.out.println("执行了 AccountController 中的 findAll 方法...");
List<Account> list = accountService.findAll();
System.out.println(list);
return "success";
}
}
1.6 Mybatis 框架
1.6.1 sqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--2:别名-->
<typeAliases>
<package name="com.cpz.ssm.domain"></package>
</typeAliases>
<!--1:连接数据库-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql:///ssm"></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
</dataSource>
</environment>
</environments>
<!--3:映射文件-->
<mappers>
<!--配置文件,注解-->
<package name="com.cpz.ssm.dao"></package>
</mappers>
</configuration>
1.6.2 AccountDao.java
public interface AccountDao {
@Select(value = "select * from account")
public List<Account> findAll();
@Insert(value = "insert into account (name,money) values (#{name},#{money})")
public int saveAccount(Account account);
}
1.6.3 测试 TestMybatis.java
public class TestMybatis {
// 查询所有
@Test
public void findAll() throws IOException {
InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
AccountDao accountDao = sqlSession.getMapper(AccountDao.class); // 反射
List<Account> list = accountDao.findAll();
for (Account account : list) {
System.out.println(account);
}
sqlSession.close();
is.close();
}
// 新增
@Test
public void save() throws IOException {
InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
AccountDao accountDao = sqlSession.getMapper(AccountDao.class); // 反射
Account account = new Account();
account.setName("张三");
account.setMoney(200d);
int row = accountDao.saveAccount(account);
System.out.println(row);
sqlSession.commit(); // 提交
sqlSession.close();
is.close();
}
}
1.7 Spring 整合 Mybatis 框架
1.7.1 applicationContext.xml
把SqlMapConfig.xml配置文件中的内容配置到applicationContext.xml配置文件中
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!-- 1:配置C3P0的连接池对象 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--2:创建spring整合mybatis的核心对象,SqlSessionFactoryBean
<property name="configLocation" value="classpath:sqlMapConfig.xml"></property>
* 通过spring加载mybatis的配置文件(1个)
<property name="mapperLocations">
<set>
<value>classpath:com/itheima/ssm/dao/*Dao.xml</value>
</set>
</property>
* 通过spring加载mybatis的映射文件(多个)
<property name="typeAliasesPackage" value="com.itheima.ssm.domain"></property>
* 别名
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--3:添加一个映射配置,让Dao被spring管理,可以在Service上注入Dao-->
<bean id="scannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.cpz.ssm.dao"></property>
</bean>
1.7.2 TestSpringMybatis
public class TestSpringMybatis {
@Test
public void testFindAllSpring(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
AccountService accountService = ac.getBean("accountService", AccountService.class);
List<Account> list = accountService.findAll();
System.out.println(list);
}
}
1.7.3 AccountServiceImpl.java
@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {
@Autowired
AccountDao accountDao;
@Override
public List<Account> findAll() {
System.out.println("执行 AccountService 的 findAll 方法...");
List<Account> list = accountDao.findAll();
return list;
}
@Override
public int saveAccount(Account account) {
System.out.println("执行 AccountService 的 saveAccount 方法...");
int row = accountDao.saveAccount(account);
return row;
}
}
1.7.4 AccountController.java
@Controller
@RequestMapping(value = "/account")
public class AccountController {
@Autowired
AccountService accountService;
@RequestMapping(value = "/findAll")
public String findAll(Model model){
System.out.println("执行了 AccountController 中的 findAll 方法...");
List<Account> list = accountService.findAll();
System.out.println(list);
model.addAttribute("list",list);
return "success";
}
@RequestMapping(value = "/saveAccount")
public String saveAccount(Account account){
System.out.println("执行了 AccountController 中的 findAll 方法...");
accountService.saveAccount(account);
return "success";
}
}
1.7.5 success.jsp
<h1>访问成功!!</h1>
<c:forEach items="${list}" var="account">
${account.id}---${account.name}---${account.money}<br/>
</c:forEach>
1.8 配置 Spring 的声明式事务管理
1.8.1 applicationContext.xml
<!--配置spring的声明式事务处理-->
<!--1:事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--2:配置通知(xml、注解),让通知关联事务,同时对切入点方法进行细化-->
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="*" read-only="true"></tx:method>
</tx:attributes>
</tx:advice>
<!--3:配置aop,让通知关联切入点-->
<aop:config>
<aop:pointcut id="myPointcut" expression="execution(* com.cpz.ssm.service..*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="myAdvice" pointcut-ref="myPointcut"></aop:advisor>
</aop:config>
1.8.2 index.jsp
<form action="account/saveAccount" method="post">
姓名:<input type="text" name="name"/><br/>
金额:<input type="text" name="money"/><br/>
<input type="submit" value="保存"/><br/>
</form>
1.8.3 AccountController.java
@RequestMapping(value = "/saveAccount")
public String saveAccount(Account account){
System.out.println("执行了 AccountController 中的 findAll 方法...");
int row = accountService.saveAccount(account);
return "redirect:/account/findAll";
}
1.9 让 SpringMVC 扫描,不让 Spring 扫描
1.9.1 springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 1:组件扫描配置,扫描controller的注解,排除Service注解的扫描 -->
<context:component-scan base-package="com.cpz.ssm">
<!--<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
<!-- 排除Service注解的扫描,让spring扫描,否则事务可能会失效 -->
<!--<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>-->
</context:component-scan>
<!-- 2:配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 3:设置静态资源不过滤,可以使用:-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!-- 4:开启对SpringMVC注解的支持 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!--只要web容器启动,加载了springmvc,同时加载所有spring的配置-->
<import resource="classpath:applicationContext.xml"></import>
</beans>
1.9.2 applicationContext.xml
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--注解开发,组件扫描
spring整合springmvc的时候,出现问题
* 如果springmvc.xml,使用组件扫描(@Controller,@Service...)
* 如果applicationContext.xml中,使用组件扫描(@Controller,@Service...)
* 扫描发现出现重复现象,导致有些组件失灵,事务也会有问题
解决方案一:applicationContext.xml文件
不扫描@Controller
springmvc.xml文件
扫描@Controller,不扫描Service
解放方案二:
让SpringMVC扫描,不让Spring扫描
-->
<!--开启注解扫描-->
<!--<context:component-scan base-package="com.cpz.ssm">-->
<!--忽略某些注解,把Controller忽略-->
<!--<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
<!--</context:component-scan>-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!-- 1:配置C3P0的连接池对象 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--2:创建spring整合mybatis的核心对象,SqlSessionFactoryBean
<property name="configLocation" value="classpath:sqlMapConfig.xml"></property>
* 通过spring加载mybatis的配置文件(1个)
<property name="mapperLocations">
<set>
<value>classpath:com/itheima/ssm/dao/*Dao.xml</value>
</set>
</property>
* 通过spring加载mybatis的映射文件(多个)
<property name="typeAliasesPackage" value="com.itheima.ssm.domain"></property>
* 别名
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--3:添加一个映射配置,让Dao被spring管理,可以在Service上注入Dao-->
<bean id="scannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.cpz.ssm.dao"></property>
</bean>
<!--配置spring的声明式事务处理-->
<!--1:事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--2:配置通知(xml、注解),让通知关联事务,同时对切入点方法进行细化-->
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="*" read-only="true"></tx:method>
</tx:attributes>
</tx:advice>
<!--3:配置aop,让通知关联切入点-->
<aop:config>
<aop:pointcut id="myPointcut" expression="execution(* com.cpz.ssm.service..*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="myAdvice" pointcut-ref="myPointcut"></aop:advisor>
</aop:config>
<!--<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>-->
</beans>
1.9.3 删除 web.xml 中的监听器
<!-- 配置Spring的监听器,默认加载WEB-INF下的applicationContext.xml -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 该监听器默认只加载WEB-INF下的applicationContext.xml配置文件,通过contextConfigLocation改变位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>