官网:
https://spring.io/projects/spring-framework#overview
官方文档地址:
官方下载地址:
http://repo.spring.io/release/org/springframework/spring
GitHub:
https://github.com/spring-projects/spring-framework
maven依赖:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
Spring 配置文件头部
<?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">
</beans>
public class Hello {
private String str;
public String getStr() {
return str;
}
//必须要写set方法
public void setStr(String str) {
this.str = str;
}
@Override
public String toString() {
return "Hello{" +
"str=‘" + str + ‘\‘‘ +
‘}‘;
}
}
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="hello" class="com.qiu.pojo.Hello">
<property name="str" value="学习Spring"/>
</bean>
</beans>
public class MyTest {
public static void main(String[] args) {
//获取Spring的上下文
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//我们的对象现在都在Spring中管理了,我们要使用,直接去里面取出来就可以!
Hello hello = (Hello) context.getBean("hello");
System.out.println(hello);
}
}
使用下标赋值
<bean id="user" class="com.qiu.pojo.User">
<!-- 参数下标从0开始,依次类推 -->
<constructor-arg index="0" value="湫"/>
</bean>
使用变量名称
<bean id="user" class="com.qiu.pojo.User">
<!-- 使用 实体类属性名 赋值 -->
<constructor-arg name="name" value="湫"/>
</bean>
使用类型赋值,一般不用,可以自己百度了解
<!--
id: bean 的唯一标识符,也就是相当于我们学的对象名
class: bean对象所对应的全限定名 (包名+类名)
name: 也是别名,而且name 可以同时取多个别名
-->
<!--
value: 具体的值,基本数据类型
ref: 引用Spring容器中创建好的对象
-->
<bean id="user" class="com.qiu.pojo.User" name="user2,u1,u2">
<property name="name" value="湫"/>
</bean>
一般用于团队开发使用,他可以将多个配置文件,导入合并为一个
现在有三个配置文件(applicationContext.xml、beans.xml、beans1.xml)
在 applicationContext.xml 的配置文件中引入其它两个配置文件
<import resource="beans.xml"/>
<import resource="beans1.xml"/>
使用的时候,直接使用总的配置就可以了
<!--别名,如果添加了别名,我们也可以使用别名获取到这个对象-->
<alias name="user" alias="userNew"/>
除了 构造器注入 方式外,还有 Set方式 注入
各种复杂类型
基本类型、String类、对象、数组、List、Map、Set、null、Properties
真实测试对象
private String name; // String
private Address address; // 对象引用
private String[] books; // 数组
private List<String> hobbes; // List集合
private Map<String,String> card; // Mao集合
private Set<String> games; // Set
private String wife; // null
private Properties info; // 配置相关
注入方式
<bean id="address" class="com.qiu.pojo.Address">
<property name="address" value="杭州"/>
</bean>
<bean id="student" class="com.qiu.pojo.Student" name="stu">
<!--普通值 注入,value-->
<property name="name" value="湫"/>
<!--Bean 注入,ref-->
<property name="address" ref="address"/>
<!--数组 注入,array标签-->
<property name="books">
<array>
<value>红楼梦</value>
<value>西游记</value>
<value>水浒传</value>
<value>三国演义</value>
</array>
</property>
<!--List 注入,list标签-->
<property name="hobbes">
<list>
<value>听歌</value>
<value>敲代码</value>
<value>看电影</value>
</list>
</property>
<!--Map 注入,map标签-->
<property name="card">
<map>
<entry key="身份证" value="131121204514512"/>
<entry key="银行卡" value="102001621220512"/>
</map>
</property>
<!--Set 注入,set标签-->
<property name="games">
<set>
<value>LOL</value>
<value>BOB</value>
<value>COC</value>
</set>
</property>
<!--null-->
<property name="wife">
<null/>
</property>
<!--Properties 配置注入,props标签-->
<property name="info">
<props>
<prop key="driver">com.mysql.jdbc.Driver</prop>
<prop key="url">jdbc:mysql://localhost:3306/mybatis</prop>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
输出结果
Student{
name=‘湫‘,
address=‘杭州‘,
books=[红楼梦, 西游记, 水浒传, 三国演义],
hobbes=[听歌, 敲代码, 看电影],
card={身份证=131121204514512, 银行卡=102001621220512},
games=[LOL, BOB, COC],
wife=‘null‘,
info={password=123456, url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8, driver=com.mysql.jdbc.Driver, username=root}
}
拓展方式
我们可以使用 p命名空间 和 c命名空间进行注入
<!--引入 第三方约束(xmlns:p)-->
xmlns:p="http://www.springframework.org/schema/p"
<!--p命名空间注入,可以直接注入属性的值:property-->
<bean id="user" class="com.qiu.pojo.User"
p:name="湫" p:age="18"
/>
<!--引入 第三方约束(xmlns:c)-->
xmlns:c="http://www.springframework.org/schema/c"
<!--c命名空间注入,通过构造器注入:construct-args-->
<bean id="user2" class="com.qiu.pojo.User"
c:name="湫" c:age="20"
/>
注意点:p命名 和 c命名 不能直接使用,需要导入xml约束!
Scope | Description |
---|---|
singleton | (Default) Scopes a single bean definition to a single object instance for each Spring IoC container. |
prototype | Scopes a single bean definition to any number of object instances. |
request | Scopes a single bean definition to the lifecycle of a single HTTP request. That is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext . |
session | Scopes a single bean definition to the lifecycle of an HTTP Session . Only valid in the context of a web-aware Spring ApplicationContext . |
application | Scopes a single bean definition to the lifecycle of a ServletContext . Only valid in the context of a web-aware Spring ApplicationContext . |
websocket | Scopes a single bean definition to the lifecycle of a WebSocket . Only valid in the context of a web-aware Spring ApplicationContext . |
<bean id="hello" class="com.qiu.pojo.Hello" scope="singleton">
创建的对象相等(user1==user2 为 true)
每次从容器中get的时候,都会产生一个新对象!
<bean id="hello" class="com.qiu.pojo.Hello" scope="prototype">
创建的对象不相等(user1==user2 为 false)
一个人有两个宠物!
<bean id="cat" class="com.qiu.pojo.Cat"/>
<bean id="dog" class="com.qiu.pojo.Dog"/>
<bean id="people" class="com.qiu.pojo.People">
<property name="name" value="湫"/>
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
</bean>
<bean id="cat" class="com.qiu.pojo.Cat"/>
<bean id="dog" class="com.qiu.pojo.Dog"/>
<!--
byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的 beanid
并且区分大小写
-->
<bean id="people" class="com.qiu.pojo.People" autowire="byName">
<property name="name" value="湫"/>
</bean>
<bean class="com.qiu.pojo.Cat"/>
<bean class="com.qiu.pojo.Dog"/>
<!--
byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean
引用对象注册时,id可以去掉不写
必须保证 类型全局唯一
-->
<bean id="people" class="com.qiu.pojo.People" autowire="byType">
<property name="name" value="湫"/>
</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"
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/>
</beans>
@Autowired
直接在属性上使用即可!也可以在set方式上使用!
使用Autowired 我们可以不用编写Set方法了,前提是自动装配的属性在 IOC(Spring)容器中存在,且名字符合
byType和byName;
科普:
@Nullable //字段标记了这个注解,说明这个字段可以为null;
public People(@Nullable String name){
this.name = name;
}
@Autowired 的使用
public class People {
private String name;
//如果显示定义了Autowired的required属性为false,说明这个对象可以为null,否则不允许为空
@Autowired(required = false)
private Cat cat;
@Autowired
private Dog dog;
}
<bean id="cat" class="com.qiu.pojo.Cat"/>
<bean id="dog" class="com.qiu.pojo.Dog"/>
<!--beans.xml文件中不需要装配-->
<bean id="people" class="com.qiu.pojo.People">
<property name="name" value="湫"/>
</bean>
如果 @Autowired 自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候,我们可以
使用 @Qualifier (value = "xxx")去配置 @Autowired 的使用,指定一个唯一的bean对象注入!
<bean id="cat1" class="com.qiu.pojo.Cat"/>
<bean id="dog2" class="com.qiu.pojo.Dog"/>
<bean id="people" class="com.qiu.pojo.People">
<property name="name" value="湫"/>
</bean>
@Autowired
@Qualifier(value = "cat1")
private Cat cat;
@Autowired
@Qualifier(value = "dog2")
private Dog dog;
还可以使用Java的原生注解 【@Resource】
jdk11中被移除~
@Resource
private Cat cat;
@Resource
private Dog dog;
//也可以使用 name 来指定 beanid
@Resource(name="cat1")
小结
@Resource 和 @Autowired 的区别:
在Spring4之后,要使用注解开发,必须保证aop的包导入了
使用注解需要导入context约束,增加注解的支持
<?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/>
</beans>
<!--指定要扫描的包,这个包下的注解就会生效-->
<context:component-scan base-package="com.qiu.pojo"/>
<!--使用 配置方式 -->
<bean id="user" class="com.qiu.pojo.User"/>
//使用注解方法
// @Component组件
@Component
public class User {
public String name ="湫";
}
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
User user = context.getBean("user", User.class); //id默认为类名的小写
System.out.println(user.name);
}
<!--使用 配置方式 -->
<property name="name" value="qiu"/>
//使用注解
@Component
public class User {
@Value("qiu")
public String name;
}
// 也可以放在 set方法上
@Autowired :自动装配通过类型,名字
@Qualifier(value = "xxx") :@Autowired 不能唯一自动装配时,可指定一个唯一的bean对象注入
@Resource :自动装配通过名字,类型
@Scope("singleton") //单例模式
@Scope("prototype") //原型模式
我们在使用的过程中,需要注意一个问题:必须让注解生效,就需要开启注解的支持
<!--指定要扫描的包,这个包下的注解就会生效-->
<context:component-scan base-package="com.qiu.pojo"/>
<context:annotation-config/>
SpringAOP中,通过Advice定义横切逻辑,Spring中支持5种类型的Advice:
类型通知 | 连接点 | 实现接口 |
---|---|---|
前置通知 | 方法前 | org.springframework.aop.BeforeAdvice |
后置通知 | 方法后 | org.springframework.aop.AfterReturningAdvice |
环绕通知 | 方法前后 | org.aopalliance.intercept.MethodInterceptor |
异常抛出通知 | 方法抛出异常 | org.springframework.aop.ThrowsAdvice |
引介通知 | 类中增加新的方法属性 | org.springframework.aop.InteoductionInterceptor |
即AOP在不改变原有代码的情况下,去增加新的功能!
导入依赖包!
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
xml中要添加AOP的约束
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
定义接口和实现类
public interface UserService {
void add();
void del();
void update();
void select();
}
public class UserServiceImpl implements UserService {
public void add() {
System.out.println("添加了一个用户");
}
public void del() {
System.out.println("删除了一个用户");
}
public void update() {
System.out.println("更新了一个用户");
}
public void select() {
System.out.println("查询了一个用户");
}
}
实现 MethodBeforeAdvice 接口
//前置增强
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class Log implements MethodBeforeAdvice {
//method:要执行的目标对象的方法
//args:参数
//target:目标对象
public void before(Method method, Object[] args, Object target) {
System.out.println(target.getClass().getName()+"的"+
method.getName()+"被执行了");
}
}
实现 AfterReturningAdvice 接口
//后置增强
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;
public class AfterLog implements AfterReturningAdvice {
//returnValue:返回值
public void afterReturning(Object returnValue, Method method, Object[] args,
Object target) {
System.out.println("执行了"+method.getName()+"方法,返回结果为:"+returnValue);
}
}
注册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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="userService" class="com.qiu.service.UserServiceImpl"/>
<bean id="log" class="com.qiu.log.Log"/>
<bean id="afterLog" class="com.qiu.log.AfterLog"/>
<!--方式一:使用原生Spring API 接口-->
<!--配置AOP;需要导入aop的约束-->
<aop:config>
<!--切入点的命名,要切入的方法-->
<!--
1、execution(): 表达式主体。
2、第一个*号:表示返回类型, *号表示所有的类型。
3、包名:表示需要拦截的包名com.qiu.service包、子孙包下所有类的方法。
4、第二个*号:表示类名,*号表示所有的类,可以写具体类(UserServiceImpl)
5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数
-->
<aop:pointcut id="pointcut" expression="execution(* com.qiu.service.*.*(..))"/>
<!--配置切入类,到具体的切入点-->
<!--执行环绕增强-->
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
</aop:config>
</beans>
测试
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//动态代理 代理的是接口
UserService userService = (UserService) context.getBean("userService");
userService.update();
}
}
编写自定义类,并配上注解
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect //标注这个类是一个切面
public class AnnotationPointCut {
@Before("execution(* com.qiu.service.UserServiceImpl.*(..))")
public void before(){
System.out.println("========方法执行前========");
}
@After("execution(* com.qiu.service.UserServiceImpl.*(..))")
public void after(){
System.out.println("========方法执行后========");
}
@Around("execution(* com.qiu.service.UserServiceImpl.*(..))")
public void around(ProceedingJoinPoint jp) throws Throwable {
System.out.println("环绕前");
//获得签名
System.out.println(jp.getSignature());
//执行方法
jp.proceed();
System.out.println("环绕后");
}
}
XML配置文件
<!--方式三:使用注解-->
<bean id="annotationPointCut" class="com.qiu.diy.AnnotationPointCut"/>
<!--开启注解支持!-->
<!--JDK(默认) proxy-target-class="false"-->
<!--cglib proxy-target-class="true"-->
<aop:aspectj-autoproxy/>
<!--<aop:aspectj-autoproxy proxy-target-class="true"/>-->
输出结果:
环绕前
void com.qiu.service.UserService.update()
========方法执行前========
更新了一个用户
环绕后
========方法执行后========
导入相关jar包
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--Spring操作数据库的话,还需要一个spring-jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
</dependencies>
public void test() throws IOException {
String resources = "mybatis-config.xml";
InputStream in = Resources.getResourceAsStream(resources);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = sessionFactory.openSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.selectUser();
for (User user : userList) {
System.out.println(user);
}
}
官网:
http://mybatis.org/spring/zh/index.html
整合Mybatis方式一:
1. 创建 spring-dao.xml 文件
配置 DataSource
配置 sqlSessionFactory
2. 绑定 SqlSessionTemplate
3. 编写接口实现类
4. Spring中注册 接口实现类
5. 测试
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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--DataSource:使用Spring的数据源替换Mybatis的配置 c3p0 dbcp druid
这里使用Spring提供的JDBC:org.springframework.jdbc.datasource
-->
<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"/>
<!--绑定Mybatis配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!--SqlSessionTemplate 就是我们使用的sqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--因为没用set方法,只能使用构造器注入sqlSessionFactory-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
</beans>
接口及实现类
import com.qiu.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> selectUser();
}
import com.qiu.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
public class UserMapperImpl implements UserMapper {
//在原来,我们所有的操作都使用sqlSession来执行,现在我们都是用SqlSessionTemplate实现
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public List<User> selectUser() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.selectUser();
}
}
mybatis-config.xml 文件
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
<!--实体类别名-->
<typeAliases>
<package name="com.qiu.pojo"/>
</typeAliases>
<!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册-->
<mappers>
<mapper resource="com/qiu/mapper/UserMapper.xml" />
</mappers>
</configuration>
applicationContext文件
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="spring-dao.xml"/>
<bean id="userMapper" class="com.qiu.mapper.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
</beans>
测试
public class MyTest {
@Test
public void test() {
ApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
List<User> userList = userMapper.selectUser();
for (User user : userList) {
System.out.println(user);
}
}
}
整合Mybatis方式二:
使用 SqlSessionDaoSupport 方式实现
不再需要 SqlSessionTemplate
配置时直接使用 sqlSessionFactory
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
public List<User> selectUser() {
SqlSession sqlSession = getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.selectUser();
}
}
<bean id="userMapper2" class="com.qiu.mapper.UserMapperImpl2">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
声明式事务:
<!--需要在开头引入 第三方约束-->
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
在 spring-dao.xml 文件后面添加下面代码即可
<!--配置声明式事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--结合AOP实现事务的织入-->
<!--配置事务通知:-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--给那些方法配置事务-->
<!--配置事务的传播特性:new propagation= -->
<tx:attributes>
<tx:method name="add" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="query" read-only="true"/>
<!--一般只写 * 的即可-->
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--配置事务切入-->
<aop:config>
<!--切入点根据自己需要修改-->
<aop:pointcut id="txPointCut" expression="execution(* com.qiu.mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
@Autowired :自动装配通过类型,名字
@Qualifier(value = "xxx") :@Autowired不能唯一自动装配时,可指定一个唯一的bean对象注入
@Resource :自动装配通过名字,类型
@Nullable :字段标记了这个注解,说明这个字段可以为null;
@Component :组件,放在类上,说明这个类被Spring管理了,就是bean!
@Value("xxx") :属性赋值,可以放在属性上,也可放在set方法上
原文:https://www.cnblogs.com/qiu-m/p/13178321.html