gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:22:48 27 4
gpt4 key购买 nike

在带有( 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com