如何通过AOP拦截那些导入的外部包的功能

时间:2014-08-12 12:48:31

标签: spring java-ee aop

例如,现在我想拦截AOP的java.lang.String方法split()。

有可能吗?

我尝试了一些常规方法,但它没有用。

@Aspect
public class TestAspect {

    @Before ("execution (* java.lang.String.split(..))")
    public void logBeforeString(JoinPoint joinPoint) {  
        System.out.println("SPLIT BEGIN");  
    }

}

以下是配置文件:

<!-- Aspect -->
<aop:aspectj-autoproxy />
<beans:bean id="TestAspect" class="com.dong.partner.aspect.TestAspect" />

在我自己的项目中使用其他切入点,它们可以顺利运行。

所以任何人都知道如何拦截导入的外部包?

1 个答案:

答案 0 :(得分:0)

不,使用execution可以建议java.lang中没有任何内容。请参阅this question for a more detailed explanation

  

所以任何人都知道如何拦截导入的外部包?

您正在使用<aop:aspectj-autoproxy />,这意味着Spring正在使用基于代理的AOP。从本质上讲,如果使用AOP建议bean,Spring会在每个bean周围创建一个包装器。当调用其中一个bean的方法时,它首先命中代理/包装器。代理决定它是应该直接调用你的bean还是应该调用一个或多个方面。

您可以使用基于代理的AOP limits to the type of advice。要拦截从代码到非bean类的调用,您需要切换到编译时或加载使用aspectj编织的时间并使用call pointcuts而不是execution切入点。 aspectj编译器将重新调整您的字节码,以便重写从代码到java.lang.String的任何调用以调用call切入点。

有趣的是,this question遇到了您遇到的相反问题。