在一个带有(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方法是否有用,我也试过这个但是没有用
有没有办法
答案 0 :(得分:2)
您正在做的事情看起来像服务定位器模式,服务定位器是依赖注入的替代。因此,如果您已经在使用IoC Spring Container,则没有理由实现它。
可以将您的SeasonalFruitsServiceImpl
和BerryFruitsServiceImpl
声明为单独的bean,并使用各自的接口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();
}
}
但当然你永远不应该这样做来实例化你开发的对象。
答案 1 :(得分:0)
使用注释@Transactional(propagation = Propagation.REQUIRES_NEW)
非常适合我的代码,在服务方法上我添加了这个功能并且工作正常