不要怕,小编在这里给大家轻松讲解一下Spring框架中的AOP。( ~感觉这个题目就像在斗鸡一样~ )
首先,我们来说说AOP是什么,AOP其实就是面向切面编程啦~是OOP(面向对象编程)的一种补充,用来解决OOP中的耦合度过高的问题。比如在我们的项目中,在各个模块中都有日志的打印功能,在OOP中就会在每个模块中单独写一个日志的方法,如果在项目中有数百个模块,这样代码将是十分臃肿的,而且这么写还会将不同的业务逻辑混为一谈。使用AOP之后,我们将日志的打印这个功能抽象成一个切面,然后通过AOP的技术将这个切面横切于各个模块,这样在各个模块中就不需要再次书写日志的代码啦。
接下来我们介绍一下Spring框架中的AOP。Spring框架提供了一组很好用的AOP的实现,通过Spring框架提供的AOP,我们可以把应用业务里重复的、与业务本身无关的操作,如日志记录、安全控制、异常处理等,抽象成一个独立的“切面”组件,从而变成了与业务逻辑分离的模块。
每个切面都被称为一个增强,增强是需要完成的具体功能,我们可以把一个切面看做是代码模块化的基础。在Spring AOP中,有四种通知类型,分别是前置通知(Before)、返回通知(AfterReturning)、异常通知(AfterThrowing)和最终通知(After)。
- 前置通知:在目标方法执行前执行的通知。
- 返回通知:在目标方法正常执行完毕后执行的通知。
- 异常通知:在目标方法抛出异常时执行的通知。
- 最终通知:在目标方法执行完毕后执行的通知,无论目标方法是否抛出异常都将执行。
除了以上四种通知类型以外,还有环绕通知(Around)这个大爷!环绕通知是最常用的通知类型,是可以在目标方法执行前后都执行的通知。在这个通知中,可以自由决定是否执行目标方法。
现在我们来看一个简单的代码例子:
```java
@Aspect //使用@Aspect注解标注切面
@Component //使用@Component注解将切面交给Spring管理
public class LogAspect {
//在切点方法解析器中配置切点
@Pointcut("execution(* com.example.service.*.*(..))")
private void pointcut() {
}
@Before("pointcut()") // 使用@Before注解定义前置通知,并指定切点
public void before(JoinPoint joinPoint) {
String className = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
System.out.println(className + "的" + methodName + "方法开始执行啦!");
}
@AfterReturning(value = "pointcut()", returning = "result") //使用@AfterReturning注解定义返回通知,并指定切点及返回值
public void afterReturning(JoinPoint joinPoint, Object result) {
String className = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
System.out.println(className + "的" + methodName + "方法执行完毕啦,返回结果是:" + result);
}
@AfterThrowing(value = "pointcut()", throwing = "ex") //使用@AfterThrowing注解定义异常通知,并指定切点及异常类型
public void afterThrowing(JoinPoint joinPoint, Exception ex) {
String className = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
System.out.println(className + "的" + methodName + "方法抛出异常啦:" + ex.getMessage());
}
@After("pointcut()") //使用@After注解定义最终通知,并指定切点
public void after(JoinPoint joinPoint) {
String className = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
System.out.println(className + "的" + methodName + "方法执行完毕啦!");
}
@Around("pointcut()) //使用@Around注解定义环绕通知,并指定切点
public Object around(ProceedingJoinPoint proceedingJoinPoint) {
Object result = null;
String className = proceedingJoinPoint.getTarget().getClass().getName();
String methodName = proceedingJoinPoint.getSignature().getName();
try {
System.out.println(className + "的" + methodName + "方法开始执行啦!");
result = proceedingJoinPoint.proceed();
System.out.println(className + "的" + methodName + "方法执行完毕啦,返回结果是:" + result);
} catch (Throwable throwable) {
System.out.println(className + "的" + methodName + "方法抛出异常啦:" + throwable.getMessage());
throwable.printStackTrace();
}
return result;
}
}
```
上面这个例子其实就是一个日志的切面,首先使用@Aspect注解将切面标识成一个切面,然后使用@Pointcut注解配置切点,这个切点将切到com.example.service包下的所有方法。然后我们又定义了前置通知、返回通知、异常通知、最终通知和环绕通知这五种通知类型,并且都指定了切点。前四种通知在对应的方法中分别输出了开始执行、执行完毕、抛出异常和方法执行完毕这些日志信息,而环绕通知可以选择在调用目标方法前后输出日志,并且可以定义需要返回的结果。
好啦小伙伴们!现在你们学会了Spring框架中AOP的一些基础知识啦,在实际开发中,大家可以根据不同的需求来配置不同的切面,实现代码的模块化和复用,提高项目的开发效率。最后,别忘了呀,练习是最好的实践! www.0574web.net 宁波海美seo网络优化公司 是网页设计制作,网站优化,企业关键词排名,网络营销知识和开发爱好者的一站式目的地,提供丰富的信息、资源和工具来帮助用户创建令人惊叹的实用网站。 该平台致力于提供实用、相关和最新的内容,这使其成为初学者和经验丰富的专业人士的宝贵资源。
声明本文内容来自网络,若涉及侵权,请联系我们删除! 投稿需知:请以word形式发送至邮箱18067275213@163.com
心态好,什么都好!
站长的文章一般都从读者的心里来考虑知道读者需要什么样的东西顺便说一句,这是不是站长新书的一部分?期待啊
《北大西洋与欧若拉大陆华人隐私事件交换网》