AOP使用总结
程序员文章站
2024-03-19 16:38:16
...
1. AOP简介
AOP是一种编程范式,它主要是为了将非功能模块与业务模块分离开来,让我们更好的管理这些非功能模块。
它的使用场景有:权限控制、日志打印、事务控制、缓存控制、异常处理
2. AOP使用
- 在类上注解 @Aspect
- 如果想在方法执行前做操作,那么注解@Before注解
- 如果想在方法执行后做操作,那么注解@After注解
五大Advice注解:
- @Before 方法执行前执行该切面方法
- @After 方法执行后执行该切面方法
- @AfterThrowing 方法抛出异常后执行该切面方法
- @AfterReturning 方法返回值后执行该切面方法
- @Around 环绕注解,集合前面四大注解
2.1 @Aspect
注解在类上,表明此类是一个面向切面的类,同时也要记得在类上注解
@Component
或者@Service
将此类交给Spring管理
2.2 @Poincut
用来注解在方法上,表明此方法为切面方法
常用表达式有:
@Poincut("@annotation(myLogger)") //只拦截有注解为@myLogger的方法
@Poincut("within(com.pibigstar.service.*) ") //只拦截com.pibigstar.service包下的方法
//拦截public修饰符,返回值为任意类型,com.pibigstar.servce包下以Service结尾的类的所有方法,方法参数为任意
@Poincut("execution("public * com.pibigstar.service.*Service.*(..)")
@Poincut("bean(*service)") //只拦截所有bean中已service结尾的bean中的方法
designators(指示器)常用的表达式
2.3 @Before
在方法执行下执行该切面方法,其用法与@Poincut类似
//只拦截com.pibigstar包下,并且注解为myLogger的方法
@Before("within(com.pibigstar..*) && @annotation(myLogger)")
public void printBeforeLog(MyLogger myLogger) {
String host = IPUtil.getIPAddr(request);
log.info("====IP:"+host+":开始执行:"+myLogger.description()+"=======");
}
2.4 @After
在方法执行后执行该切面方法
//方法结束后
@After("within(com.pibigstar..*) && @annotation(myLogger)")
public void printAfterLog(MyLogger myLogger) {
log.info("=====结束执行:"+myLogger.description()+"=====");
}
2.5 @AfterThrowing
当方法抛出异常后执行该切面方法
@AfterThrowing(@annotation(myLogger)",throwing = "e")
public void printExceptionLog(MyLogger myLogger,Exception e) {
log.info("======执行:"+myLogger.description()+"异常:"+ e +"=====");
}
2.6 @AfterReturning
方法有返回值,打印出方法的返回值
//方法有返回值
@AfterReturning(value = "@annotation(myLogger)",returning="result")
public void printReturn(Object result) {
log.info("======方法的返回值:"+result+"========");
}
2.7 @Around
集合@Before,@After,@AfterReturning,@AfterThrowing 四大注解
//集合前面四大注解
@Around("@annotation(myLogger)")
public Object printAround(ProceedingJoinPoint joinPoint,MyLogger myLogger) {
Object result = null;
try {
log.info("======开始执行:"+myLogger.description()+"=======");
result = joinPoint.proceed(joinPoint.getArgs());
log.info("======方法的返回值:"+result+"========");
} catch (Throwable e) {
e.printStackTrace();
log.info("======执行异常"+ e +"=======");
}finally {
log.info("======结束执行:"+myLogger.description()+"=======");
}
return result;
}
上一篇: 【用Python学习Caffe】1. 使用Caffe完成图像分类
下一篇: 机器学习之kNN分类算法
推荐阅读
-
使用k-近邻算法改进约会网站的配对效果。
-
Spring注解驱动开发第5讲——使用@Scope注解设置组件的作用域
-
学习mpvue : 使用mpvue实现2048小程序
-
Spring注解驱动开发第8讲——使用@Import注解给容器中快速导入一个组件
-
Spring注解驱动开发第2讲——使用@Configuration和@Bean给容器中注册组件
-
使用 VGG16 实现图像识别分类,使用 VGG 19 实现艺术风格转移
-
SpringBoot之AOP具体实现详解
-
Spring-AOP 混合使用各种切面类型及不同切面总结
-
springboot定义aop类
-
【用Python学习Caffe】1. 使用Caffe完成图像分类