拒绝废话,拒绝冗余文字,直接上代码和案例
1 导入依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>
2 通知类配置解释(各个配置含义在代码中解释):
package com.nanfeng.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import java.util.Arrays;@Aspect
@Component
public class AopAdvice {private final static Logger logger = LoggerFactory.getLogger(AopAdvice.class);/*注意: PointCut中可以使用 && 、|| 、! 运算*//*** 自定义注解 :凡是被注解标注的方法和类都会处罚aop*/@Pointcut("@annotation(com.nanfeng.aop.AopTag)")public void annotation() {}/*** 表达式:访问修饰符 返回值 包名.包名.包名…类名.方法名(参数列表)* 标准写法 :public void com.nanfeng.aop.service.AopService.executionAop()* 省略修饰符号:void com.nanfeng.aop.service.AopService.executionAop()* 返回值使用通配符: * com.nanfeng.aop.service.AopService.executionAop()* 通配符标表示: *.*.*.AopService.*()* 多包名匹配: *.*.*.AopService.*()* 参数类型匹配(根据类型匹配): *.*.*.AopService.*(int,double)* 参数通配: *.*.*.AopService.*(..)*/@Pointcut("execution(* com.nanfeng.aop.service.AopService.aopExecution(..))")public void execution1() {}/*** 指定类型中的所有方法将被拦截* 不包含子类,只是针对当前对象* 包名通配方式 ..* 类名通配方式**/@Pointcut("within(com.nanfeng.aop.service.WithService)")public void with() {}/**** 类型匹配,包含子类中的所有方法(子类中扩展的方法也包含在其中)*/@Pointcut("this(com.nanfeng.aop.service.ThisService)")public void thisService() {}/**** 类型匹配,包含子类中的所有方法(子类中扩展的方法也包含在其中)*/@Pointcut("target(com.nanfeng.aop.service.TargetService)")public void targetService() {}/*** args() 匹配不带参数的方法* args(java.lang.String) 匹配方法参数是String类型的* ==args(…) == 带任意参数的方法* args(java.lang.String,…) 匹配第一个参数是String类型的,其他参数任意。最后一个参数是String的同理。*/@Pointcut("args(..)")public void argsService() {}/*** 匹配方法带有参数com.nanfeng.aop.AopTag注解的方法*/@Pointcut("@args(com.nanfeng.aop.AopTag)")public void argAnnotationsService() {}/*** 匹配bean为beanService的所有方法*/@Pointcut("bean(beanService)")public void beanService() {}@Around("annotation()")public Object annotationAdvice(ProceedingJoinPoint pjp) throws Throwable {Object[] args = pjp.getArgs();Object result = pjp.proceed(args);System.out.println("annotation");return result;}@Around("execution1()")public Object executionAdvice1(ProceedingJoinPoint pjp) {Object[] args = pjp.getArgs();System.out.println(Arrays.toString(args));System.out.println("execution");Object result = null;try {result = pjp.proceed(args);} catch (Throwable e) {throw new RuntimeException(e);}return result;}@Around("with()")public Object withAdvice(ProceedingJoinPoint pjp) {Object[] args = pjp.getArgs();System.out.println(Arrays.toString(args));System.out.println("with");Object result = null;try {result = pjp.proceed(args);} catch (Throwable e) {throw new RuntimeException(e);}return result;}@Around("thisService()")public Object thisAdvice(ProceedingJoinPoint pjp) throws Throwable {//获取方法的信息MethodSignature methodSignature = (MethodSignature) pjp.getSignature();String name = methodSignature.getMethod().getName();logger.info("thisService");//然后做一些重大操作 todo :System.out.println("method name is " + name);Object[] args = pjp.getArgs();System.out.println(Arrays.toString(args));Object result = pjp.proceed(args);return result;}@Around("targetService()")public Object targetAdvice(ProceedingJoinPoint pjp) throws Throwable {//获取方法的信息MethodSignature methodSignature = (MethodSignature) pjp.getSignature();String name = methodSignature.getMethod().getName();logger.info(" targetService");//然后做一些重大操作 todo...................System.out.println("method name is " + name);Object[] args = pjp.getArgs();System.out.println(Arrays.toString(args));Object result = pjp.proceed(args);return result;}@Around("beanService())")public Object beanAdvice(ProceedingJoinPoint pjp) throws Throwable {//获取方法的信息MethodSignature methodSignature = (MethodSignature) pjp.getSignature();String name = methodSignature.getMethod().getName();logger.info("beanService");//然后做一些重大操作 todo...................System.out.println("method name is " + name);Object[] args = pjp.getArgs();System.out.println(Arrays.toString(args));Object result = pjp.proceed(args);return result;}
}
3 配合通知类的service以及注解:
package com.nanfeng.aop;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface AopTag {String value() default "";
}
package com.nanfeng.aop.service;import com.alibaba.fastjson.JSONObject;
import com.nanfeng.aop.AopTag;
import org.springframework.stereotype.Service;@Service
public class AopService {public Object aopExecution(Object o) {return JSONObject.toJSONString(o);}@AopTag(value = "cccc")public Object annotation1(Object o) {return JSONObject.toJSONString(o);}
}
package com.nanfeng.aop.service;import org.springframework.stereotype.Component;@Component
public class BeanService {public void bean1() {System.out.println("bean");}public void bean2() {System.out.println("bean");}
}
package com.nanfeng.aop.service;public interface TargetService {
public Object target1(Object o);
}
package com.nanfeng.aop.service;import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Service;@Service
public class TargetServiceImp1 implements TargetService{@Overridepublic Object target1(Object o) {return JSONObject.toJSONString(o);}
}
package com.nanfeng.aop.service;import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Service;@Service
public class TargetServiceImp2 implements TargetService {@Overridepublic Object target1(Object o) {return JSONObject.toJSONString(o);}public Object target22(Object o) {return JSONObject.toJSONString(o);}
}
package com.nanfeng.aop.service;public interface ThisService {public String AopThis();
}
package com.nanfeng.aop.service;import org.springframework.stereotype.Component;@Component
public class ThisServiceImp implements ThisService{@Overridepublic String AopThis() {return "this aop service";}
}
package com.nanfeng.aop.service;import org.springframework.stereotype.Component;@Component
public class ThisServiceImp1 implements ThisService{@Overridepublic String AopThis() {return "this aop service1";}public String AopThis1() {return "this aop service2";}
}
package com.nanfeng.aop.service;import org.springframework.stereotype.Service;@Service
public class WithService {public String aopwith() {return "31213";}
}
3 测试接口
package com.nanfeng.aop;import com.nanfeng.aop.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class AopController {@Autowiredprivate AopService service;@Autowiredprivate WithService withService;@Autowiredprivate ThisServiceImp thisService;@Autowiredprivate ThisServiceImp1 thisService1;@Autowiredprivate TargetServiceImp1 target1;@Autowiredprivate TargetServiceImp2 target2;@Autowiredprivate BeanService beanService;@PostMapping("execution")public Object execution(@RequestBody Object o) {return service.aopExecution(o);}@PostMapping("annotation")public Object annotation1(@RequestBody Object o) {return service.annotation1(o);}@PostMapping("with")public Object with(@RequestBody Object o) {return withService.aopwith();}@PostMapping("this")public Object thisaop(@RequestBody Object o) {return thisService.AopThis() + thisService1.AopThis() + thisService1.AopThis1();}@PostMapping("target")public Object targetaop(@RequestBody Object o) {return target1.target1(o).toString() + target2.target1(o).toString() + target2.target22(o).toString();}@PostMapping("bean")public Object beanaop(@RequestBody Object o) {beanService.bean1();beanService.bean2();return o ;}
}