我要在 com.test.service.*的所有方法上做一个前切入点(before),比如做前日志。
看了很多讲这个帖子和教程,被切入的方法,要么就是没有参数,要么就是一个(或固定几个)参数。
而实际中我的这些方法们,可能有不同个数参数,就是说有的方法是一个参数,有的方法是2个,有的3个。。。
我经过很多尝试都无法正确完成这个before切入,除非写成如下这样萎缩的样子:
public class BeforeLoggor{
public void afterReturning(Object retVal) throws Throwable {
BeanUtil.dataDecrease(retVal);
}
public void before0() throws Throwable {
int a=0;
}
public void before1(Object arg0) throws Throwable {
int b=0;
}
public void before2(Object arg0, Object arg1) throws Throwable {
int c=0;
}
public void before3(Object arg0, Object arg1, Object arg2) throws Throwable {
int d=0;
}
}
<bean id="beforeLoggor" class="com.test.BeforeLoggor"/>
<aop:config>
<aop:aspect ref="beforeLoggor">
<aop:before method="before" pointcut="execution(* com.test.service..*.*(..))"/>
<aop:before method="before1" pointcut="execution(* com.test.service..*.*(..)) and args(arg0)"/>
<aop:before method="before2" pointcut="execution(* com.test.service..*.*(..)) and args(arg0, arg1)"/>
<aop:before method="before3" pointcut="execution(* com.test.service..*.*(..)) and args(arg0, arg1, arg2)"/>
</aop:aspect>
</aop:config>
如果我的方法,最多可能有10个参数,就得继续写下去!如果,有事先想象不到的参数个数,那就惨了!
我预留出100个!??
曾经试过 (Object... args) (Object[] args) 均失败。
求教正统的写法!
(PS。不想要org.springframework.aop.framework.ProxyFactoryBean拦截的方式,因为我已经有一个拦截器了,再来一个太繁琐了)
另外,还有一个问题:
我之所以在另一个需求上用了拦截器,是要在方法开始之前做一个权限检查。
如果认证OK则继续执行被拦截的方法,如果NG则不让它进入方法,而是return
谁能告诉我一个AOP配置的方法,也能实现这样的需求呢?那样的话就不用在每一个Bean的配置中,事先指向拦截器,再target到实际Bean了。
换句话说,就是用<aop:before ... />的方式,能让他取得 MethodInvocation 类型的参数
相关推荐
在传统的Spring AOP配置中,我们通常会在`applicationContext.xml`或类似的配置文件中定义切面、通知(advice)、切入点(pointcut)等元素。以下是一个简单的示例: ```xml <beans xmlns=...
`aop:before`和`aop:after`分别指定了在匹配的切入点之前和之后执行的方法。 一旦应用启动并执行`UserService`的相关操作,`TimeHandler`的`printBefore`和`printAfter`方法就会自动调用,从而在控制台输出相应的...
使用`<aop:before>`、`<aop:after>`、`<aop:after-returning>`、`<aop:after-throwing>`和`<aop:around>`元素定义不同类型的的通知,例如: ```xml <aop:aspect id="loggingAspect" ref="loggingAspectBean"> <aop...
3. 切入点(Pointcut):切入点是对连接点的精确定位,定义了何时应用切面。它可以是一个表达式,用于匹配特定的连接点。 4. 通知(Advice):通知是在特定连接点上执行的代码,也就是切面的行为。Spring AOP支持五...
3. 在配置AOP时,确保Spring容器已经启用AOP支持,即`<aop:config>`标签的存在。 通过上述XML配置,我们可以灵活地控制Spring AOP的各个元素,实现面向切面的编程,提升代码的可读性和可维护性。了解并熟练掌握这些...
/beans>四、基于 XML 配置进行 AOP 开发:在 XML 文件中配置切面、通知、切入点等信息,例如:<aop:config><aop:aspect id="myInterceptor" ref="myInterceptorBean"><aop:before method="doAccessCheck" pointcut=...
XML配置Spring AOP是Spring框架中的一个重要组成部分,它允许我们通过XML配置来实现面向切面编程(Aspect-Oriented Programming, AOP)。AOP是一种编程范式,旨在将关注点分离,比如日志记录、事务管理等,这些都...
总的来说,理解并正确配置Spring AOP的依赖,以及熟练掌握切面、通知和切入点的概念,对于有效利用Spring进行面向切面编程至关重要。通过这些技术,开发者可以将关注点分离,提高代码的可维护性和可复用性。
<aop:pointcut expression="execution(* com.spring.service..*(..))" id="pointCut"/>声明一个切入点,注意execution表达式的写法 <aop:before method="before" pointcut-ref="pointCut"/> aop前置通知 <aop:after ...
<aop:before method="logBefore" pointcut-ref="serviceMethods"/> </aop:aspect> </aop:config> <!-- 定义切面类 --> <bean id="loggingService" class="com.example.aspect.LoggingService"/> </beans> `...
例如,`aspect`元素用于定义一个切面,它包含`pointcut`子元素来定义切入点表达式,这个表达式可以匹配方法执行、构造器调用等特定的程序执行点。此外,`advice`元素定义了在切入点匹配时执行的行为,如`before`、`...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许开发者将关注点从核心业务逻辑中分离出来,实现代码的模块化和重用。本文将深入探讨Spring AOP的XML版本,包括如何配置、相关术语以及如何实现不同的...
1. 在`spring-common.xml`配置文件中,我们需要引入AOP相关的命名空间,并声明一个`<aop:aspectj-autoproxy>`元素。这会告诉Spring容器,我们要启用基于注解的AOP,并代理所有带有切面注解的bean。配置如下: ```...
3. **前置通知**:`<aop:before>`元素定义了前置通知,`method`属性指定了通知方法,`pointcut`属性指定了切入点表达式,该表达式用于匹配`DukePerformer`类的`perform`方法。 4. **后置通知**:`<aop:after-...
接下来,定义了两个通知:`before`通知用于在方法调用前执行`checkValidity`方法,而`after-returning`通知则在方法正常返回后执行`addLog`方法。 ##### 4. 测试代码 ```java package com.spring.aop; import org...
在这个例子中,`execution(* com.example.service.*.*(..))`是切入点表达式,表示在`com.example.service`包下的所有类的所有方法执行前应用`logBefore`通知。 4. 配置扫描: 要使Spring识别带有`@Aspect`注解的...
`pointcut`元素定义了切入点表达式,这个表达式指定了哪些方法会在执行前后被我们的切面逻辑所拦截。 切入点表达式是AOP的核心,它使用一种称为Pointcut Design Pattern的语法。例如,`execution(* ...
1. **声明式AOP**:通过XML或注解来定义切面(Aspect)、切入点(Pointcut)和通知(Advice)。这种方式非常灵活,适合大多数场景。 - XML配置示例: ```xml <aop:config> <aop:aspect id="loggingAspect" ref=...
- `<aop:advisor>`:定义通知和切入点的关联,指定何时何地执行通知。 - `<aop:aspect>`:定义切面,包括其通知和切入点。 - `<aop:before>`、`<aop:after>`、`<aop:around>`等:分别用于定义不同类型的通知。 **5....
4. `<aop:before>`、`<aop:after>`、`<aop:around>`、`<aop:after-returning>`、`<aop:after-throwing>`:这些标签分别定义了在目标方法执行前、执行后(无论是否抛出异常)、环绕执行、正常返回后和抛出异常后执行...