静态方法与原型bean

时间:2018-09-09 09:54:45

标签: java spring spring-boot static-methods spring-bean

我有一个实用方法,该方法将字符串作为输入参数,并给我一个对应于输入的对象。我需要从Spring启动请求映射方法中调用此实用程序方法。

现在我的问题是下面两种方法的优缺点是什么?

  1. 使实用程序方法静态并调用它。
  2. 将方法设为原型bean并调用该bean。

方法1的示例代码:

**//SourceSystem can change at runtime**
public static FixedLengthReport fixedLengthReport(String sourceSystem) {
       return new TdctFixedLengthReport(sourceSystem, dao);
} 

方法2的示例代码:

@Bean
@Scope(value = "prototype")
**//SourceSystem can change at runtime**
public FixedLengthReport fixedLengthReport(String sourceSystem) {
       return new TdctFixedLengthReport(sourceSystem, dao);
} 

PS:从其他帖子中收集的样本。

1 个答案:

答案 0 :(得分:1)

如果您已经使用过Spring,则选择单例(每个Spring容器实例一个bean对象)bean(这是默认范围),如果您的静态方法没有任何共享状态,则可以。如果您选择原型,则Spring容器将为每个getBean()调用返回新的bean对象实例。并将该bean注入需要调用该方法的对象。与静态方法相比,此方法还对单元测试更友好,因为您可以在测试应用程序上下文中使用这种方法提供bean的测试实现。如果是静态方法,则需要PowerMock或其他第三方库来模拟棒方法进行单元测试。

更新

您的情况下应该有新的豆子

@Service
public MyReportBeanFactory {

   @Autowired
   private Dao dao;

   public FixedLengthReport fixedLengthReport(String sourceSystem) {
      return new TdctFixedLengthReport(sourceSystem, dao);
   }
}

然后您需要将此工厂bean注入要调用fixedLengthReport()

的类中