在带有( 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 容器,则没有理由实现它。
可以声明您的SeasonalFruitsServiceImpl
和BerryFruitsServiceImpl
作为单独的 bean,并使用各自的接口(interface)从容器请求它们的实例 SeasonalFruitsDAO
和BerryFruitsDAO
,或者为它们提供单独的名称(如果您需要替换实现,那么您只需在容器中注册另一个实现)。
如果服务定位器是由第三方提供的,那么您应该创建一个服务定位器的实例
<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/