抽象工厂模式与2工厂方法

时间:2012-12-21 09:51:38

标签: java spring factory-pattern

在一个带有(controller - services - dao - entity layers)的spring hibernate java项目中,我有抽象工厂模式(抽象类有2个抽象方法)。在抽象工厂模式的实现类中,我有dao方法(运行命名查询)。现在,当请求来自服务impl来自另一个Service类的dao时,它会提供空指针 我已经在服务impl中自动安装了dao类 `

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

我无法将@Service(“abstractFruitService”)添加到SeasonalFruitsServicsImpl和BerryFruitsServiceImpl,它会产生错误 - 与同名和类的现有非兼容bean定义冲突

在这种情况下,不确定spring static / instance factory方法是否有用,我也试过这个但是没有用

有没有办法

2 个答案:

答案 0 :(得分:2)

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

可以将您的SeasonalFruitsServiceImplBerryFruitsServiceImpl声明为单独的bean,并使用各自的接口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();
  }
}

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

答案 1 :(得分:0)

使用注释@Transactional(propagation = Propagation.REQUIRES_NEW)非常适合我的代码,在服务方法上我添加了这个功能并且工作正常