1.什么是aop?
OOP对比,面向切面,传统的OOP开发中的代码逻辑是至上而下的,在这些至上而下的过程中
会产生一些横切性的问题,这些横切性的问题和我们的主业务逻辑关系不大,会散落在代码的各个
地方,造成难以维护,AOP的编程思想就是把业务逻辑和横切的问题进行分离,从而达到解耦的目
的,提高代码的重用性和开发效率
2.aop的应用场景
1.日志记录
2.权限验证
3.效率检查
4.事务管理
5.。。。。
3.aop的常用术语
1.连接点(Join point):需要加强的方法,即我们需要在哪个方法中添加额外的信息,或者说
连接点指的就是目标对象中的一个方法。
2.切点(Pointcut):连接点的集合就是切点。
3.目标对象(Target):就是指我们需要加强的类对象。
4.代理对象(AOP proxy):加强后的目标对象,代理对象是Spring内部根据目标对象重新生
成的一个新的对象,该对象是动态生成的,
5,织入(weaving):是指的将部分逻辑(比如一些日志,权限验证等)加入到连接点的过
程。
6.通知(advice):通知由两部分组成,是由具体的业务逻辑和要放到的具体位置(在连接点
之前、之后、中间执行)组成的。
7.切面(aspect):切面可以理解为是以上内容的载体。
4.spring aop 和AspectJ的联系
aop是一种思想,和Ioc一样,而spring aop是aop的一种实现方式。AspecJ是一个
面向切面的框架,定义了aop语法。由于spring aop的语法使用比较复杂难以理解,因此
spring借助了AspectJ的语法(主要借助的其中的注解 ),底层的实现还是spring自己的技术
,当我们要在spring中使用AspectJ时需要通过以下两种方式来开启:
1)在使用xml时,需要在xml配置文件中添加<aop:aspectj-autoproxy/>.
2)在使用javaConfig时,添加@EnableAspectJAutoProxy.
5.spring aop的切点声明使用
-
javaconfig
1)execution的使用方式:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)
这里问号表示当前项可以有也可以没有,其中各项的语义如下
modifiers-pattern:方法的可见性,如public,protected;
ret-type-pattern:方法的返回值类型,如int,void等;
declaring-type-pattern:方法所在类的全路径名,如com.spring.Aspect;
name-pattern:方法名类型,如buisinessService();
param-pattern:方法的参数类型,如java.lang.String;
throws-pattern:方法抛出的异常类型,如java.lang.Exception;
example:
execution(public * com.spring.service.BusinessObject.businessService(java.lang.String,…))2)within的使用:
within的针对的主要是类,相比于execution,within的粒度更大,它无法针对详细
的方法,只能针对类。3)args的使用:
args中指明参数类型以及参数个数,spring会匹配所有符合的方法将其织入。4)@annotation
使用步骤:
1.需要自己定义注解,如@AnnotationTest.
2.需要在@annotation中声明自定义的注解
3.将自定义的注解添加到连接点上,该注解只能置于方法上才生效,置于类上不生效。5)@args
使用步骤:
1)需要将自定义的注解加到方法参数所调用的类上面,如上面所示。
6)this和target
this是指代理对象是指定的类或子类则进行织入,target指目标对象为指定的类或子类则进行织入。
aop的动态代理可以指定为jdk或cglib,可以通过@EnableAspectJAutoProxy(proxyTargetClass = true)指定,当为
true时,为cglib,当为false时,为jdk代理
7)@DeclareParents使用
5.Spring aop通知类型:
1)前置通知@before
2)后置通知@after
3)环绕通知@around
4)后置异常通知@AfterThrowing
5)后置返回通知@AfterReturning
在使用通知时可以为其添加参数,如下: