Sử dụng mùa xuân (trong số những người khác) là BeanFactoryTransactionAttributeSourceAdvisor
là một Advisor
khi tạo bean proxy cho các lớp được chú thích hoặc chứa phương pháp được chú thích với @Transactional
.
Khi thời gian đến proxy, nó sử dụng loại lớp của bean (với CGLIB) để tạo proxy. Vì vậy, chúng tôi muốn xem phương thức default
được chú thích với @Transactional
sẽ hiển thị từ quan điểm của lớp triển khai hay không.
Dưới đây là một 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 {}
mà in
class TestEnhancer$RandomImpl
Class: class TestEnhancer$RandomImpl
Class Annotation: null
Method: public default void TestEnhancer$Random.doRandom()
Method Annotation: @TestEnhancer$Easy()
chỉ ra rằng chú thích được thừa hưởng cho phương pháp của giao diện. Có vẻ như, do đó, Spring sẽ có thể thêm hành vi @Transactional
khi lớp học không ghi đè phương thức default
. Nếu nó đã overriden nó, sau đó chú thích không được thừa hưởng.
Nguồn
2013-12-09 01:33:26
Nếu bạn cần cài đặt mặc định phương thức, tại sao không tạo lớp trừu tượng thay vì giao diện? Các tài liệu API Java 8 dẫn tôi tin rằng các phương thức mặc định của giao diện chủ yếu nhằm cho phép bổ sung các phương thức mới vào một giao diện mà không phá vỡ các triển khai cũ hơn của giao diện đó. – VGR
Các phương thức mặc định của giao diện cho phép bạn tạo [mixins] (https://en.wikipedia.org/wiki/Mixin), đây là một cấu trúc lập trình mạnh hơn nhiều so với các giao diện java truyền thống. Cho dù có một lý do hợp lệ để sử dụng mixin trong giao diện Dịch vụ với Giao dịch là một vấn đề khác, nhưng nó không phải là không thể tưởng tượng được. Sử dụng các lớp trừu tượng cũng sẽ làm việc, nhưng ràng buộc bạn với một hệ thống phân cấp đối tượng tuyến tính. Mixins linh hoạt hơn nhiều. – JMB