1、Spring
1.1、简介
- Spring框架是由于软件开发的复杂性而创建的。
- Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。
- 然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
官方文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
1.2、优点
- Spring是一个开源的免费框架(容器)
- Spring是一个轻量级的、非入侵式的框架
- 控制反转(IOC),面向切面(AOP)使得编程变得简单
- 支持事物的处理,对框架整合的支持
总结一句话:spring是轻量级的控制反转和面向切面编程的框架
2、IOC创建对象的方式
什么是IOC控制反转 :对象有spring来创建,管理装配
创建方式:
1、使用无参构造创建对象,默认!
<bean id="gogo" class="com.cl.pojo.Student">
<property name="id" value="1"/>
<property name="name" value="小号"/>
</bean>
2、使用有参构造创建对象
- 下标赋值
<bean id="All" class="com.cl.pojo.Student">
<constructor-arg index="0" value="12"/>
<constructor-arg index="1" value="小明"/>
</bean>
- 通过参数名
<bean id="a2" class="com.cl.pojo.Student">
<constructor-arg name="id" value="13"/>
<constructor-arg name="name" value="小红"/>
</bean>
3、Spring配置
- 可以给Bean起别名
<bean id="gogo" class="com.cl.pojo.Student">
<property name="id" value="1"/>
<property name="name" value="小号"/>
</bean>
<alias name="gogo" alias="student"/>
- Bean的配置
<!--
id : bean 的唯一标识符,也就是相当于对象名
class : bean 对象对应的权限定名: 包名 + 类型
name : 也是别名,而且name可以同时去多个别名
-->
<bean id="gogo" class="com.cl.pojo.Student" name="s1,s2 s3;s4">
<property name="id" value="1"/>
<property name="name" value="小号"/>
</bean>
- import 可以将几个Bean合并成一个
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="Bean.xml"/>
<import resource="Bean2.xml"/>
</beans>
4、依赖注入
4.1、构造器注入
前面构造器创建对象,为对象赋值就是构造器注入
4.2、Set方法注入【重点】
1、复杂类型
public class Address {
private String address;
}
2、真实测试对象
public class Teacher {
private String name;
private Address address; //对象类型
private String[] books;
private List<String> hobbys;
private Map<String,String> card;
private Set<String> games;
private String wife;
private Properties info;
}
3、bean.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="Address" class="com.cl.pojo.Address">
<property name="address" value="上海"/>
</bean>
<bean id="teacher" class="com.cl.pojo.Teacher">
<!--普通注入,value-->
<property name="name" value="小张"/>
<!--Bean注入,ref-->
<property name="address" ref="Address"/>
<!--数组注入-->
<property name="books">
<array>
<value>Java基础</value>
<value>Java进阶</value>
</array>
</property>
<!--list集合注入-->
<property name="hobbys">
<list>
<value>听歌</value>
<value>打球</value>
</list>
</property>
<!--map集合注入-->
<property name="card">
<map>
<entry key="身份证号" value="123124324325325"/>
<entry key="学生证" value="124234"/>
</map>
</property>
<!--set集合注入-->
<property name="games">
<set>
<value>lol</value>
<value>bob</value>
</set>
</property>
<!--空-->
<property name="wife" value=""/>
<!--null-->
<property name="wife">
<null/>
</property>
<!--properties 配置文件注入-->
<property name="info">
<props>
<prop key="userName">root</prop>
<prop key="passWord">123456</prop>
</props>
</property>
</bean>
</beans>
4、测试类
public class TeacherCon {
public static void main(String[] args) {
ApplicationContext Context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
Teacher teacher = (Teacher) Context.getBean("teacher");
System.out.println(teacher.toString());
/*
Teacher(
name=小张,
address=Address(address=上海),
books=[Java基础, Java进阶],
hobbys=[听歌, 打球],
card={身份证号=123124324325325, 学生证=124234},
games=[lol, bob],
wife=,
info={passWord=123456, userName=root})
*/
}
}
4.3、C、P命名空间注入
- student
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private int id;
private String name;
}
- Bean.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:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--p命名空间注入,可以直接注入属性的值:property-->
<bean id="student" class="com.cl.pojo.Student" p:id="12" p:name="小幅"/>
<!--c命名空间注入,通过构造器注入:construct-args-->
<bean id="sc" class="com.cl.pojo.Student" c:id="11" c:name="小张"/>
</beans>
- 测试
@Test
public void text01(){
ApplicationContext context = new ClassPathXmlApplicationContext("Bean3.xml");
Student student = (Student) context.getBean("student");
System.out.println(student);
}
注意点:C、P命名空间不能直接使用,需要导入xml约束!
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
5、Bean的作用域(scopes)
1、单例模式(Spring默认)可以显示定义 - scope = singleton
<bean id="student" class="com.cl.pojo.Student" p:id="12" p:name="小幅" scope="singleton"/>
2、原型模式:每次从容器中get的时候,都会产生一个新对象 - scope = prototype
<bean id="student" class="com.cl.pojo.Student" p:id="12" p:name="小幅" scope="prototype"/>
3、其余的request、session、application 这些只能在web开发中使用到
6、Bean的自动装配
- 自动装配是Spring满足Bean依赖一种方式
- Spring会在上下文中自动寻找,并自动给Bean装配属性
在Spring中有三种装配的方式:
1、在xml中显示的配置(之前使用Bean.xml配置就是这种方式)
2、在java中显示配置
3、隐式的自动装配【重要】
-
环境搭建
- Dog、Cat、People类
public class Dog { public void shout(){ System.out.println("dog ~ "); } }
public class Cat { public void shout(){ System.out.println("cat ~ "); } }
@Data @AllArgsConstructor @NoArgsConstructor @ToString public class People { private String name; private Dog dog; private Cat cat; }
6.1、ByName自动装配
<bean id="cat" class="com.cl.pojo.Cat"/>
<bean id="dog" class="com.cl.pojo.Dog"/>
<!--ByName:会自动在容器上下文中查找和自己对象set方法后面的值对应的Bean id-->
<bean id="people" class="com.cl.pojo.People" autowire="byName">
<property name="name" value="狂三"/>
</bean>
6.2、ByType自动装配
<bean id="cat" class="com.cl.pojo.Cat"/>
<bean id="dog" class="com.cl.pojo.Dog"/>
<!--ByType: 会自动在容器上下文中查找,和自己对象属性类型相同的Bean-->
<bean id="people2" class="com.cl.pojo.People" autowire="byType">
<property name="name" value="狂三"/>
</bean>
小结:
- byName的时候,需要保证所有的 Bean的id 唯一,并且这个Bean需要和自动注入的属性的set()方法的值一致。
- byType的时候,需要保证所有的 class 唯一,并且这个bean需要和自动注入的属性的类型一致。
6.3、使用注解实现自动装配
jdk1.5支持的注解,Spring2.5就支持注解了
要使用注解须知:
1、导入约束 (context)
2、配置注解支持
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id="cat111" class="com.cl.pojo.Cat"/>
<bean id="dog111" class="com.cl.pojo.Dog"/>
<bean id="dog222" class="com.cl.pojo.Dog"/>
<bean id="qq" class="com.cl.pojo.People"/>
</beans>
- Autowired注解
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class People {
private String name;
@Autowired
@Qualifier(value = "dog111") //当容器中有多个对象时,可以用Quqlifier来指定使用那个
private Dog dog;
@Autowired(required = false) //required 设置为false,标识属性可以为空
private Cat cat;
}
- Resource注解
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class People {
private String name;
@Resource(name = "dog111") //当容器中有多个对象时,可以用name来指定使用那个
private Dog dog;
@Resource
private Cat cat;
}
小结 autowired 与 resource 的区别:
@Autowired 是根据 ByType 实现的
@Resource 是根据 ByName 实现的
7、使用注解开发
1、属性如何注入
@Data
@Component //组件可以被 component-scan 扫描装配
public class Student {
@Value("小明") // 等价于 <property name="name" value="小幅"/>
private String name;
}
2、衍生的注解
@component 有几个衍生注解,主要用于分层
- dao 【@Repository】
- service 【@service】
- controller 【@controller】
3、自动装配(6.3)
@Autowired 自动装配(ByType)
@Nullable 可以为空
@Resource 自动装配(ByName)
4、作用域
@Component
@Scope("singleton") //singleton单例 prototype 多例
@Data
public class Student {
@Value("小明") // 等价于 <property name="name" value="小幅"/>
private String name;
}
8、使用Java的方式配置Spring
我们现在完全不使用xml配置,全部交给java
- 实体类
@Data
@Component
public class Student {
@Value("小明") // 等价于 <property name="name" value="小幅"/>
private String name;
}
- 配置类
//@Configuration 代表一个配置类,就和我们之前看到的Beans.xml
//@Improt 导入其他的配置类,合并成一个
//@ComponentScan 扫描component组件
@Configuration
@ComponentScan("com.cl.pojo")
@Import(SpringBeanConfig.class)
public class SpringBeanConfig {
//这个方法名相当于 Bean标签中的 id 属性
//这个方法返回值相当于 Bean标签中的class属性
@Bean
@Scope("singleton") //prototype 原型(多例) singleton 单例
public Student getStudent(){
return new Student();
}
}
- 测试
@Test
public void test02() {
ApplicationContext context = new AnnotationConfigApplicationContext("com.cl");
Student student = (Student) context.getBean("getStudent");
System.out.println(student);
}
9、AOP切面
9.1、什么是AOP
- AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
- AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
- 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
9.2、AOP在spring中的作用
提供声明式事务,允许用户自定义切面
-
切面(Aspect): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
-
连接点(Joint point):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
-
切入点(Pointcut):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
-
通知(Advice):Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
9.3、使用Spring实现AOP
需要添加的依赖:
<!--切面需要的加包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
方式一:使用Spring的API接口
- 实现接口类
public class LOG1 implements MethodBeforeAdvice {
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println(o.getClass().getName()+"类,执行"+method.getName()+"方法");
}
}
public class LOG2 implements AfterReturningAdvice {
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("执行"+method.getName()+"方法, 返回值为"+returnValue);
}
}
- Application.xml中配置AOP
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="userService" class="com.cl.service.UserServiceImpl"/>
<bean id="log1" class="com.cl.config.LOG1"/>
<bean id="log2" class="com.cl.config.LOG2"/>
<aop:config>
<!--切入点-->
<aop:pointcut id="UserService" expression="execution(* com.cl.service.UserServiceImpl.*(..))"/>
<aop:advisor advice-ref="log1" pointcut-ref="UserService"/>
<aop:advisor advice-ref="log2" pointcut-ref="UserService"/>
</aop:config>
</beans>
- 测试类
public class UserController {
public static void main(String[] args) {
ApplicationContext Context = new ClassPathXmlApplicationContext("Application.xml");
//动态代理 - 代理的是接口
UserService bean = (UserService) Context.getBean("userService");
bean.add();
}
}
注意点:AOP是用动态代理来实现的,所以要强转为接口类型(UserService)
方式二:使用自定义切面实现
- 自定义切面
public class AspectLOG {
public void before(){ System.out.println("===================before====================");
}
public void after(){
System.out.println("===================after====================");
}
}
- Application.xml中配置AOP
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="userService" class="com.cl.service.UserServiceImpl"/>
<!--切面类-->
<bean id="log" class="com.cl.config.AspectLOG"/>
<aop:config>
<!--引入切面类 -->
<aop:aspect ref="log">
<!--要切入的点-->
<aop:pointcut id="UserService" expression="execution(* com.cl.service.UserServiceImpl.*(..))"/>
<!--切入点之前执行,method对应切面类中名称相同的方法-->
<aop:before method="before" pointcut-ref="UserService"/>
<!--切入点之后执行,method对应切面类中名称相同的方法-->
<aop:after method="after" pointcut-ref="UserService"/>
</aop:aspect>
</aop:config>
</beans>
- 测试类
public class UserController {
public static void main(String[] args) {
ApplicationContext Context = new ClassPathXmlApplicationContext("Application.xml");
//动态代理 - 代理的是接口
UserService bean = (UserService) Context.getBean("userService");
bean.add();
}
}
方式三:注解实现AOP
- 自定义切面类
@Aspect
public class AnnotcationLOG {
@Before("execution(* com.cl.service.UserServiceImpl.*(..))")
public void before(){
System.out.println("===========before===========");
}
@After("execution(* com.cl.service.UserServiceImpl.*(..))")
public void after(){
System.out.println("===========after===========");
}
/*环绕通知*/
@Around("execution(* com.cl.service.UserServiceImpl.*(..))")
public void arount(ProceedingJoinPoint jp) throws Throwable {
System.out.println("环绕前");
Signature signature = jp.getSignature();//获得签名
System.out.println("signature:"+signature);
Object proceed = jp.proceed();
System.out.println("环绕后");
}
}
- Application.xml 中配置AOP注解支持
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="userService" class="com.cl.service.UserServiceImpl"/>
<!--第三种方式-->
<!--切面类交给spring管理-->
<bean id="Annotcation" class="com.cl.config.AnnotcationLOG"/>
<!--开启AOP注解支持-->
<aop:aspectj-autoproxy/>
</beans>
- 测试
public class UserController {
public static void main(String[] args) {
ApplicationContext Context = new ClassPathXmlApplicationContext("Application.xml");
//动态代理 - 代理的是接口
UserService bean = (UserService) Context.getBean("userService");
bean.add();
}
}
10、Spring整合Mybatis
官方文档:http://mybatis.org/spring/zh/index.html
第一种方式:
- 实体类
@Data
public class User {
private Integer id;
private String name;
private String pwd;
}
- UserMapper
public interface userMapper {
List<User> getUserList();
}
- UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace=绑定一个对应的Mapper接口-->
<mapper namespace="com.cl.Mapper.userMapper">
<!--select查询语句 id对应UserMapper中的方法名-->
<select id="getUserList" resultType="User">
select * from user
</select>
</mapper>
- spring-dao.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
">
<!--数据源-->
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"/>
<!--可以通过configLocation来加入其他配置-->
<property name="configLocation" value="classpath:Mybatis-config.xml"/>
<!--添加mapper映射-->
<property name="mapperLocations" value="classpath:com/cl/mapper/*.xml"/>
</bean>
<!--sqlSessionTemplate:就是我们使用的sqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--只能使用构造器注入sqlSessionFactory 应为他没有set方法-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
</beans>
- 实现类
package com.cl.mapper;
import com.cl.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
public class UserMapperImpl implements UserMapper {
private SqlSessionTemplate session;
public void setSession(SqlSessionTemplate session) {
this.session = session;
}
public List<User> getUserList() {
return session.getMapper(UserMapper.class).getUserList();
}
}
- 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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<import resource="Spring-dao.xml"/>
<bean id="UserMapperImpl" class="com.cl.mapper.UserMapperImpl">
<property name="session" ref="sqlSession"/>
</bean>
</beans>
- 测试类
public class UserController {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapperImpl userMapperImpl = (UserMapperImpl) context.getBean("UserMapperImpl");
List<User> userList = userMapperImpl.getUserList();
for (User user : userList) {
System.out.println(user);
}
}
}
第二种方式:
- 实现类
public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper {
public List<User> getUserList() {
return getSqlSession().getMapper(UserMapper.class).getUserList();
}
}
- 配置
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<import resource="Spring-dao.xml"/>
<bean id="UserMapperImpl" class="com.cl.mapper.UserMapperImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
</beans>
11、spring中的事务(AOP声明事事务)
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--数据源-->
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"/>
<!--可以通过configLocation来加入其他配置-->
<!--<property name="configLocation" value="classpath:Mybatis-config.xml"/>-->
<!--添加mapper映射-->
<property name="mapperLocations" value="classpath:com/cl/mapper/*.xml"/>
</bean>
<!--sqlSessionTemplate:就是我们使用的sqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--只能使用构造器注入sqlSessionFactory 应为他没有set方法-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<!--声明式事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="datasource" />
</bean>
<!--结合aop实现事务织入-->
<!--配置事务通知-->
<tx:advice id="transaction" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add"/>
<tx:method name="*"/> <!--所有方法-->
</tx:attributes>
</tx:advice>
<!--aop织入事务-->
<aop:config>
<aop:pointcut id="tranPoincut" expression="execution(* com.cl.mapper.*.*(..))"/>
<aop:advisor advice-ref="transaction" pointcut-ref="tranPoincut"/>
</aop:config>
</beans>