【问题标题】:Why does adding Spring DI into a Jersey 1.19.1 make my resource a singleton?为什么将 Spring DI 添加到 Jersey 1.19.1 中会使我的资源成为单例?
【发布时间】:2016-08-02 14:59:55
【问题描述】:

我在整个工作中的目标是尝试将数据源注入到可以在运行时更改的资源中。如果可能的话,我试图避免让我的资源内部的逻辑膨胀。

这是一个使用 Spring 4.1.9.RELEASE(spring-aop、spring-beans、spring-context、spring-core、spring-expression、spring-web)的 Jersey 1.19.1 的遗留应用程序

这是我的示例资源:

@Path("/test)
public class TestResource {
  public TestResource(){
     System.out.println("Constructor Hit");
  }
}

如果我运行 hit this resource,我会得到以下输出

...request...
Constructor Hit
...request...
Constructor hit

所以,每次有请求时都会创建资源,太好了!

现在,我想用spring给这个资源注入一个bean,所以我得到了下面这个类。

@Path("/test)
@Component
public class TestResource {
  @Inject
  public TestResource(MyBean test){
     System.out.println("Constructor Hit");
  }
}

现在我得到以下输出

Constructor hit
...request...
...request...

资源只创建一次(我猜是在 Spring 应用程序创建时)。

有没有办法解决这个问题?我相信这是因为我用@Component 注释但没有它我似乎无法获得注入部分。

【问题讨论】:

  • 为什么这是个问题?只要您的班级不保持状态,它就完全可以成为单身人士。
  • 这个想法是我想在运行时切换出 MyBean 实例实际上是什么。因此,例如,它是一个我想在运行时更改的数据源,而不是向如何从工厂中提取的资源添加逻辑,我只想将该实例注入到资源中以保持逻辑更清晰。跨度>
  • 然后使用 AOP 包装你的 MyBean 包含逻辑。您仍然需要在某处实现逻辑,而不是手动执行并产生创建开销,可能会有更聪明的方法......
  • 试图避开代理层,但我会进一步调查。
  • 你仍然需要一些东西,不管是不是工厂。要么将工厂注入你的资源并调用一个方法来获取实际的bean,如果你使用工厂bean,你仍然需要逻辑(这反过来又是一个相当巧妙的装置,因为由于某种原因你需要它在每个请求中有所不同,不知道为什么)。

标签: java spring dependency-injection singleton jersey-1.0


【解决方案1】:

Spring 的默认作用域是单例。当您在单例中调用原型类时,spring DI 在实例化时只注入一次原型类。 如果您希望单例 bean 在运行时获得原型 bean 的新实例,请阅读此 issue

【讨论】:

    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    相关资源
    最近更新 更多