spring-AOP&事务
- 1.切点表达式
- 2.四大通知-不建议使用:
- 3.用环绕通知就不要用四大通知了。同时用会报错嘛?
- 4.xml和配置类可以同时使用吗?
- 5.经过aop增强之后容器中存的是代理对象,就不是源对象了,获取的都是代理对象。
- 6.aop应用场景:声明式事务,打印日志,性能统计 。
- 7.java中的方法签名:singnature&打印方法调用日志信息.
- 8.Spring事务管理相关的API
- 9.**事务管理三个API之间的关系**
- 10.TransactionDefinition:事务定义,隔离级别,传播行为,只读,超时时长,都可以通过配置来设置
- 11.@Transactional
- 12.注解中:属性的引用是按id,id是@bean下的方法名,不是return的对象名字。
- 13.数据库事务隔离级别:
1.切点表达式
切点表达式的作用: 定义一组规则, 用于在连接点中挑选切点
* : 代表占位符,占据的是1个或者多个位置
.. : 代表占位符,占据的是0个或者多个位置
2.四大通知-不建议使用:
- 前置通知(before) :增强方法在切点运行之前执行
- 后置通知(after-returning):增强方法在切点正常运行结束之后执行
- 异常通知(after-throwing):增强方法在切点发生异常的时候执行
- 最终通知(after):增强方法在切点的最终执行
四个通知,同时使用的时候会:它的执行顺序会收到XML中 配置的影响(after和exception),(注解和xml都有问题)不建议使用。
3.用环绕通知就不要用四大通知了。同时用会报错嘛?
不会报错,只是不建议这样用。
4.xml和配置类可以同时使用吗?
可以
1)在配置类中引入xml配置文件:
@Configuration
@ImportResource("classpath:spring-config.xml")
public class SpringConfig {
}
2)在xml中引入配置类
<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 http://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/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool.xsd">
<bean id="strBean" class="java.lang.String" ></bean>
<context:annotation-config></context:annotation-config>
<bean class="com.example.config.SpringConfig"></bean>
</beans>
原文链接:https://blog.csdn.net/Guesshat/article/details/108967413
5.经过aop增强之后容器中存的是代理对象,就不是源对象了,获取的都是代理对象。
6.aop应用场景:声明式事务,打印日志,性能统计 。
7.java中的方法签名:singnature&打印方法调用日志信息.
1)方法签名,包括方法名以及参数列表
2)为什么不包含返回值类型?
编译器无法从所有的上下文中确定,该方法是那个重载版本,因此为了避免“模棱两可”的局面, java方法签名中不包含返回值类型
例如:
public String m123(int i) {
return "456";
}
public int m123(int i) {
return 123;
}
java不能签名_为什么Java方法签名不能包含返回值类型_weixin_39931101的博客-CSDN博客
3)aop环绕通知:获取方法签名打印日志:
@Around("pt()")
public Object aroundMethod(ProceedingJoinPoint pjp) {
Object obj = null;
try {
System.out.println("即将执行方法" + new Date().toLocaleString());
obj = pjp.proceed();
//记录请求:类名\方法名\参数\返回结果
System.out.println("类名:" + pjp.getTarget().getClass().getName());
System.out.println("请求参数:" + Arrays.toString(pjp.getArgs()));
System.out.println("返回结果" + obj);
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
System.out.println("方法名:" + methodSignature.getName());
System.out.println("方法正常结束" + new Date().toLocaleString());
} catch (Throwable throwable) {
throwable.printStackTrace();
System.out.println("方法出现异常" + new Date().toLocaleString());
}finally {
System.out.println("方法运行到最后" + new Date().toLocaleString());
}
return obj;
}
8.Spring事务管理相关的API
1)PlatformTransactionManager
PlatformTransactionManager这是Spring进行事务管理的一个根接口,我们要使用它的实现类做事务管理
我们需要知道的是:mybatis和jdbcTemplate都可以使用它的一个子类(DataSourceTransactionManager)做事务管理
2)TransactionDefinition
TransactionDefinition这个API是用来做事务定义的
2-1)隔离级别
2-2)传播行为
a(){ b();//b被a调用 a---b a: 没有事务 自己开一个事务 a: 有事务 共用一个事务 } b(){}
事务传播行为指的就是当一个业务方法【被】另一个业务方法调用时,应该如何进行事务控制
2-3)只读性
只读事务(增 删 改不能使用,只能查询使用)
换句话说,只读事务只能用于查询方法
2-4)超时时长
事务超时时间, 此属性需要底层数据库的支持
它的默认值是-1, 代表不限制
3)TransactionStatus
TransactionStatus代表的是事务的当前状态
TransactionStatus用于保存当前事物状态,比如是否只能回滚、是否包含回滚点、是否只读,其实现类内部包含事物操作对象transaction
事物操作对象transaction包含不同的实现,比如JDBC的DataSourceTransactionObject、Hibernate的HibernateTransactionObject等。
原文链接:https://blog.csdn.net/my_momo_csdn/article/details/101164559
9.事务管理三个API之间的关系
PlatformTransactionManager通过读取TransactionDefinition中定义事务信息参数,来管理事务,
管理之后会产生一些列的TransactionStatus
10.TransactionDefinition:事务定义,隔离级别,传播行为,只读,超时时长,都可以通过配置来设置
advice:传递的参数:
id 标识,要求唯一
transaction-manager: 指定要给哪个事务管理器传参数
isolation="DEFAULT" 事务隔离级别
propagation="REQUIRED" 事务传播行为
read-only="false" 事务是否只读
timeout="-1" 超时时间 不限制
name="" 用于匹配切点名称,只有匹配成功之后,才能执行所匹配中的策略
匹配是从上向下依次执行,一旦匹配成功了,就不会向下再匹配了
注意:method name=“*”,在最下面,作为匹配的保障。
11.@Transactional
注意方法和类上可以同时出现,方法上的注解优先级高。
记得每天上传。
12.注解中:属性的引用是按id,id是@bean下的方法名,不是return的对象名字。
@bean方法传参是按类型从容器中注入的
注解中:属性的引用是按id,id是@bean下的方法名,不是return的对象名字。
13.数据库事务隔离级别:
级别 | 名字 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 数据库默认隔离级别 |
---|---|---|---|---|---|---|
1 | 读未提交(可以读别的事务未提交的,脏读) | read uncommitted | 是 | 是 | 是 | |
2 | 读已提交(可以重复读别的事务已提交的,可能两次读取的数据不一样) | read committed | 否 | 是 | 是 | Oracle和SQL Server |
3 | 可重复读(不可以再次读取别的事务提交的修改的的,但可以读取别的事务新增的) | repeatable read | 否 | 否 | 是 | MySQL |
4 | 串行化 | serializable | 否 | 否 | 否 |