什么是AOP
AOP是Aspect Oriented Programming的缩写
Aspect表示切面,给业务方法增加的功能,叫做切面。切面一般都是非业务功能,而且切面功能一般都是可以复用的。例如日志功能,事务功能,权限检查,参数检查,统计信息等等
Oriented 面向
Programming 编程
AOP中的一些术语
Aspect:切面,指给业务方法增加的功能
JoinPoint:连接点,连接切面的业务方法,在这个业务方法执行时会同时执行切面的功能
Poingcut:切入点,是一个或多个连接点的集合,表示这些方法执行时都能增加切面的功能。。表示
切面
执行的位置(
这里的位置不是指具体业务逻辑里执行切面的位置,是指哪些方法需要执行切面的位置
)
target:目标对象,给哪个对象增加切面的功能,这个对象就是目标对象
Advice:通知(增强),表示切面的执行时间。在目标方法之前执行切面,还是目标方法之后执行切面
AOP中比较重要的三要素:Aspect,Pointcut,Advice。这三者的联系是:在Advice的时刻,在Pointcut的位置去执行Aspect
AOP是一个动态的思想。在程序运行期间创建代理,使用代理执行方法时,增加切面的功能。这个代理对象是存在于内存中的
AspectJ框架
AspectJ框架可以使用注解和xml配置文件两种方式 实现 AOP
Aspectj表示切面执行时间,用的通知(Advice)。 这个通知可以使用注解表示。
常用5个注解, 表示切面的5个执行时间, 这些注解叫做通知注解。
@Before : 前置通知
@AfterRetunring: 后置通知
@Around: 环绕通知
@AfterThrowing:异常通知(发生异常且没有被catch时会触发该通知)
@After:最终通知(无论有没有异常都会执行该切面,并且是最后执行的,类似try-catch-finally中的finally)
Pointcut 位置
Pointcut 用来表示切面执行的位置, 使用Aspectj中切入点表达式。
切入点表达式的官方语法是
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?namepattern(param-pattern)
throws-pattern?)
解释下:
modifiers-pattern] 访问权限类型
ret-type-pattern 返回值类型
declaring-type-pattern 包名类名
name-pattern(param-pattern) 方法名(参数类型和参数个数)
throws-pattern 抛出异常类型
?表示可选的部分
可能看着有点复杂,举个例子 我建了一个项目 结构如下
在切面类中我想让doSome方法执行的时候额外在控制台打印执行时间,那么就可以写一个方法来实现
这个表达式就完整的表示在doSome方法执行时会执行切面里的逻辑,我在里面就是很简单的打印了一个当前时间。表示在doSome方法什么时候执行的
(其实我写的execution表达式还可以再精简到execution(void doSome(String,Integer)) 因为上面介绍过带?的是可选的)
执行doSome方法控制台打印结果
这就是切面的简单使用。
execution表达式还可以使用通配符进一步简化表达式的编写
详细了解可以去网上搜下