java - 具有 2 个工厂方法的抽象工厂模式

标签 java spring factory-pattern

在带有( Controller -服务-dao-实体层)的Spring Hibernate Java项目中,我有抽象工厂模式(抽象类有2个抽象方法)。在抽象工厂模式的实现类中,我有 dao 方法(用于运行命名查询)。现在,当请求到达服务 impl 来自另一个 Service 类的 dao 时,它会给出空指针异常 我已经在 services impl 中 Autowiring 了 dao 类 `

AbstractFruitService - [addToBasket() and removeFromBasket()] 
|
|- SeasonalFruitsServicsImpl - SeasonalFruitsDAO
| 
|- BerryFruitsServiceImpl - BerryFruitsDAO

我无法将 @Service("abstractFruitService") 添加到 SeasonalFruitsServicsImpl 和 BerryFruitsServiceImpl 中,它会给出错误 - 与现有的、不兼容的相同名称和类的 bean 定义冲突

不确定 spring 静态/实例工厂方法在这种情况下是否有用,我也尝试过,但没有成功

有什么办法吗

最佳答案

您正在做的事情看起来更像是服务定位器模式,服务定位器是依赖注入(inject)的替代。因此,如果您已经在使用 IoC Spring 容器,则没有理由实现它。

可以声明您的SeasonalFruitsServiceImplBerryFruitsServiceImpl作为单独的 bean,并使用各自的接口(interface)从容器请求它们的实例 SeasonalFruitsDAOBerryFruitsDAO ,或者为它们提供单独的名称(如果您需要替换实现,那么您只需在容器中注册另一个实现)。

参见Martin J. Fowler article

如果服务定位器是由第三方提供的,那么您应该创建一个服务定位器的实例

<bean id="someServiceLocator" class="com.some3rdparty.ServiceLocator"/>
<bean id="seasonalFruitsDao" factory-bean="someServiceLocator" factory-method="createSeasonalFruitDao"/>
<bean id="berryFruitsDao" factory-bean="someServiceLocator" factory-method="createBerryFruitsDao"/>

或者使用java代码配置

@Configuration
public class someServiceLocatorConfiguration{
  @Bean
  public ServiceLocator locator(){
    return new com.some3rdparty.ServiceLocator();
  }
  @Bean()
  public SeasonalFruitsDao  seasonalFruitsDao(){
    return locator().createSeasonalFruitDao();
  }
  @Bean()
  public SeasonalFruitsDao  seasonalFruitsDao(){
    return locator().createSeasonalFruitDao();
  }
}

但是当然,您永远不应该这样做来实例化您开发的对象。

关于java - 具有 2 个工厂方法的抽象工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13987811/

相关文章:

java - spring-boot @Scheduled pool-size 调试

java - 在 spring 中获取 application.yml 信息

java - 子列表出错

java - JPA+Hibernate+Mysql的查询语言问题

c# - 工厂应该跟踪创建的 IDisposable 对象吗?

java - 我如何应用 "Factory Pattern"在 Java 中实例化 Firefox、IE 和 Chrome 浏览器实例

c# - 在哪些情况下使用工厂类而不是静态函数是有意义的?

java - 在 Simple 中使用 @Text 注释反序列化元素列表

java - Mapstruct 扩展包含具有相同签名的方法的多个接口(interface)

java - java中如何将字节转换为kb