Cách mà ezyfox quản lý các bean
Dạ em chào anh, em có pull source code ezyfox server và chạy thử example hello word của anh.<p>
Em có đọc qua source code nhưng vẫn chưa hiểu hết, và có một số thắc mắc, có gì nhờ anh giúp đỡ ạ:
</p>
<p>
Em thấy trong source example của anh có ví dụ sau:
</p>
<div class="markdown-block position-relative overflow-auto source-java">
<pre>
<span class="pl-s">@Setter</span>
<span class="pl-s">@EzyPrototype</span>
<span class="pl-s">@EzyObjectBinding</span>(write = false)
<span class="pl-s">@EzyRequestListener</span>(GREET)
<span class="pl-k">public</span> <span class="pl-k">class</span> GreetRequestHandler
<span class="pl-k">extends</span> ClientRequestHandler
<span class="pl-k">implements</span> EzyDataBinding {
private String who;
<span class="pl-s">@EzyAutoBind</span>
private Greeting greeting;
<span class="pl-s">@Override</span>
<span class="pl-k">protected</span> <span class="pl-k">void</span> execute() throws EzyBadRequestException {
responseFactory.newObjectResponse()
.command(GREET)
.param(<span class="pl-s">"message"</span>, greeting.greet(who))
.session(session)
.execute();
}
}
</pre>
</div>Và trước kia em thắc mắc làm sao để biết command nào để biết listen handler tương ứng. Sau khi đọc thì em thấy anh quản lý các lớp này bằng cách đưa nó vào một cái <code class="markdown-inline">singletonSet</code> ở <code class="markdown-inline">EzySimpleFactoryClass</code>. Và lúc có request gửi lên anh dựa vào command id để lấy listener tương ứng. Tuy nhiên em "KHÔNG THẤY" đoạn anh khởi tạo và add các listener này vào <code class="markdown-inline">singletonSet</code> ở <code class="markdown-inline">EzySimpleFactoryClass</code>. Em chỉ thấy đoạn get này ở <code class="markdown-inline">EzyUserRequestSingletonController</code>:<div class="markdown-block position-relative overflow-auto source-java">
<pre>
private Map<String, EzyUserRequestHandlerProxy> extractRequestHandlersFromListener() {
List<Object> clientRequestHandlers = getClientRequestHandlers();
Map<String, EzyUserRequestHandlerProxy> handlers = <span class="pl-k">new</span> HashMap<>();
<span class="pl-k">for</span> (Object handler : clientRequestHandlers) {
Class<?> handleType = handler.getClass();
EzyRequestListener annotation = handleType.getAnnotation(EzyRequestListener.class);
String command = EzyRequestListenerAnnotations.getCommand(annotation);
handlers.put(command, <span class="pl-k">new</span> EzyUserRequestHandlerProxy((EzyUserRequestHandler) handler));
logger.debug("add command {} and request handler {}", command, handler);
}
<span class="pl-k">return</span> handlers;
}
private List<Object> getClientRequestHandlers() {
<span class="pl-k">return</span> singletonFactory.getSingletons(EzyRequestListener.class);
}
</pre>
</div>và <code class="markdown-inline">getSingletons</code> ở EzySimpleSingletonFactory là anh duyệt qua <code class="markdown-inline">singletonSet</code> để tìm instance có chưa annotation <code class="markdown-inline">EzyRequestListener</code><div class="markdown-block position-relative overflow-auto source-java">
<pre>
<span class="pl-k">public</span> List getSingletons(Class... annotationClasses) {
<span class="pl-k">return</span> this.getSingletons((o) -> {
Class[] var2 = annotationClasses;
<span class="pl-k">int</span> var3 = annotationClasses.length;
<span class="pl-k">for</span>(int var4 = 0; var4 < var3; ++var4) {
Class annotationClass = var2[var4];
<span class="pl-k">if</span> (o.getClass().isAnnotationPresent(annotationClass)) {
<span class="pl-k">return</span> true;
}
}
<span class="pl-k">return</span> false;
});
}
<span class="pl-k">public</span> List getSingletons(Predicate filter) {
List list = <span class="pl-k">new</span> ArrayList();
Iterator var3 = this.singletonSet.iterator();
<span class="pl-k">while</span>(var3.hasNext()) {
Object object = var3.next();
<span class="pl-k">if</span> (filter.test(object)) {
list.add(object);
}
}
<span class="pl-k">return</span> list;
}
</pre>
</div>