代码之家  ›  专栏  ›  技术社区  ›  Nicholas

在我的项目之外的类上加载时间编织

  •  1
  • Nicholas  · 技术社区  · 12 年前

    我正在尝试使用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的限制?

    2 回复  |  直到 12 年前
        1
  •  3
  •   Martin Frey    12 年前

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

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

        2
  •  2
  •   kriegaex    12 年前

    马丁·弗雷是对的。有一些方法可以编织JDK类(我已经做过了),但这有点棘手,不适合新手——而且大多数情况下都没有必要。您的替代方案是拦截对的调用,而不是外部方法的执行。这样你就不需要编织它们了。干净简单。只需使用 call() 相反 execution() 用于您的外部类。