4

我在定义我的方面时遇到了一些问题。我有一堆实体,我想在其中分析 get 方法,所以我编写了以下切入点和方法

@Pointcut("execution(* tld.myproject.data.entities.*.get*()")
public void getEntityProperty() {}

@Around("getEntityProperty()")
public Object profileGetEntityProperty(ProceedingJoinPoint pjp) throws Throwable {
    long start = System.currentTimeMillis();
    String name = pjp.getSignature().getName();
    Object output = pjp.proceed();
    long elapsedTime = System.currentTimeMillis() - start;
    if(elapsedTime > 100)
        System.err.println("profileGetEntityProperty: Entity method " + name + " execution time: " + elapsedTime + " ms.");
    return output;
}

我已经在我的配置中打开了编织,并且将方面编织到业务层中工作得很好。我的切入点写对了吗?或者是否有一些关于实体的东西使它们不可编织?(我的实体在类定义之前以 @Entity 为前缀)

干杯

尼克

4

3 回答 3

6

实际上,您只是一个括号!

@Pointcut("执行(* tld.myproject.data.entities..get ( ) ) ")


如果您使用的是 Eclipse,我会推荐使用 AspectJ 编译时编织进行开发。这是最简单的方法。

使用 AJDT 插件,您将获得很多帮助!我刚刚粘贴了您的切入点并得到了编译错误。添加了一个括号,它起作用了!

AJDT 插件的视觉支持截图:

替代文字

getHello() 方法左侧的橙色箭头表示它是由环绕通知建议的。有关更大的示例,请参见此处

于 2010-05-26T09:17:18.930 回答
2

就在这里。实体是由您使用new运算符创建的,因此它们不是弹簧上下文的一部分。

如果你想使用这个,你需要启用编织(我更喜欢加载时通过<context:load-time-weaver/>),并用@Configurable.

个人不喜欢这种做法。唉,没有任何替代品如此通用。如果您的持久性提供程序是 Hibernate,您可以创建实体的自定义代理 -请参见此处,但这更加尴尬。

于 2010-05-26T07:27:34.560 回答
0

请注意,@Configurable 适用于编译时编织。通过 @Configurable 自动装配实体的缺点是,当通过 Hibernate 从数据库中检索所述实体时,它们“似乎”不起作用。通过“新”调用,是的。但就在最近,鉴于来自实体的一个非常奇怪的持久化请求,使用“新”的单元测试运行良好,但休眠(或 ehcache)加载的实体导致自动装配属性的 NPE。夜深了;所以你可能希望自己做一些测试。:) 只是传递我最近的经验。希望能帮助到你。

于 2010-06-18T20:26:10.560 回答