JMB*_*JMB 14 java spring annotations transactions java-8
Spring文档建议不要在接口方法上放置@Transactional注释,因为接口注释不是由类继承的.但是,使用Java 8,我们可以在界面中提供具体的默认实现.如果这样的默认接口方法需要是事务边界,我们别无选择:我们必须在接口方法上放置@Transactional注释.
这会起作用(即在这种情况下春天是否会尊重交易边界)?如果是这样,这种方法有任何隐藏的陷阱吗?
Sot*_*lis 14
Spring使用(以及其他)a BeanFactoryTransactionAttributeSourceAdvisor作为Advisor为注释或包含注释方法的类生成代理bean @Transactional.
当需要代理它时,它使用bean的类类型(使用CGLIB)来生成代理.因此,我们希望看看default注释的方法@Transactional是否可以从实现类的角度来看.
这是一个Java 8 SSCCE
public static void main(String[] args) throws Exception{
Class<?> randomImplClass = RandomImpl.class;
System.out.println(randomImplClass);
Easy annotation = randomImplClass.getAnnotation(Easy.class);
System.out.println("Class: " + randomImplClass);
System.out.println("Class Annotation: " + annotation);
Method method = randomImplClass.getMethod("doRandom");
annotation = method.getAnnotation(Easy.class);
System.out.println("Method: " + method);
System.out.println("Method Annotation: " + annotation);
}
public static class RandomImpl implements Random{}
@Easy
interface Random {
@Easy
default void doRandom() {System.out.println("testing");};
}
@Target(value = {METHOD, TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Easy {}
Run Code Online (Sandbox Code Playgroud)
打印
class TestEnhancer$RandomImpl
Class: class TestEnhancer$RandomImpl
Class Annotation: null
Method: public default void TestEnhancer$Random.doRandom()
Method Annotation: @TestEnhancer$Easy()
Run Code Online (Sandbox Code Playgroud)
指示为接口的方法继承了注释.因此,@Transactional当类没有覆盖default方法时,Spring似乎能够添加行为.如果它已覆盖它,则不会继承注释.
| 归档时间: |
|
| 查看次数: |
2631 次 |
| 最近记录: |