AOP
了解
AOP 面向切面编程,是为了在更改原代码的情况下对原有的业务方法进行扩展,对公用方法进行抽取。
组成
- 切面(Aspect):一个对象(提供扩展方法的对象)。
- 切入点(PointCut): 执行切面内方法的地址。
- 目标(Target):被切入的对象。
- 建议(Advice):扩展方法的方式。
- 连接点(JoinPoint):被切对象的切入匹配点。
实现方式
使用原生AOP的接口 配置:
【Spring Aop】java:
//根据方法的不同调用的建议也不同 此时是方法前
public class Log implements MethodBeforeAdvice {/**
*
* @param method 方法
* @param args 参数
* @param target 目标对象
* @throws Throwable
*/
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println(target.getClass().getName()+"的"+method.getName());
}
}
// 方法返回后
public class AfterReturnLog implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println(target.getClass().getName()+"的"+method.getName()+"结果是"+returnValue);
}
}
测试类:
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
BookService bookService = (BookService) context.getBean("bookService");
bookService.add();
}
}
使用自定义类实现
注解的方式 配置:
java:
@Aspect
public class AspectLog1 {
@Before("execution(* com.spring.service.BookServiceImpl.*(..))")
public void before1(){
System.out.println("运行前1");
}
@Before("execution(* com.spring.service.BookServiceImpl.*(..))")
public void before2(){
System.out.println("运行前2");
}
@After("execution(* com.spring.service.BookServiceImpl.*(..))")
public void after(){
System.out.println("运行后");
}
@AfterReturning("execution(* com.spring.service.BookServiceImpl.*(..))")
public void afterReturning(){
System.out.println("返回结果后");
}
@Around("execution(* com.spring.service.BookServiceImpl.*(..))")
public Object around(ProceedingJoinPoint pj) throws Throwable {
System.out.println("环绕前");
Object result = pj.proceed();
System.out.println("环绕后");
return result;
}
}
AOP 不同advice 执行顺序
- around->before->方法正常执行->around(结束)->after->afterReturning
- around->before->方法异常执行->around(结束)->after->afterThrowing->抛出异常
不同切面中 相同的advice,通过@Order注解来判断先后,值越小越靠前。
不同的advice,按照上述顺序执行。
推荐阅读
- XShell、XFtp免费许可证增强(删除标签限制!)
- 面对科技公司的制裁,俄罗斯放出封印7年的神兽(RuTracker)
- Flink 在风控场景实时特征落地实战
- 开源项目因支持乌克兰遭issue刷屏,网友(别用Nginx,别用元素周期表)
- 微软商店上架Windows&Office破解工具,并获5星好评()
- GitHub CEO发文(严格限制俄罗斯获取侵略性军事能力所需要的技术)
- Spring Cloud Gateway现高风险漏洞,建议采取措施加强防护
- VS Code 2022路线图(大量Spring Boot优化提上日程!难道是被JB Code吓到了())
- Spring Boot 3.0.0 发布第一个里程碑版本M1,你的 Java 升到17 了吗()