1

我正在尝试使用 Spring 为我创建的项目中的几个类提供加载时间编织。当我调用一个不在本地项目中的类时,我无法让它工作。

我创建了一个名为的类ExampleClass,当我在其中执行@Around一个方法时,我可以看到我对返回所做的修改,但是当我尝试对返回做同样的事情时,String我无法得到任何结果。

这是我的Aspect代码:

@Pointcut("call(* java.lang.String.*(..))")
public void cutString() {}

@Before("cutString()")
public void aroundString() throws Throwable {
    System.out.println("I Never See This");
}

这是我对该代码的调用:

public class Main {
    public static void main(String[] args) {
        new ClassPathXmlApplicationContext("classpath:my-context.xml");

        String string = new String("I Only See This");
        System.out.println(string.toLowerCase());
    }
}

的内容my-context.xml只是一个<context:load-time-weaver />.

我有一个aop.xml定义,正如我所说的适用于一个类,但不适用于另一个类:

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver>
        <include within="com.example.*" />
        <include within="java.lang.String" />
    </weaver>

    <aspects>
        <aspect name="com.example.PerformMonitor" />
    </aspects>
</aspectj>

我是否遗漏了什么,或者这是 Spring 和 AspectJ 的限制?

4

2 回答 2

3

默认情况下,aspectj 不会编织任何 java 标准类。据我所知,这是防止安全泄漏的限制。它在 aspectj 文档中进行了描述。可能有一个属性允许更改此行为,但您应该非常确定在开始执行此操作之前需要它。

只需用您自己的一类创建另一个罐子,然后尝试编织这个。这应该开箱即用。

于 2013-04-10T05:18:10.857 回答
2

马丁弗雷是对的。有很多方法可以编织 JDK 类(我已经做到了),但这有点棘手,而且不适合新手——而且大多没有必要。您的替代方法是拦截对外部方法的调用,而不是执行外部方法。这样你就不需要编织它们了。干净又容易。只需call()用于execution()您的外部类。

于 2013-04-10T09:38:51.767 回答