首页 > 解决方案 > 将 Spring 组件转移到 Spring 上下文之外的某个类的 Anti Pattern 是什么?

问题描述

假设在这种情况下,我有访问数据库并从数据库中获取一些数据的弹簧组件

@Component
public class SomeComponent {
  @Autowiried
  private Datasource datasource;

  ...

  public SomeModel getModel() {
   ....
    return result;
  }
}

我有一个工厂结构,可以生成带有一些参数的实例。而且这个结构不是 Spring Component

public class MyFactory {
  public static MyObject newObject(...) {
    ... // in this scope(A), many classes are used to generate MyObject;
   return MyObject;  
  } 
}

这个结构想要访问数据库,因为它必须检查数据库中的数据才能生成正确的对象

我认为非常简单的解决方案就是这样。

在某些服务层

@Component
public class SomeService {
  @Autowired
  private SomeComponent someComponent;

  public MyObject getMyObject() {
   return MyFactory.newObject(someComponent);
  }
}

我的问题是 Spring 使用中的这种反模式吗?

在这个解决方案中,Non spring context Class通过方法参数获取Spring Components,并使用它们

如果由于某种原因它是反模式,请指导我解决这种情况

标签: javaspring

解决方案


我建议你在这里采用KISS原则:

public class MyFactory {
  public static MyObject newObject(SomeComponent someComponent /* and other parameter if needed */) {
    ... // in this scope(A), many classes are used to generate MyObject;
   return MyObject;  
  } 
}

为您的工厂构造方法提供所需的参数,包括autowired从数据库中为您提供所需信息的变量,并在您需要新对象时直接调用工厂方法。

您建议的类过于复杂,因为它是您现有工厂的事实上的包装器,具有提供给您的工厂的单个 DB 相关对象的硬编码。这是一个严格的实现——如果你想在你的工厂中使用这个对象的不同实例怎么办?

参考:


推荐阅读