在1,2节里面我们已经大致了解了AOP的工作原理,以及Spring下AOP的配置与实现,BeanNameAutoProxyCreator,DefaultAdvisorAutoProxyCreator已经部分简化了AOP配置,然而还是很繁琐:
首先要编写xxxAdvice类(需要自己实现MethodBeforeAdvice、MethodAfterAdvice、ThrowsAdvice、MethodInterceptor接口之一),然后还要在xml中配置Advisor,还要在Advisor中注入Advice,最后还要将Advisor加入ProxyFactoryBean、BeanNameAutoProxyCreator或者DefaultAdvisorAutoProxyCreator中。
而Spring2.x以后引入了@AspectJ注解,可以通过Java5的注解以AspectJ的语法在Spring中配置AOP了,使用@AspectJ后,这一切都将变得异常简单:
只需要定义一个Aspect类,在Aspect中声明Advice(可以同时声明多个),然后在xml中配置这个Aspect,最后添加一行<aop:aspectj-autoproxy/>就可以搞定。
这种方式更加灵活、简单。
下面是一个Demo:
//定义一个切面
@Aspect
public class LoggerAspect{
@Before("excution(* Service.login(username,..))")
public void logBefore(String username){
System.out.println("[Logger] User " + username + "try to login");
}
}
然后在Spring的xml文件中配置:
<!--定义切面-->
<bean id="loggerAspect" class="com.xxx.LoggerAspect"/>
<!--定义业务逻辑-->
<bean id="userService" .../>
<!--配置Aspect支持-->
<aop:aspectj-autoproxy/>
如果想添加更多的Advice,只需要在LoggerAspect类中声明一个类似logBefore的方法即可,而不是像之前的那样需要再重新编写一个Advice类。例如:
@AfterReturning("excution(* Service.login(username,..))")
public void logSuc(String username){
System.out.println("[Logger] User " + username + "login successfully");
}
1,2节里面还介绍过一个“环绕通知”,也就是在方法的前后异常时都进行了增强,AspectJ 的@Around注解同样可以实现:
@Aspect
public class SecurityAspect{
@Around("excution(* Service.login(username,..))")
public Object securityCheck(ProceedingJionPoint pjp) throws Throwable{
//调用之前进行用户检查
String username=(String)pjp.getArgs()[0];
if(!"zhangsan".equals(username)){
//对除zhangsan之外的用户开放
return pjp.proceed();
}
//抛出异常,禁止zhangsan登陆
throw new RuntimeException("Reject login!");
}
}
介绍完AspectJ的注解式AOP后,我们发现这样做还是有重复的代码:excution(* Service.login(username,..))
其实这就是一个Pointcut,我们可以在Logger类中声明一个方法为一个Pointcut,然后在后面的Advice中重用这个Pointcut:
@Aspect
public class LoggerAspect{
//声明切入点
@Pointcut("excution(* Service.login(username,..))")
public void login(){};
@Before(value="login()")
public void logBefore(String username){
System.out.println("[Logger] User " + username + "try to login");
}
@AfterReturing(value="login()")
public void logSuc(String username){
System.out.println("[Logger] User " + username + "login successfully");
}
@AfterThrowing(pointcut="login()",throwing="e")
public void logFailure(RuntimeException e){
System.out.println("[Logger] Exception:" + e.getMessage());
}
}
这里简单介绍一下AspectJ的Pointcut,在Spring中使用最多的是excution切入点,匹配方法的执行,完整的表达式如下:
excution([修饰符] 返回类型 [声明类型] 方法名称 (参数类型) [异常类型])
其中返回类型、方法名称、参数类型是必须的,其他为可选的。
最常用的匹配模式是“*”,用来表示任意的返回类型或匹配部分命名模式。
“()”匹配一个无参数的方法。
“(..)”匹配一个含有任意个参数的方法。
“(String,*)”匹配含有两个参数的方法,首个参数类型为String。
“(String,..)”匹配至少含有一个参数的方法,首个参数类型为String。
匹配任意的public方法:
excution(public * *(..))
匹配任何以set开头的方法:
excution(* set*(..))
匹配Service接口中的方法:
excution(* *Service.*(..))
匹配会抛出IO异常的方法:
excution(* *(..) throws java.io.IOException)
一般情况下,若需要使用Spring AOP,最好使用AspectJ注解方式,这样代码更简单,配置更少,易于维护。
分享到:
相关推荐
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...
Spring AOP,全称为Aspect Oriented Programming,是面向切面编程的一种编程范式,它是对传统的面向对象编程(OOP)的一种补充。在OOP中,核心是对象,而在AOP中,核心则是切面。切面是关注点的模块化,即程序中的...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过插入切面来增强或改变程序的行为。在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型...
现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...
Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...
3. **灵活的通知模型**:Spring AOP提供了多种类型的通知,包括around、before、after returning、after throwing等,使得开发者可以根据实际需求选择最适合的通知类型。 4. **丰富的切入点表达式语言**:Spring ...
3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...
**Spring AOP 实现机制详解** Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的...
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
3. **spring-aop-3.1.1.RELEASE.jar**:这是Spring框架的AOP模块,它包含了Spring对AOP的支持。Spring AOP基于动态代理实现,可以与Spring IoC容器无缝集成,使得我们可以在不修改原有代码的情况下添加切面。此版本...
3. spring-aspects-4.0.2.RELEASE.jar:这是Spring框架的一部分,包含了Spring AOP的相关实现和扩展,包括Spring的代理模型(proxy-based model)以及与AspectJ的集成。在这个版本中,Spring AOP支持基于注解的切面...
Spring AOP 和 Spring IOC 是 Spring 框架的两个核心组件,它们对于任何基于 Java 的企业级应用开发都至关重要。Spring AOP(面向切面编程)允许开发者在不修改源代码的情况下,通过“切面”来插入新的行为或增强已...
面向切面编程(AOP)是一种编程范式,旨在将横切关注点(如日志、安全等)与业务逻辑分离,从而提高模块化。...利用Java反射机制和Spring AOP框架,开发者可以方便地实现AOP,从而提升代码的模块化和可维护性。
在`springAop1`这个压缩包中,可能包含了一个简单的应用示例,展示了如何定义一个切面类,以及如何在该类中定义通知方法。例如,我们可能会看到一个名为`LoggingAspect`的类,其中包含了`@Before`注解的方法,用于在...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现横切关注点,如日志、事务管理、安全性等,从而解耦应用程序的核心业务逻辑。在Spring AOP中,关注点被模块化为独立的“切面”...
3. **注解驱动的AOP** - `@Aspect`:标记一个类为切面。 - `@Before`:前置通知,方法在目标方法之前执行。 - `@After`:后置通知,无论目标方法是否正常执行,都在其之后执行。 - `@AfterReturning`:返回后...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,用于实现横切关注点的模块化。它允许开发者定义“切面”,将那些与业务逻辑无关,却为多个对象共有的行为(如日志、...