AOP是面向切面的编程思想:
将业务逻辑模块中,需要进性处理的功能点,从逻辑上的角度将其作为一个整体进性管理;这个整体,就可以看做是有这些不同模块中的逻辑点构成的一个面;这个面就是切面;
连接点(Joinpoint):进性切面业务处理时的时机点,例如方法执行前、方法执行后、抛出异常等时机点;
增强(Advice):添加特定连接点上的一段业务逻辑处理代码;也就是在连接点上执行的业务处理过程;
就是在特定连接点上触发的一组动作;
切入点(PointCut):被增强的连接点就是切入点; 添加了增强功能的连接点;
织入(Weaving):将增强添加到目标对象的具体的连接点的过程。也就是将增强和连接点结合的过程就是织入;
切面(Aspect):切面由切入点和增强构成。切面就是切入点的集合;AOP就是通过切面来管理连接点和增强的;
目标对象(Target):需要添加增强的目标类。(被代理的目标类)
代理(Proxy):目标对象通过AOP生成的代理对象;代理和目标对象之间是代理和被代理的关系;
引入(Introduction):是一种特殊的增强;可以为目标对象添加一些属性和方法;一般用作动态的给目标对象附加一些行为能力
AOP包含有注解和切入点表达式两种方式 :
1.@Aspect注解,只能引入AspectJ相关的 jar 包:
aopalliance-1.0.jar 和 aspectjweaver.jar
2.切点表达式
1.execution
由于Spring切面粒度最小是达到方法级别,而execution表达式可以用于明确指定方法返回类型,类名,方法名和参数名等与方法相关的部件,并且在Spring中,大部分需要使用AOP的业务场景也只需要达到方法级别即可,因而execution表达式的使用是最为广泛的。如下是execution表达式的语法
2.within
3.args
4.this和target
this和target需要放在一起进行讲解,主要目的是对其进行区别。this和target表达式中都只能指定类或者接口,在面向切面编程规范中,this表示匹配调用当前切点表达式所指代对象方法的对象,target表示匹配切点表达式指定类型的对象。比如有两个类A和B,并且A调用了B的某个方法,如果切点表达式为this(B),那么A的实例将会被匹配,也即其会被使用当前切点表达式的Advice环绕;如果这里切点表达式为target(B),那么B的实例也即被匹配,其将会被使用当前切点表达式的Advice环绕。
示例实现一个功能:controller层所有方法,入参和出参的自动打印
实现步骤日志打印 pom.xml 依赖
4.3.12.RELEASE 2.9.1 1.8.91.2.2 1.16.18
spring-mvc.xml 添加 aop 自动代理
新建注解 LogPrint,将注解作为切点,作用到 Controller 的方法
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface LogPrint { String description() default ""; }
新建切面 LogPrintAspect,在 controller 方法调用前,调用后打印入参,出参
@Aspect @Component @Slf4j public class LogPrintAspect { // 1,声明切点 @Pointcut("@annotation(cn.exrick.common.annotaion.LogPrint)") public void logPrint(){} // 2,打印入参 joinPoint.getArgs() -- 获取入参 @Before("logPrint()") public void doBefore(JoinPoint joinPoint){ // 3, 打印出参 proceedingJoinPoint.proceeding() -- 执行切点修饰的方法,拿到结果,打印响应 @Around("logPrint()") public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {} // 4,切点作用的方法结束 @After("logPrint()") public void doAfter(){} }
使用注解 @LogPrint 修饰 Controller 类中的方法
@RestController public class LogController { @LogPrint @RequestMapping("/logGet") public Object getTest(String name, String age){ String content = name + "今年" + age + "岁"; HashMapresultMap = new HashMap<>(); resultMap.put("content", content); return resultMap; } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)