我见过的Spring Boot和Jersey的所有代码示例都通过传递组件的类来为Jersey注册组件。
来自here:
public static class JerseyServletConfig extends ResourceConfig {
public JerseyServletConfig() {
register(RequestContextFilter.class);
packages("com.github.cthiebault");
register(LoggingFilter.class);
}
}
或here:
register(ApiListingResource.class);
ResourceConfig's javadoc says:
注册自定义JAX-RS组件的实例(例如 要实例化的扩展提供程序或功能元提供程序) 在此可配置上下文的范围内使用。
我的问题是:
让泽西州实例化这些资源有什么好处?
如果我们应该让泽西岛管理这些组件,为什么它仍然提供register(Object component)
方法,为什么不将它限制在register(Class<?> componentClass)
?
我们什么时候应该发送我们自己的实例,而不是让泽西岛实例化我们的课程?
答案 0 :(得分:1)
首先,依赖注入通常是一个GoodThing(tm) - 它允许分离关注点,它可以大大简化测试。通常,将对象创建与对象使用分离可以将业务/应用程序逻辑(即对象使用)与实现问题分开(确定哪些对象连接在一起)。
允许Jersey管理您的资源/组件也是GoodThing(tm)。这是泽西岛的一部分。如果允许Jersey管理您的资源生命周期,那么您编写/维护的代码就会减少,而您做最终编写/维护的代码会更多地关注您的应用程序所做的事情而不是你的对象如何组合在一起。
Jersey提供了一个标准生命周期,它为您提供了一个允许开发人员使用mental framework的约定 - 使新开发人员更容易加入,现有开发人员可以在应用程序之间切换。如果需要,可以配置生命周期,这允许特殊雪花应用程序在必要时具有特殊雪花行为。
register(Object)
方法是一个示例,说明如何选择退出Jersey来控制组件的生命周期。你可能想要这样做有很多原因,但你通常应该避免这样做 - 让图书馆完成它的工作。特殊情况的例子是,如果您正在集成一些遗留代码,由于其自身的模糊/晦涩的原因,意味着某些关键类必须是应用程序级单例。甚至可能存在一些非遗留的原因,为什么您只需要应用程序中的单个实例 - 对象映射器始终是一个很好的例子。通常,您现在使用JSR-330支持,但可能会出现一些不可能的情况。
通过与JSR-330集成,您还可以为某些对象提供自定义命名范围 - 这使您可以控制Jersey创建和使用对象的方式,同时还可以显示您想要的内容(通过范围名称)。这通常提供了一种清晰的结构,它意图揭示而不是意图隐藏。