AOP
Posted ToSun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AOP相关的知识,希望对你有一定的参考价值。
概述
Spring对面向切面编程提供了强有力的支持,通过它让我们将业务逻辑从应用服务(如事务管理)中分离出来,实现了高内聚开发,应用对象只关注业务逻辑,统问题(如日志、事务等)。Spring支持用户自定义切面。面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面
面向切面编程(aop)是对面向对象编程(oop)的补充,面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。
在不影响主业务的情况下对其业务功能的扩充
AOP(面向切面) spring重要的部分,另一个是IOC(控制反转),基于OCP开闭原则
切面术语
2.1切面(aspect):横切面向对象,一般为一个具体的类
2.2切入点(pointcut):定义了切入扩展业务逻辑的位置(一般需要业务扩展的地方),一般会通过表达式进行相关定义,一个切面可以定义多个切入点
2.3通知(Advice):内部封装扩展业务逻辑的具体方法对象,一个切面可以有多个通知
2.4连接点(join point):程序执行过程中,封装了某个正在执行的目标方法信息的对象,可以通过此对象获取具体目标方法的相关信息,甚至调用目标方法
切面常用的注解
@Retention(RetentionPolicy.RUNTIME) 表名此切面在程序运行时起作用
@Target(ElementTypr.
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
例子:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Requiredlog {
String operation() default "" ;//默认空串 @Requiredlog(operation = "公告查询")
}
@Aspect 定义切面(创建切面对象)
@Component 告诉spring这个是普通组件
@Pointcut定义切入点
@annotation切入点表达式,由此注解描述的方法为切入方法
@Pointcut("@annotation(com.cy.common.annotation.Log)")
public void doLoger(){}
通知类型
//@Around("doLoger()")生效范围
@Configuration
具体用法查考:https://blog.csdn.net/u014199143/article/details/80692685
@Before:
作用:把当前方法看成是前置通知。
实现操作:可以用来对数据的过滤或者预处理的操作
@AfterReturning
作用:把当前方法看成是后置通知。
实现操作:据的缓存更新、清除
@AfterThrowing
作用:把当前方法看成是异常通知。
实现操作:进行错误日志的记录,报警,发送邮件,短信等等
@After
作用:把当前方法看成是始终通知。
实现操作:一般是资源释放的操作(最后)
@Around
作用:把当前方法看成是环绕通知。
ProceedingJoinPoint pj封装目标对象的相关信息
@Requiredlog(operation = "删除")在需要扩展的地方引入切面(自定义注解的引入)
getDeclaredField 获取属性
切面顺序
通过@order() 来设置切面的优先级
异步线程
在启动类上加@EnableAsync,在要实现的异步方法上加 @Async ,异步切入点
以上是关于AOP的主要内容,如果未能解决你的问题,请参考以下文章
阿里四面:你知道Spring AOP创建Proxy的过程吗?