是否可以使用Spring AOP或AeyJ拦截所有具有注释的Service方法(包含在com.app.service.*
包中的类中)
@Transactional(readOnly = false)
(其他元素在Spring的事务注释中也可能存在,但我们只关心只读=false)。
我只能找到与带有简单注释的切入点相关的示例,或者@Annotation(value)
。
如果可能的话,我倾向于使用直Spring。
它可能类似于下面的内容,但不确定语法。
“执行(*com.app.service…..*(..)”
不幸的是,没有简单的方法可以做到这一点。即使我们有一个基于注释的切入点,例如。
@Aspect
@Component
@EnableAspectJAutoProxy
public class WriteTransactionAspectBean {
@Before("@annotation(org.springframework.transaction.annotation.Transactional)")
public void test(org.springframework.transaction.annotation.Transactional t) {
System.out.println("TEST");
}
}
问题是注释不是我们自己的,它们来自外部JAR(Hibernate)。这将需要加载时编织或其他一些困难的解决方法。
Aspectj:从外部jar截取方法
但更糟糕的是,注释需要通过切入点“发现”。我们需要研究每种方法,并将此规范添加到每种事务中。无法自动将所有事务运行时保留在应用程序中。
您想使用这样的切入点:
execution(@org.springframework.transaction.annotation.Transactional(readOnly = false) * com.app.service..*.*(..))
对于用@X注释的类中的方法或用@X注释的方法,我需要一个切入点。我还需要注释对象。如果类和方法都被注释,我更喜欢将方法注释作为参数。 我尝试了以下操作,这会产生“绑定不一致”的警告。(为什么不直接将其设置为null?) 以下内容创建了“穿过切入点中的“||”的参数x的不明确绑定”警告。(在我看来,这不一定有意义:为什么不绑定第一个短路评估?) 如果存在类和方法注释,则将前面的尝试拆分为两个,自然会
试图收集和理解@事务性注释的要点并越过了一点。因此,在使用事务性注释时,我们需要记住的主要事情是: 事务注释只能应用于公共方法[根据Spring@Transactional属性对私有方法起作用吗? 事务性注释应该应用于具体的类,而不是接口[根据我应该将@transactional annotation放在接口定义还是实现类的位置? 事务注释应应用于服务级别[根据Spring@Transaction
问题内容: 我需要 在类中使用@X注释的方法或使用@X注释的方法的切入点 。我还 需要注释对象 。如果同时注释了类和方法,则 我更喜欢将方法注释作为参数 。 我尝试了以下操作,这将创建“不一致的绑定”警告。(为什么不将它们设置为null?) 下面创建“跨’||’的参数x的模糊绑定 在切入点”警告。(我认为这并不一定有意义:为什么不绑定第一个短路评估?) 如果存在类和方法注释,则将先前的尝试自然地分
服务实现 但是,如果我将注释移动到公共接口方法实现,我的方面就会被触发。我应该如何定义我的切入点或配置我的方面来使我的原始用例工作?
问题内容: 我想用指定的注释(例如@Monitor)监视所有类的所有公共方法(注意:注释在类级别)。可能的切入点是什么?注意:我正在使用@AspectJ样式的Spring AOP。 问题答案: 你应该将类型切入点与方法切入点结合使用。 这些切入点将在标记为@Monitor的类中查找所有公共方法: 为结合了前两者的最后一个切入点提供建议,你就完成了!
问题内容: 如何编写适用于方法执行的AspectJ切入点,该方法执行会使用注释覆盖接口方法?例如: 仅当带有注释本身时,切入点才匹配。还有另一种方法吗? 问题答案: 正如Nicholas指出的那样,这在AspectJ中是不可能的。这是无法实现的更多证据(摘自http://www.eclipse.org/aspectj/doc/released/adk15notebook/annotations-