加载时间编织不在我的项目中的类

时间:2013-04-10 00:23:40

标签: spring aop aspectj spring-aop load-time-weaving

我正在尝试使用Spring为我创建的项目中的几个类提供加载时间编织。当我打电话给不属于我本地项目的班级时,我无法让它工作。

我创建了一个名为ExampleClass的类,当我对其中的方法执行@Around时,我可以看到我对返回的修改,但是当我尝试对{ {1}}我无法获得任何结果。

这是我的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

我错过了什么,或者这是Spring和AspectJ的限制吗?

2 个答案:

答案 0 :(得分:3)

默认的aspectj不会编织任何java标准类。据我记忆,这是防止安全漏洞的限制。它在aspectj文档中描述。可能有一个属性允许改变这种行为,但你应该非常确定在开始这样做之前你需要这个。

只需用自己的一个类创建另一个jar并尝试编织这个。这应该是开箱即用的。

答案 1 :(得分:2)

马丁弗雷是对的。有很多方法可以编织JDK类(我已经完成了它),但它有点棘手而且不适合新手 - 而且大部分都没有必要。您可以选择拦截调用,而不是执行外部方法。这样你就不需要编织它们了。干净又方便。只需使用call()代替execution()作为外部类。