aop概念以及解决的问题
AOP:切面编程,可以通过预编译的方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术
解决的问题:AOP吧很多类对象中的横切问题点,从业务逻辑中分离出来从而达到解耦的目的,增加代码的重用性,提高开发效率
AOP的应用场景
切面类一定不是核心业务逻辑,功能是可有可无的状态可以使用AOP
经常使用场景:
日记记录
权限验证
事务处理
效率检查
异常处理
缓存处理
数据持久化
内容分发
AOP的使用
Spring AOP切面
aspect:切面,切面有切点和通知组成,即包括横切逻辑的定义也包括连接点的定义
pointcut:切点,每个类都拥有多个连接点,也可以理解是连接点的集合
joinpoint:连接点,程序执行的某个特定位置,如某个方法调用前后等
weaving:织入,将增强添加到目标类的具体连接点的过程
advice:通知,是织入到目标类连接点上的一段代码,就是增强到什么地方?增强到什么内容?
target:目标对象,通知织入的目标类
aop Proxy:代理对象,即增强后产生的对象
Spring AOP底层实现,是通过JDK动态代理和CGLib代理在运行使其在对象初始话阶段织入代码的。
JDK动态代理基于接口实现 -------- 区别 --------- CGLib是基于类的继承实现
通知的种类
Before advice
前置通知,即在目标方法调用之前执行。注意:即无论方法是否遇异常都执行
After returning advice
后置通知,在目标方法执行后执行,前提是目标方法没有遇到异常,如果有异常则不执行通知
After throwing advice
异常通知,在目标方法抛出异常时执行,可以获取异常信息
After finally advice
最终通知,在目标方法执行后执行,无论是否是异常执行
Around advice
环绕通知,最强大的通知类型,!,可以控制目标方法的执行(通过调用ProceedingJoinPoint.proceed()),可以在目标执行全过程中进行执行。
如何写一个切面类
1:定义一个切面类Aspect
即在声明的类,增加@Component @Aspect两个注解,Springboot中要引入 spring-boot-stater-aop依赖包
2:定义切点 Pointcut
定义切点,并定义切点在那些地方执行,采用@Pointcut注解完成,如@Pointcut(public*com.xxx.xxx.*.*(..) )规则:修饰符(可以不写,但不能用*)+ 返回类型 + 那些包下的类 + 那些方法 + 方法参数 “*”代表不限,“..”两个点代表参数不限
3:定义Advice通知
利用通知的5种类型注解@Before、@After、@AfterReturning、@AfterThrowing、@Around来完成在某些切点的增强动作,如@Before("myPointcut()”),myPointcut为第二步骤定义的切点
/**
*定义一个切面类
*/
@Aspect
@Component
public class toggingAdvice {
}
定义切点
@Pointcut(value = "execution( * com.quanfon.sprint.aop.controller.*.*(..) )"){
public void Pointcut(){
}