0

在带有(控制器 - 服务 - dao - 实体层)的spring hibernate java项目中,我有抽象工厂模式(抽象类有2个抽象方法)。在抽象工厂模式的实现类中,我有 dao 方法(运行命名查询)。现在,当请求来自另一个服务类的服务 impl dao 时,它会给出空指针异常,我已经在服务 impl 中自动装配了 dao 类

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

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

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

有什么办法吗

4

2 回答 2

2

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

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

Martin J. Fowler 文章

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

<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();
  }
}

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

于 2012-12-22T13:59:29.070 回答
0

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

于 2012-12-25T13:42:28.730 回答