Spring超详细讲解AOP面向切面
什么是 AOP?
AOP(Aspect-Oriented Programming)面向切面编程,主要解决了OOP(Object-Oriented Programming)面向对象编程中的一些交叉问题。AOP使程序员能够将类似的功能从不同的对象中抽象出来,然后统一在一个位置进行管理和维护。AOP 所提供的机制被称为 "横切关注点"(Cross-cutting Concerns)。
AOP中的重要概念
-
切面(Aspect):横切关注点的模块化,第一个步骤是定义一个切面来包含那些横切关注点。
-
通知(Advice):定义了切面是在什么时候、何地被执行的方法;将于切点相应的通知类型属于以下几种:前置通知、后置通知、异常通知、环绕通知和最终通知。
-
切点(Pointcut):其定义相当于切面接口的实现,即确定在哪里对应用程序进行拦截;类中有哪些方法会作为连接点,连接点在Aspect中会被标记,并应用通知。
-
连接点(Joinpoint):程序执行过程中明确的点。
-
织入(Weaving):织入是把增强(即通知)应用到目标对象并创建新的代理对象的过程。
Spring 中的 AOP
Spring AOP 提供了所有基于代理的 AOP 框架中最丰富的功能。在Spring中,AOP可以通过编程方式或者申明式设置。
编程方式
通常情况下,切面通过编写一个普通的Java类并在类中使用注解来完成定义。然后通过创建一个拦截类注册到IoC容器中来激活这个注解。其中,定义实现MethodInterceptor
接口,然后注册到IoC容器中。
下面我们来举一个使用注解来配置 AOP 的简单示例。假设我们要定义一个日志切面,在所有方法调用前和调用后记录方法名、参数、返回值和执行时间。
@Aspect
public class LogAspect {
private Logger log = LoggerFactory.getLogger(LogAspect.class);
@Around("execution(* com.example.service.impl.*.*(..))")
public Object log(ProceedingJoinPoint point) throws Throwable {
String methodName = point.getSignature().getName();
Object[] args = point.getArgs();
Object target = point.getTarget();
log.info("调用" + target.getClass().getSimpleName() + "的" + methodName + "方法,参数为" + Arrays.toString(args));
long startTime = System.currentTimeMillis();
Object result = point.proceed();
long endTime = System.currentTimeMillis();
log.info("调用" + target.getClass().getSimpleName() + "的" + methodName + "方法,返回值为" + result + ""+ ",耗时:" + (endTime - startTime) + "ms");
return result;
}
}
上面的代码中,我们使用了 @Aspect
注解来定义一个切面,指定了 @Around
注解来表示这是一个环绕通知,切点表达式使用 execution(* com.example.service.impl.*.*(..))
来指定切点为 com.example.service.impl
包下所有方法。
申明式设置
申明式是使用 XML 文件进行配置。下面是一个使用申明式定义 AOP 的简单示例,与前面的注解示例实现同样的功能。
<bean id="logAspect" class="com.example.aop.LogAspect"/>
<aop:config>
<aop:aspect ref="logAspect">
<aop:pointcut id="service" expression="execution(* com.example.service.impl.*.*(..))"/>
<aop:around method="log" pointcut-ref="service"/>
</aop:aspect>
</aop:config>
上面的代码中,我们创建了一个名为 logAspect
的切面,定义了一个切点 service
,使用 execution(* com.example.service.impl.*.*(..))
来指定切点为 com.example.service.impl
包下所有方法。最后通过 around
元素将 log
方法和 service
切点关联起来。
总结
AOP 的使用可以在一定程度上增强了设计的灵活性、封装性和代码的重用性和可维护性。Spring框架通过定义一个切面,将业务逻辑和系统服务分离,极大地提高了代码的可维护性。
两个示例已经涉及了面向切面的方法,通过编程方式和声明式两种方式来实现,以此方便开发者使用。
还有其余内容需要补充,欢迎读者根据实际需求查看相关文档资料。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring超详细讲解AOP面向切面 - Python技术站