Tôi khuyên bạn nên đọc this blog entry (snapshot on archive.org) cho đến khi tác giả nhớ (các) anh ấy có quyền truy cập vào tính năng quét thành phần của Spring.
Vấn đề ban đầu là quét đường dẫn lớp để tìm các lớp học bằng chú thích tùy chỉnh. Một khi điều này được thực hiện, bạn có các đối tượng trong ứng dụng độc lập của bạn thông qua đó sử dụng object.getClass().getAnnotations()
, sau đó bạn có thể tiêm người nghe hoặc hành vi tùy chỉnh mà bạn cần thêm vào đối tượng đang giữ chú thích tùy chỉnh.
Hãy nói rằng bạn có chú thích tùy chỉnh sau:
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyMessageDriven {}
Và bạn sử dụng nó một số lớp trong bạn ứng dụng:
@MyMessageDriven
public class MyObject {}
Bây giờ, ở vị trí thích hợp trong ứng dụng của bạn, bạn nên có một phương pháp để đưa ra tất cả các lớp mang MyMessageDriven
:
Set<Class<?>> findAllMessageDrivenClasses() {
final StopWatch sw = new StopWatch();
sw.start();
final Reflections reflections = new Reflections("org.projectx", new TypeAnnotationsScanner());
Set<Class<?>> allMessageDrivens = reflections.getTypesAnnotatedWith(MyMessageDriven.class); // NOTE HERE
sw.stop();
return allMessageDrivens;
}
Có điều này, tôi giả định rằng có một điểm trong ứng dụng của bạn là (1) bạn có quyền truy cập vào các đối tượng trong ứng dụng của bạn, hoặc (2) có mô hình khách truy cập hoặc trình lặp trên tất cả các đối tượng trong ứng dụng. Vì vậy, trong một lúc nào đó, tôi cho rằng chúng tôi có tất cả các đối tượng mục tiêu như objects
:
Set<Class<?>> msgDrivenClasses = findAllMessageDrivenClasses();
for (Object o : objects) {
if (msgDrivenClasses.contains(o.getClass()) {
invokeTheMessageListener(o);
}
}
Mặt khác, cần có một số thực hiện MyMessageListener
có sẵn khi các đối tượng có MyMessageDriven
được tìm thấy:
void invokeTheMessageListener(Object o) {
theMessageListener.onMessage(o);
}
Câu trả lời này được điều chỉnh từ mục nhập blog, vì vậy vui lòng tham khảo blog để biết cấu hình thư viện. Và, cuối cùng nhưng không kém phần quan trọng, đây là một mã mẫu cho vấn đề và nó có thể được cấu trúc lại thành kiểu tương thích và thanh lịch hơn.
Cập nhật: Có yêu cầu đối tượng được nhắm mục tiêu cần lưu ý đến người nghe của riêng họ. Vì vậy, tôi đề nghị cách tiếp cận sau đây.Chúng ta hãy có một giao diện MyMessageListenerAware
:
interface MyMessageListenerAware {
MyMessageListener getMyMessageListener();
}
// and this is the original MyMessageListener
interface MyMessageListener {
void onMessage(Object o);
}
Bây giờ, các đối tượng mục tiêu cần thực hiện các giao diện trên:
class MySampleObject implements MyMessageListenerAware {
public MyMesssageListener getMyMessageLisener() {
return mySampleObjectImplementationOfMyMessageListener;
}
}
Có điều này, phương pháp invokeTheMessageListener
trở thành như:
void invokeMessageListener(Object o) {
if (o instance MyMessageListenerAware) {
MyMessageListener l = ((MyMessageListenerAware) o).getMyMessageListener();
l.onMessage(o);
}
}
Mặc dù , Tôi khuyên bạn nên đọc về mô hình Visitor hoặc Strategy. Những gì bạn muốn làm dường như với tôi như bạn cần một số đối tượng phản ứng/hành động/quy trình cho một đối tượng/sự kiện phổ biến trong ứng dụng nhưng mỗi với giải thích/thuật toán/triển khai của riêng họ.
Bạn đang sử dụng khung công việc hoặc khung kinh doanh nào? – nobeh
Đây là ứng dụng java độc lập. – rayman