* 对函数的入口,结束(被称为Aspect - - 切面)都进行日志的打印;
* 函数的进行过程被看做 Jion point,类似的可以是对属性的访问前后,(注意 spring aop 不提供类似属性访问的这些操作,只能 做一些跟函数执行相关的aop );
* 所以说spring aop 并不是一个完整的aop实现,当然spring aop的目标: 整合aop与IOC这两部分的功能;
* 如果要了解更完整的aop,可以了解一下aop框架: AspectJ ;
* spring aop的两种使用方式:
XML schema-based AOP
@AspectJ annotation-based AOP
* Mylogger在对函数出口,入口打日志的行为被称为advice,定义的是切面在某个特定的点,函数执行的某个功能吧。
* 在实际的aop操作时,我们要告诉那些的逻辑代码需要aop操作的,也就是我们需要一种方式来告诉aspect,在哪些函数上需要 去执行aspect。那一般情况下,假如,我们通过正则表达式的方式,Caculator*(这里的表达式是错误的)所有的方法 上 都做操作,你可以告诉这个“表达式”aop去哪些业务代码上去做aop操作;那我们把这个“表达式”称为 Pointcut 。
1.aop 能做什么?
a.aop可以作用于函数执行;
b.aop可以简化代码;
c.aop可以对代码进行解耦;
d.aop可以作用对所有访问权限(private、protected、public)的函数;
2.aop由那些部分构成?
(1)aspect:日志、安全等一些横切的功能;
(2)jion piont:主要指 函数的执行或者属性的访问;
(3)advice:在某个函数的执行点上要执行的切面功能;
五种类型的增强或通知(Advice)
Before:函数执行前、
After returning:函数正常返回之后、
After-throwing:函数抛出异常之后、
After finally:函数返回之后
Aound:函数的执行前后
(4)Pointcut <匹配横切目标函数的表达式>;其实就是寻找那些函数需要aop;
(注意事项:必须声明函数的返回值匹配模式、必须声明函数的参数李彪匹配模式)
示例如下:
-
任意公共方法的执行:
execution(public * *(..))
-
任何一个以“set”开始的方法的执行:
execution(* set*(..))
-
AccountService 接口的任意方法的执行:
execution(* com.xyz.service.AccountService.*(..))
-
定义在service包里的任意方法的执行:
execution(* com.xyz.service.*.*(..))
-
定义在service包或者子包里的任意方法的执行:
execution(* com.xyz.service..*.*(..))
-
在service包里的任意连接点(在Spring AOP中只是方法执行) :
within(com.xyz.service.*)
-
在service包或者子包里的任意连接点(在Spring AOP中只是方法执行) :
within(com.xyz.service..*)