java - 将 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,并使用它们
如果由于某种原因它是反模式,请指导我解决这种情况
解决方案
我建议你在这里采用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 相关对象的硬编码。这是一个严格的实现——如果你想在你的工厂中使用这个对象的不同实例怎么办?
参考:
推荐阅读
- r - 如何在ggplot轴文本中添加乳胶?
- python - ValueError:无法设置张量:尺寸不匹配。得到 5,但输入 0 预期为 4
- python - Pandas 系列,需要正确保存为 CSV
- swift - 通过字节数组创建 CGImage 有时会导致 EXC_BAD_ACCESS
- javascript - 确定水平滚动javascript上显示多少张卡片
- wordpress - FacetWP 模板在多个部分(或按方面)提供查询结果
- sockets - 如何在 Ubuntu 中侦听连接然后将文件执行到连接中?
- r - 错误:Alpha 必须为 1 或长度 x。(在我的代码中使用 renderPlotly)
- wordpress - 如何自定义 WooCommerce JetWooBuilder 产品网格
- python - 使用 to_dict 和 from_dict 时,如何获取 DataFrame 以保留索引顺序?