IOC概念原理
-
控制反转:把对象和对象之间调用过程,交给Spring管理
-
使用ioc的目的为了降低耦合度
ioc的底层原理:
-
xml解析,工厂模式,反射
ioc(BeanFactory接口)
-
IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
-
Spring提供IOC容器实现两种方式(两种接口)
-
BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用
-
加载配置文件时不会创建对象,在获取对象才去创建对象
-
-
ApplicationContext:BeanFactory接口的子接口,提供更强大的功能,一般由开发人员进行使用
-
加载配置文件的时候就会把在配置文件对象进行创建。
-
-
ApplicationContext接口有实现类
-
IOC操作bean管理
-
Bean管理值得是两个操作
-
Spring创建对象
-
Spring注入属性
Bean管理操作的两种方式
-
基于XML方式实现
-
基于注解方式实现
IOC操作Bean管理(XML)
-
基于xml方式创建对象
-
在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建
-
bean标签有很多属性,介绍常用的属性
-
id:唯一标识
-
class:类全路径(包类路径)
-
-
创建对象的时候,属性也是执行无参构造法完成对象创建
-
-
基于xml方式注入属性
-
DI:依赖注入,就是注入属性
-
-
第一种注入方式,使用set方式进行注入
-
创建类,定义属性和对应的set方法
-
在Spring配置文件配置对象创建,配置属性注入
-
<!--2 set 方法注入属性--> <bean id="book" class="com.atguigu.spring5.Book"> <!--使用 property 完成属性注入 name:类里面属性名称 value:向属性注入的值 --> <property name="bname" value="易筋经"></property> <property name="bauthor" value="达摩老祖"></property> </bean>
-
-
-
第二种注入方式:使用有参数构造进行注入
-
创建类,定义属性,创建有参数构造方法
-
/** * 使用有参数构造注入 */ public class Orders { //属性 private String oname; private String address; //有参数构造 public Orders(String oname,String address) { this.oname = oname; this.address = address; } }
-
在Spring配置文件中进行配置
-
<bean id="orders" class="com.atguigu.spring5.Orders"> <constructor-arg name="oname" value="电脑"></constructor-arg> <constructor-arg name="address" value="China"></constructor-arg> </bean>
-
-
-
-
p名称空间注入
-
使用p名称空间注入,可以简化基于xml配置方式
-
第一步添加p名称空间在配置文件中
-
第二步进行属性注入,在bean标签里进行操作
-
<!--set方法及逆行属性注入--> <bean id= “book" class="类全名路径" p:name(属性)="值" p:age=()/>
-
-
IOC操作Bean管理(xml注入其它类型属性)
-
字面量
-
null值
-
<!--null 值--> <property name="address"> <null/></propert
-
属性值包含特殊符号
-
<!--属性值包含特殊符号 1 把<>进行转义 < > 2 把带特殊符号内容写到 CDATA --> <property name="address"> <value><![CDATA[<<南京>>]]></value></propert
-
注入属性-外部bean
-
创建两个类service和dao类
-
在service调用dao里面的方法
-
在Spring配置文件中进行配置
-
public class UserService { //创建 UserDao 类型属性,生成 set 方法 private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void add() { System.out.println("service add..............."); userDao.update(); } } <!--1 service 和 dao 对象创建--> <bean id="userService" class="com.atguigu.spring5.service.UserService"> <!--注入 userDao 对象 name 属性:类里面属性名称 ref 属性:创建 userDao 对象 bean 标签 id 值 --> <property name="userDao" ref="userDaoImpl"></property> </bean> <bean id="userDaoImpl" class="com.atguigu.spring5.dao.UserDaoImpl"></bean>
-
-
-
注入属性-内部bean
-
一对多关系:部门和员工
-
在实体类之间表示一对多的关系
-
在spring配置文件中进行配置
-
<bean id="emp" class="com.atguigu.spring5.bean.Emp"> <!--设置两个普通属性--> <property name="ename" value="lucy"></property> <property name="gender" value="女"></property> <!--设置对象类型属性--> <property name="dept"> <bean id="dept" class="com.atguigu.spring5.bean.Dept"> <property name="dname" value="安保部"></property> </bean> </property> </bean>
-
-
注入属性-级联赋值
-
第一种写法
-
<!--级联赋值--> <bean id="emp" class="com.atguigu.spring5.bean.Emp"> <!--设置两个普通属性--> <property name="ename" value="lucy"></property> <property name="gender" value="女"></property> <!--级联赋值--> <property name="dept" ref="dept"></property> </bean> <bean id="dept" class="com.atguigu.spring5.bean.Dept"> <property name="dname" value="财务部"></property> </bean>
-
-
第二种写法
-
<!--级联赋值--> <bean id="emp" class="com.atguigu.spring5.bean.Emp"> <!--设置两个普通属性--> <property name="ename" value="lucy"></property> <property name="gender" value="女"></property> <!--级联赋值--> <property name="dept" ref="dept"></property> <property name="dept.dname" value="技术部"></property></bean><bean id="dept" class="com.atguigu.spring5.bean.Dept"> <property name="dname" value="财务部"></property></bea
-
-
-
-
-
IOC操作管理(xml注入集合属性)
-
注入数组类型属性
-
注入list集合属性
-
注入map集合属性
-
创建,定义数组,list,map,set类型属性,生成对应set方法
-
在spring配置文件进行配置
-
<!--1 集合类型属性注入--> <bean id="stu" class="com.atguigu.spring5.collectiontype.Stu"> <!--数组类型属性注入--> <property name="courses"> <array> <value>java 课程</value> <value>数据库课程</value> </array> </property> <!--list 类型属性注入--> <property name="list"> <list> <value>张三</value> <value>小三</value> </list> </property> <!--map 类型属性注入--> <property name="maps"> <map> <entry key="JAVA" value="java"></entry> <entry key="PHP" value="php"></entry> </map> </property> <!--set 类型属性注入--> <property name="sets"> <set> <value>MySQL</value> <value>Redis</value> </set> </property></bea
-
-
-
在集合里面设置对象类型
-
<!--创建多个 course 对象-- <bean id="course1" class="com.atguigu.spring5.collectiontype.Course"> <property name="cname" value="Spring5 框架"></property></bean><bean id="course2" class="com.atguigu.spring5.collectiontype.Course"> <property name="cname" value="MyBatis 框架"></property></bean><!--注入 list 集合类型,值是对象--> <property name="courseList"> <list> <ref bean="course1"></ref> <ref bean="course2"></ref> </list></propert
-
-
把集合注入部分提取出来
-
在spring配置文件中引入命名空间 util
-
使用util标签完成list集合注入提取
-
<!--1 提取 list 集合类型属性注入--> <util:list id="bookList"> <value>易筋经</value> <value>九阴真经</value> <value>九阳神功</value></util:list><!--2 提取 list 集合类型属性注入使用--> <bean id="book" class="com.atguigu.spring5.collectiontype.Book"> <property name="list" ref="bookList"></property></bean>
-
-
IOC操作bean管理(FactoryBean)
-
Spring 有两种类型bean,一种普通bean,另外一种工厂bean(FactoryBean)
-
普通bean:在配置文件中定义bean类型就是返回类型
-
工厂bean:在配置文件中定义bean类型可以和返回类型不一样
-
创建类:让这个类作为工厂bean,实现接口factorybean
-
实现接口里面的方法,在实现的方法中定义返回的bean类型
-
public class MyBean implements FactoryBean<Course> { //定义返回 bean @Override public Course getObject() throws Exception { Course course = new Course(); course.setCname("abc"); return course; } @Override public Class<?> getObjectType() { return null; } @Override public boolean isSingleton() { return false; } } <bean id="myBean" class="com.atguigu.spring5.factorybean.MyBean"> </bean> @Test public void test3() { ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml"); Course course = context.getBean("myBean", Course.class); System.out.println(course); }
-
IOC操作bean管理(bean作用域)
-
在spring中,设置创建bean实例是单实例还是多实例
-
在spring里面,默认情况下,bean是单实例对象
-
如何设置单实例还是多实例
-
在spring配置文件bean标签里面有属性(scope)用于设置单例还是多实例
-
scope属性值
-
singleton表示单实例对象
-
propotype,表示多实例对象
-
-
singleton和propotype的区别
-
singleton单实例,prototype多实例
-
设置scope值是singleton时候,加载配置文件时就会创建单实例对象
-
设置为prototype时,不是在加载spring配置文件时候创建对象,在调用getbean方法时创建多实例对象
-
-
-
IOC操作bean管理(bean生命周期)
-
生命周期
-
从对象创建到对象销毁的过程
-
-
bean生命周期
-
通过构造器创建bean实例(无参数构造)
-
为bean的属性设置值和对其他bean引用(调用set方法)
-
调用bean初始化方法(休要及逆行配置初始化的方法)
-
bean可以使用了(对象获取到了)
-
当容器关闭的时候,调用bean的销毁方法(需要及逆行配置销毁的方法)
-
-
bean的后置处理器,bean生命周期有七步
-
通过构造器创建bean实例(无参数构造)
-
为bean的属性设置值核对其他bean引用(调用set方法)
-
把bean实例传递bean后置处理器的方法postprocessBeforeInitialization
-
调用bean的初始化的方法(需要进行配置初始化的方法)
-
把bean实例传递bean后置处理器的方法postProcessAfterInitialization
-
bean可以使用了(对象获取到了)
-
当容器关闭的时候,调用bean的销毁方法(需要及逆行配置销毁的方法)
-
IOC操作Bean管理(xml自动装配)
-
什么是自动装配
-
根据指定装配规则(属性名称或者属性类型),spring自动将匹配的属性值进行注入
-
-
演示自动装配过程
-
根据属性名称自动注入
-
<!--实现自动装配 bean 标签属性 autowire,配置自动装配 autowire 属性常用两个值: byName 根据属性名称注入 ,注入值 bean 的 id 值和类属性名称一样 byType 根据属性类型注入 --> <bean id="emp" class="com.atguigu.spring5.autowire.Emp" autowire="byName"> <!--<property name="dept" ref="dept"></property>--> </bean> <bean id="dept" class="com.atguigu.spring5.autowire.Dept"></bean>
-
根据属性类型自动注入
-
<!--实现自动装配 bean 标签属性 autowire,配置自动装配 autowire 属性常用两个值: byName 根据属性名称注入 ,注入值 bean 的 id 值和类属性名称一样 byType 根据属性类型注入 --> <bean id="emp" class="com.atguigu.spring5.autowire.Emp" autowire="byType"> <!--<property name="dept" ref="dept"></property>--> </bean> <bean id="dept" class="com.atguigu.spring5.autowire.Dept"></bean>
-
-
-
ioc操作bean管理(外部属性文件
-
直接配置数据库信息
-
配置德鲁伊连接池
-
引入德鲁伊连接池相关依赖jar包
-
<!--直接配置连接池--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/userDb"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean>
-
-
-
引入外部属性文件配置数据库连接池
-
创建外部属性文件properties格式文件,写数据库信息
-
把外部properties属性文件引入到spring配置文件中
-
引入context命名空间
-
⚫ 在 spring 配置文件使用标签引入外部属性文件 <!--引入外部属性文件--> <context:property-placeholder location="classpath:jdbc.properties"/> <!--配置连接池--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${prop.driverClass}"></property> <property name="url" value="${prop.url}"></property> <property name="username" value="${prop.userName}"></property> <property name="password" value="${prop.password}"></property> </bean>
-
-
-
ioc操作bean管理(基于注解方式)
-
注解:
-
注解是代码的特殊标记,格式:@注解名称
-
使用注解,注解作用在类上面,方法上面,属性上面
-
使用注解目的,简化xml配置
-
-
Spring针对Bean管理中创建对象提供注解
-
@Component
-
@Service
-
@Controller
-
@Repository
-
以上四个注解的功能都是一样的,都可以用来创建bean实例
-
-
-
基于注解方式实现对象创建
-
引入依赖
-
开启组件扫描
-
<!--开启组件扫描 1 如果扫描多个包,多个包使用逗号隔开 2 扫描包上层目录 --> <context:component-scan base-package="com.atguigu"></context:component-scan>
-
-
创建类,在类上面添加创建对象注解
-
@Component(value = "userService") //<bean id="userService" class=".."/> public class UserService { public void add() { System.out.println("service add......."); } }
-
-
开启组件扫描细节配置
-
<!--示例 1 use-default-filters="false" 表示现在不使用默认 filter,自己配置 filter context:include-filter ,设置扫描哪些内容 --> <context:component-scan base-package="com.atguigu" use-defaultfilters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--示例 2 下面配置扫描包所有内容 context:exclude-filter: 设置哪些内容不进行扫描 --> <context:component-scan base-package="com.atguigu"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
-
-
-
基于注解方式实现属性注入
-
@Autowired:根据属性配型进行自动配置
-
把service和dao对象创建,在service和dao类添加创建对象注解
-
在service注入dao对象,在service类添加dao类型属性,在属性上面使用注解
-
@Service public class UserService { //定义 dao 类型属性 //不需要添加 set 方法 //添加注入属性注解 @Autowired private UserDao userDao; public void add() { System.out.println("service add......."); userDao.add(); } }
-
-
-
@Qualifier:根据名称进行注入
-
和@Autowired一起使用
-
//定义 dao 类型属性 //不需要添加 set 方法 //添加注入属性注解 @Autowired //根据类型进行注入 @Qualifier(value = "userDaoImpl1") //根据名称进行注入 private UserDao userDao;
-
-
-
@Resource:根据类型注入,可以根据名称注入
-
//@Resource //根据类型进行注入 @Resource(name = "userDaoImpl1") //根据名称进行注入 private UserDao userDao;
-
-
@Value:注入普通配型属性
-
@Value(value = "abc") private String name;
-
-
-
完全注解开发
-
创建配置类,代替xml文件
-
@Configuration //作为配置类,替代 xml 配置文件 @ComponentScan(basePackages = {"com.aspz"}) public class SpringConfig { }
-
-
编写测试类
-
@Test public void testService2() { //加载配置类 ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); UserService userService = context.getBean("userService", UserService.class); System.out.println(userService); userService.add(); }
-
-
-
-
Aop面向切面编程
Aop的底层原理
-
Aop底层使用动态代理
-
有接口的时候使用JDK的动态代理
-
创建接口实现得分代理对象,然后增强类方法
-
Proxy.newProxyIntance(ClassLoader loader,类<?>[] interfaces,InvocationHandler h), 返回指定代理类实例 参数: 1.类加载器 2.增强方法所在类,这个类实现的接口,支持多个接口 实现这个接口的invocationHandler,创建代理对象,写增强部分
-
-
有实现类的时候使用CGLIB
-
创建当前类子类的代理对象
-
-
AOP的术语
-
连接点:类里面哪些方法可以被增强,就叫做连接点
-
切入点:实际真正被增强的方法叫做接入点。
-
通知:
-
实际增强的逻辑部分
-
类型
-
前置通知
-
后置通知
-
环绕通知
-
异常通知
-
最终通知
-
-
-
切面
-
动作
-
即把通知应用到切入点的过程
-
AOP的操作
spring一般基于AspectJ实现AOP操作
Aop操作
1.基于xml配置文件实现
2.基于注解方式实现
切入点表达式:
-
作用:知道对哪个类的哪个方法进行增强
-
语法结构:execution( [权限修饰符] [返回类型] [类全路径] [方法名称] ([参数列表]))
主备工作,Aspect注解
-
创建类
-
创建增强类(编写增强逻辑)
-
进行通知的配置
-
在spring配置文件中,开启注解扫描
-
在类上标记@Component注解创建对象
-
在增强类上再加@Aspect注解生成代理对象
-
在spring配置文件中开启生成代理对象
-
aop:aspectj-autoproxy/
-
-
在增强类里的方法上配置不同类型的通知,可以使用切入点表达式进行配置(excution)
-
@Before(value="execution (* com.spz.dao.user.add(..))") public void before(){ sout("nihao ") } @Before:前置通知 @After:后置通知 @Around:环绕通知,在方法前和方法后后进行通知,有一个参数ProceedingJoinPoint参数,调用该类的proceed方法即可/ 。 @AfterThrowing:异常通知,抛出异常会进行通知
相同的切入点抽取
-
在增强类的增强方法上添加pointcut注解,value("待增强类的切入点表达式")
-
然后在具体的增强类方法内@Before(value="相同切入点的方名")
-
//相同切入点抽取 @Pointcut(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))") public void pointdemo() { } //前置通知 //@Before 注解表示作为前置通知 @Before(value = "pointdemo()") public void before() { System.out.println("before........."); }
-
多个增强类对同一个方法进行增强,设置增强方法的优先级
-
使用order注解添加数字,数字越小优先级越高
-
@Component @Aspect @Order(1) public class PersonPro
-
使用完全注解开发
-
创建配置类,不需要创建配置文件
-
@Configuration @ComponentScan(basePackages = {"com.atguigu"}) @EnableAspectJAutoProxy(proxyTargetClass = true) public class ConfigAop{ }
-
AOP操作(AspectJ配置文件)
-
创建两个类,增强类和被增强类,创建方法
-
在spring方法中创建两个类对象
-
<!--创建对象--> <bean id="book" class="com.atguigu.spring5.aopxml.Book"></bean> <bean id="bookProxy" class="com.atguigu.spring5.aopxml.BookProxy"></bean>
-
-
在spring中创建切入点
-
<!--配置 aop 增强--> <aop:config> <!--切入点--> <aop:pointcut id="p" expression="execution(* com.atguigu.spring5.aopxml.Book.buy(..))"/> <!--配置切面--> <aop:aspect ref="bookProxy"> <!--增强作用在具体的方法上--> <aop:before method="before" pointcut-ref="p"/> </aop:aspect> </aop:config>
-
JDBCTemplate(概念和准备)
引入jar包
在spring配置文件中配置数据库连接池
-
<!-- 数据库连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="url" value="jdbc:mysql:///user_db" /> <property name="username" value="root" /> <property name="password" value="root" /> <property name="driverClassName" value="com.mysql.jdbc.Driver" /></bea
配置JDBCTemplate对象,注入Datasource对象
-
<!JdbcTemplate 对象 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!--注入 dataSource--> <property name="dataSource" ref="dataSource"></property></bean>
创建service,dao类,在dao注入jdbctemplate对象配置文件
<!-- 组件扫描 -->
<context:component-scan base-package="com.atguigu"></context:component-scan>
⚫ Service
@Service
public class BookService {
//注入 dao
@Autowired
private BookDao bookDao;
}
⚫ Dao@Repositorypublic class BookDaoImpl implements BookDao { //注入 JdbcTemplate
@Autowired private JdbcTemplate jdbcTemplate
JdbcTemplate操作数据库
事务操作
事务概念
事务是数据库操作的基本单元,逻辑上一组操作,要么都成功,要么有一个失败所有的操作都失败
事物的四个特性(ACID)
原子性
一致性
隔离性
持久性
事务操作 (搭建事务操作环境)
-
创建数据库表,添加记录
-
创建service,搭建dao,完成对象创建和注入关系
-
service注入dao,在dao注入jdbctemplate,在jdbcTemplate注入DataSource
-
@Service public class UserService { //注入 dao @Autowired private UserDao userDao; } @Repository public class UserDaoImpl implements UserDao { @Autowired private JdbcTemplate jdbcTemplate; }
-
-
-
在dao创建两个方法,在service创建方法(转账方法)
-
@Repository public class UserDaoImpl implements UserDao { @Autowired private JdbcTemplate jdbcTemplate; //lucy 转账 100 给 mary //少钱 @Override public void reduceMoney() { String sql = "update t_account set money=money-? where username=?"; jdbcTemplate.update(sql,100,"lucy"); } //多钱 @Override public void addMoney() { String sql = "update t_account set money=money+? where username=?"; jdbcTemplate.update(sql,100,"mary"); } } @Service public class UserService { //注入 dao @Autowired private UserDao userDao; //转账的方法 public void accountMoney() { //lucy 少 100 userDao.reduceMoney(); //mary 多 100 userDao.addMoney(); } }
-
事务操作(spring事务管理介绍)
-
事务添加到JavaEE三层架构的service(业务逻辑层)
-
在Spring进行事务管理操作
-
有两种方式:编程式事务管理和声明式事务管理(使用)
-
-
声明式事务管理
-
基于注解方式(使用)
-
基于xml配置文件方式
-
-
在Spring进行声明式事务管理,底层使用AOP原理
-
Spring事务管理API
-
提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
-
-
事务操作(注解声明式事务管理)
-
在spring配置文件中配置事务管理
-
<!--创建事务管理器--> bean id="transactionManager" lass="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--注入数据源--> <property name="dataSource" ref="dataSource"></property>/bea
-
-
在spring配置文件中开启事务注解
-
(1)在 spring 配置文件引入名称空间 tx<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">(2)开启事务注解<!--开启事务注解--> <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
-
-
-
在service类上或者service类里面方法上面添加事务注解
-
@Transactional,这个注解添加到类上面,也可以添加方法上面
-
如果把这个注解添加类上面,这个类里面所有的方法都添加事务
-
如果把注解添加到方法上面,这个方法添加事务
事务操作(声明式事务管理参数配置)
-
在service类上面添加注解@Transactional,在这个注解里面可以配置事务相关的参数。
-
propagation:事务传播行为
-
多事务方法直接进行调用,这个过程中事务是如何进行管理的事务传播行为
-
事务方法:对数据库数据进行变化的操作,
-
@Transactional public void add(){ //掉哦用update方法 update(); }
-
spring框架事务传播行为有7种
-
REQURED:如果add方法本身有事务,调用update方法之后,update使用当前add方法里面事务,如果add方法本身没有事务,就创建新事务
-
REQURED_NEW:使用add方法调用update方法,如果add方法无论是否有事务,都创建新的事务。
-
-
-
ioslation:事务隔离级别
-
事务有特性成为隔离性,多事务操作之间不会产生影响,不考虑隔离性产生很多问题。
-
有三个读问题,脏读,不可重复读,虚读
-
脏读:一个未提交的事务读取到另一个未提交的事务的数据
-
不可重复读:一个未提交的事务读取到空一个已提交的事务修改数据
-
虚读:一个未提交的事务读取到另一个提交事务添加数据
-
通过事务隔离级别,解决读问题
-
-
timeout:超时时间
-
readonly:是否只读
-
rollbackFor:回滚:设置出现异常进行回滚
事务操作(XML声明式事务管理)
-
在Spring配置文件中进行配置
-
配置事务管理器
-
配置通知
-
配置切入点和切面
-
<!--1 创建事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--注入数据源--> <property name="dataSource" ref="dataSource"></property> </bean> <!--2 配置通知--> <tx:advice id="txadvice"> <!--配置事务参数--> <tx:attributes> <!--指定哪种规则的方法上面添加事务--> <tx:method name="accountMoney" propagation="REQUIRED"/> <!--<tx:method name="account*"/>--> </tx:attributes> </tx:advice> <!--3 配置切入点和切面--> <aop:config> <!--配置切入点--> <aop:pointcut id="pt" expression="execution(* com.atguigu.spring5.service.UserService.*(..))"/> <!--配置切面--> <aop:advisor advice-ref="txadvice" pointcut-ref="pt"/> </aop:config>
-
事务操作(完全注解声明式事务管理)
-
创建配置类,使用配置类代替xml文件
-
@Configuration //配置类 @ComponentScan(basePackages = "com.atguigu") //组件扫描 @EnableTransactionManagement //开启事务 public class TxConfig { //创建数据库连接池 @Bean public DruidDataSource getDruidDataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql:///user_db"); dataSource.setUsername("root"); dataSource.setPassword("root"); return dataSource; } //创建 JdbcTemplate 对象 @Bean public JdbcTemplate getJdbcTemplate(DataSource dataSource) { //到 ioc 容器中根据类型找到 dataSource JdbcTemplate jdbcTemplate = new JdbcTemplate(); //注入 dataSource jdbcTemplate.setDataSource(dataSource); return jdbcTemplate; } //创建事务管理器 @Bean public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) { DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(); transactionManager.setDataSource(dataSource); return transactionManager; } }
-
-
-
-
-
-