2010-06-23 37 views
7

Có bất kỳ tùy chọn cấu hình nào dựa trên chú thích @Transactional trong Spring không?Thay thế cấu hình cho Spring @Transactional

Tôi muốn giữ các lớp java của mình miễn phí từ Spring càng tốt, ví dụ như được tách rời càng tốt khỏi mọi khung công tác.

Trả lời

8

Có, sử dụng aop:configtx:advice. Ví dụ:

<aop:config> 
    <aop:pointcut id="serviceMethods" 
     expression="execution(* com.package.service..*.*(..))" /> 

    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" /> 
</aop:config> 

<tx:advice id="txAdvice" transaction-manager="transactionManager"> 
    <tx:attributes> 
     <tx:method name="*" propagation="REQUIRED" /> 
    </tx:attributes> 
</tx:advice> 
+1

yup, bạn có thể thấy các khả năng khác nhau tại đây: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-declarative –

3

Chú thích là lựa chọn tốt nhất để đánh dấu phương thức nên được thực thi trong giao dịch. Điều này được đề xuất cho cả Spring và EJB 3.

Phương pháp XML đòi hỏi cấu hình nhiều hơn, không thân thiện với cấu trúc và bạn phải xem trong cấu hình nếu một phương thức nhất định sẽ được thực thi trong giao dịch hay không.

Vì hỗ trợ giao dịch dựa trên chú thích là sự lựa chọn ưa thích của hầu hết các nhà phát triển và bạn không thích sử dụng chú thích @Transactional của Spring, tôi sẽ khuyên bạn sử dụng chú thích tùy chỉnh.

Sau đó, bạn có hai lựa chọn:

  • Hãy chú thích tùy chỉnh của bạn mở rộng Spring @Transactional và sử dụng các yếu tố <tx:annotation-driven /> trong cấu hình Spring của bạn. Điều này rất dễ dàng và chỉ cần cập nhật một chú thích để xóa phụ thuộc Spring.
  • Tạo trình chặn chặn thực thi logic trước và sau phương thức được chú thích. Với Spring là vùng chứa, bạn nên ủy quyền xử lý giao dịch từ trình chặn của trước và sau khi thông báo cho triển khai PlatformTransactionManager ưa thích của bạn.

Tôi đã viết về cách bạn có thể tạo trình chặn chặn thêm logic trước và sau khi phương thức được đánh dấu bằng chú thích here. Và đã chứng minh phương pháp nào bạn phải sử dụng trên PlatformTransactionManager here.

Tôi hy vọng điều này sẽ hữu ích!

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