回到最顶层的调用ArgoFilter.init(),Argo.init()初始化了ArgoDispatcher,ArgoFilter初始化完毕。
ArgoFilter.doFilter实现过滤功能
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpReq = (HttpServletRequest) request;
HttpServletResponse httpResp = (HttpServletResponse) response;
dispatcher.service(httpReq, httpResp);
}
只是简单地交给ArgoDispatcher处理。
接口ArgoDispatcher添加了@ImplementedBy(DefaultArgoDispatcher.class)注解,@ImplementedBy注解设置默认的实现类和bind(ArgoDispatcher.class).to(DefaultArgoDispatcher.class)的结果是等价的。
下面介绍DefaultArgoDispatcher
@Inject
public DefaultArgoDispatcher(Argo argo, Router router, StatusCodeActionResult statusCodeActionResult, MultipartConfigElement config) {
this.argo = argo;
this.router = router;
this.statusCodeActionResult = statusCodeActionResult;
this.config = config;
this.logger = argo.getLogger(this.getClass());
logger.info("constructed.", this.getClass());
}
可以发现构造函数添加了 @Inject 注解,参数是通过注入实现实例化的。
@Override
protected void configure() {
…
bind(MultipartConfigElement.class)
.toProvider(DefaultMultipartConfigElementProvider.class)
.in(Singleton.class);
…
}