AOP
应用于事务 日志 权限 参数验证等
问:什么是AOP
答:1. 面向切面编程(aspect oriented programe),它的编程思想是把横切性的问题和主业务逻辑分离从而达到解耦的目的
2.通俗点讲就是在方法之前或者之后处理事情 (日志 事务 权限 参数验证)
3.与之对应的面向对象编程(aspect object programe) 是自上而下的,解决代码复用问题
4.底层实现原理是代理设计模式
@Transactional实现思路:
1.声明注解:Transactional 也可以自定义注解
2.声明AOP类处理有Transactional注解的方法 (比如:在方法之前开启事务 方法之后提交事务)
//官网实现AOP类步骤: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#aop-ataspectj
1.项目添加切面支持(Enabling @AspectJ Support),两种方式(注解 和 xml)
2,声明切面类 (Declaring an Aspect),加注解@Aspect 还要加@Aspect
3,声明切点位置(Declaring a Pointcut) @Pointcut("execution(* com.base.web.service.*.*(..))")
4.写增强方法并声明增强类型(Declaring Advice)
//切点类型汇总 九种
within @within
target @target
args @args
execution @annotation this
//增强类型汇总
@Before
@After
@AfterReturning
@AfterThrowing
@Around
//案例
package com.base.springAop;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class YmAspect {
@Pointcut("execution(* com.base.web.service.*.*(..))")
private void pointCut(){
};
@Before("com.base.springAop.YmAspect.pointCut()")
public void before(){
System.out.println("切面类里面的前置增强方法执行了");
}
@After("com.base.springAop.YmAspect.pointCut()")
public void after(){
System.out.println("切面类里面的后置增强方法执行了");
}
@Around("com.aop.DIY.DiyAspect.pointCut()")
public Object around(ProceedingJoinPoint pjp){
Object proceed = null;
try {
proceed = pjp.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return proceed;
}
}
第01章手写spring事务框架
分为 编程事务和声明事务(原理使用编程事务 + 反射机制)
事务特性:acid
Atomicity 原子性 事务包含的所有操作要嘛全部成功,要嘛全部回滚
Consistency 一致性 数据的整体状态不变(A和B相互转账,两个人加起来的总账户不变更)
Isolation 隔离性:A和B两个事务,A要嘛在B开始之前执行,要嘛在B结束之后执行,达到多个并发事务相互隔离
Durability 持久性:事务一旦被提交了,对数据库的改变是永久性的,即使是在数据库遇到故障也必须将事务执行完成
1.自定义注解
2.封装编程式事务 第一章
3.扫包,定义一个事务扫包AOP,利用反射机制判断是否有注解