Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实体方面(春季)_Java_Spring_Aop_Aspectj - Fatal编程技术网

Java 实体方面(春季)

Java 实体方面(春季),java,spring,aop,aspectj,Java,Spring,Aop,Aspectj,我在定义我的方面时有点问题。我有很多实体,我想在其中分析get方法,所以我编写了以下切入点和方法 @Pointcut("execution(* tld.myproject.data.entities.*.get*()") public void getEntityProperty() {} @Around("getEntityProperty()") public Object profileGetEntityProperty(ProceedingJoinPoint pjp) throws T

我在定义我的方面时有点问题。我有很多实体,我想在其中分析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作为前缀)

干杯


尼克:是的,有。实体是由您使用
new
操作符创建的,因此它们不是spring上下文的一部分

如果您想使用它,您需要启用编织(我更喜欢通过
加载时间),并使用
@Configurable
注释实体类


一、 我个人不喜欢这种做法。唉,没有任何替代品如此通用。如果您的持久性提供程序是Hibernate,您可以为您的实体创建一个自定义代理,但这更麻烦。

实际上,您只需要一个括号

@切入点(“执行(*tld.myproject.data.entities..get()


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

有了AJDT插件,你会得到很多帮助!我刚刚粘贴了你的切入点,得到了一个编译错误。添加了一个括号,效果很好

AJDT插件的可视支持屏幕截图:


getHello()方法左侧的橙色箭头表示它是由一个around通知通知的。请参阅一个更大的示例。

请注意,@Configurable可用于编译时编织。通过@Configurable自动连接实体的缺点是,当通过Hibernate从数据库检索所述实体时,它们“似乎”不起作用。通过“新”调用,是的。但就在最近,由于一个非常奇怪的实体持久化请求,使用“new”的单元测试工作得非常好,然而hibernate(或ehcache)加载的实体导致autowired属性的NPE。那是深夜;所以你可能希望自己做一些测试。:)只是介绍一下我最近的经验。希望能有所帮助。

谢谢您的提示,我在您的提示之后阅读了第7.8.1节,并且@Configurable看起来很棒。你不喜欢这种做法的原因是什么?这更多的是个人偏好,但发生的是“幕后黑魔法”,我觉得不太好。虽然我不能说有足够的缺点;)好的,我已经在我的实体中添加了
@Configurable(preConstruction=true)
,并在我的配置中设置了
,但仍然没有编织方面。关于我错过了什么有什么建议吗?另外,我的实体是通过Hibernate通过
DAO.getSession().createCriteria(MyEntity.class).list()创建的。
你说得对。我个人对加载时和编译时编织的偏好再次影响了答案:)好的捕获(+1)。你知道AJDT插件可以在编译时验证这些表达式吗?嗨,Espen,我来试试AJDT插件。这对Spring有效吗?我的印象是春天自己编织?@Bozho:谢谢!我从AJDT插件中得到的错误消息是:
令牌“execution(*entity..get()“,”)上的语法错误应为
@niklasaers:AJDT插件与Spring配合得非常好!最简单的选择是下载捆绑了AJDT插件的软件。有了这个插件包,您也可以获得SpringAOP的相同工具帮助。这样我就可以混合和匹配编译时编织和加载时编织了?哇,我不知道。这是编译时编织的一个明显例子,因此我将对此进行一次尝试。:-)感谢您的博客帖子链接,我将按照您的食谱(并了解AJDT插件):-)