我用简单的Pointcut和Advise方法写了简单的Aspect:
@Aspect
public class MyAspect {
@Pointcut("execution(static * com.mtag.util.SomeUtil.someMethod(..))")
public void someMethodInvoke() { }
@AfterReturning(value = "someMethodInvoke())", returning = "comparisonResult")
public void decrementProductCount(List<String> comparisonResult) {
//some actions
}
}
我遵循基于Spring注释的应用程序配置:
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
//...
}
com.mtag.util包中的实用程序类:
public class SomeUtil {
static List<String> someMethod(List<String> oldList, List<String> newList) {
//...
}
}
但是当我打电话时
SomeUtil.someMethod(arg1, arg2);
在单元测试中,我可以看到方法调用没有被截获,我的@AfterReturning建议不起作用。
但如果我将someMethod()类型更改为实例(非静态)方法,则切入点
@Pointcut("execution(* com.mtag.util.SomeUtil.someMethod(..))")
并通过添加@Component注释来管理SomeUtil bean并调用目标metod,如下所示:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {AppConfig.class}, loader = AnnotationConfigContextLoader.class)
public class SomeUtilTest {
@Autowired
private SomeUtil someUtil;
@Test
public void categoriesDiffCalc() {
List<String> result = someUtil.someMethod(...);
}
}
一切都好。
我可以用什么方式为静态方法设置建议?
答案 0 :(得分:8)
实际上,在Spring框架中没有使用自动代理拦截静态方法的解决方案。 您应该使用LWT AspectJ解决方案。
简而言之,您应该使用相同的注释,但需要一些额外的配置。
1)在下一行添加到spring上下文文件:
<context:load-time-weaver/>
(可能在您的情况下没有必要)
2)遗憾的是你还应该添加META-INF / aop.xml。示例:
<weaver>
<include within="com.example.ClassA"/> <!-- path to concrete class -->
<include within="com.log.* "/> <!—- path to aspects package -->
</weaver>
<aspects>
<aspect name="com.log.AspectA"/>
</aspects>
3)在启动JVM时参数
-javaagent:${PATH_TO_LIB }/aspectjweaver.jar
应该添加。
所以这个解决方案相当费力。
有关详细信息,请参阅此处的{8}章节http://docs.spring.io/spring/docs/3.0.0.RC2/reference/html/ch07s08.html