2010-08-31 39 views
6

Tôi phải sử dụng 3 người quản lý giao dịch khác nhau trong ứng dụng web của mình. Vì vậy, tôi đã viết chú thích của riêng tôi theo Spring reference (Mục 10.5.6.3 Chú thích phím tắt tùy chỉnh).Cách mở rộng chú thích mùa xuân @Transactional

Một chú thích (cho việc sử dụng một transactionmanager cụ thể) trông như thế này:

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

import org.springframework.transaction.annotation.Transactional; 

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Transactional("customer") 
public @interface CustomerTX{ 


} 

Tất cả mọi thứ đang làm việc tốt khi chú thích lớp dịch vụ của tôi với @CustomerTX chú thích tùy chỉnh. Nhưng tôi phải cung cấp nhiều tùy chọn hơn cho chú thích của tôi, như readonly = true, rollbackFor = v.v. Vì bạn không thể "mở rộng" một chú thích (tôi thực sự chỉ cần mở rộng chú thích @Transactional từ Spring), việc triển khai chính xác cho điều này là gì?

Trả lời

3

Bạn sẽ phải tạo một số chú thích tùy chỉnh, tôi sợ, một cho mọi trường hợp sử dụng, chú thích từng chú thích với chú thích chính xác @Transactional mà bạn cần.

Hoặc bạn sẽ phải viết khía cạnh của riêng bạn trong AspectJ (mở rộng org.springframework.transaction.aspectj.AbstractTransactionAspect từ spring-aspect.jar) để tạo logic giao dịch của riêng bạn.

+0

Bạn có thực sự có nghĩa là tôi phải viết một cái gì đó như thế này (giả sử tôi chỉ muốn đã thiết lập các giao dịch để chỉ đọc): @Target ({ElementType.METHOD, ElementType.TYPE}) @Retention (RetentionPolicy.RUNTIME) @Transactional (value = "khách hàng", readOnly = true) @ interface nào CustomerTXReadonly { } Điều này có thể không phải là giải pháp làm việc chỉ ... –

+0

tôi sợ như vậy, bởi vì các giới hạn của chú thích. Như tôi đã nói: hoặc là điều đó hoặc viết các khía cạnh của riêng bạn (mà tôi thích) –

+0

Cảm ơn sự giúp đỡ của bạn. Tôi sẽ cố gắng viết các khía cạnh của riêng mình. Thật đáng tiếc là các chú thích không thể mở rộng được: ( –

0

Vào mùa xuân 4 bạn có thể làm điều đó. Như đã nêu trong các số documentation

Cũng có thể kết hợp chú thích meta để tạo chú thích đã soạn. Ví dụ, chú thích @RestController từ Spring MVC bao gồm @Controller và @ResponseBody.

Ngoài ra, chú thích được sáng tác có thể tùy chọn redeclare thuộc tính từ meta-chú thích để cho phép tùy chỉnh người dùng. Điều này có thể đặc biệt hữu ích khi bạn chỉ muốn trưng ra một tập con của các thuộc tính của chú thích meta. Ví dụ: chú thích @SessionScope của Spring mã hóa tên phạm vi thành phiên nhưng vẫn cho phép tùy chỉnh proxyMode.

@Target({ElementType.TYPE, ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Scope(WebApplicationContext.SCOPE_SESSION) 
public @interface SessionScope { 

    /** 
    * Alias for {@link Scope#proxyMode}. 
    * <p>Defaults to {@link ScopedProxyMode#TARGET_CLASS}. 
    */ 
    @AliasFor(annotation = Scope.class) 
    ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS; 

} 
Các vấn đề liên quan