创建两个相同的Bean,但其依赖项不同

5
我有一个服务类,它依赖于一个存储库Bean。
@Service
public class SomeService{
   private Repo repoClass;
   @Autowired
   public SomeService(Repo repoClass){
      this.repoClass = repoClass;
   }
   //Methods
}

但是我有两种类型的存储库

public class JdbcRepo implements Repo{
}

public class HibernateRepo implements Repo {
}

我如何创建两个SomeService的实例,其中一个被注入JdbcRepo,另一个被注入HibernateRepo


请检查更新的答案,如果需要进一步帮助,请告诉我! - SyntaX
3个回答

3

我这里有一个简单的解决方案,请查看@Primary

我假设你正在使用注解驱动的方法:

@Primary
@Repository(value = "jdbcRepo")
public class JdbcRepo implements Repo{
}

@Primary 表示当有多个候选项可以自动装配单值依赖关系时,应该优先考虑使用该 bean。如果在候选项中恰好存在一个“primary” bean,则它将成为自动连接的值。

@Repository(value = "hibernateRepo")
public class HibernateRepo implements Repo {
}

为了注入依赖项,您可以使用@Autowired@Qualifier或仅使用@Resource

现在要注入JdbcRepo,只需使用@Autowired,因为有@Primary

@Service
public class SomeService{
   @Autowired
   private Repo repoClass;
}  

要注入 HibernateRepo,你必须使用 @Qualifier

 @Service
    public class RandomService{
       @Autowired
       @Qualifier("hibernateRepo")
       private Repo repoClass;
    }  

针对您关注的SomeService中被注入了JdbcRepo和HibernateRepo两个bean,您可以按照与Repository相同的模式来处理Service类。
public interface SomeService{
}

@Primary
@Service(value = "jdbcService")
public class  JdbcService extends SomeService{
   @Autowired
   private Repo repo;
}

@Service(value = "hibernateService")
public class  HibernateService extends SomeService{
   @Autowired
   @Qualifier("hibernateRepo")
   private Repo repo;
}

SomeService 注入 jdbcRepo

@Autowired
private SomeService someService;

SomeService 注入 HibernateRepo

@Autowired
@Qualifier("hibernateService")
private SomeService someService;

请参考以下Stackoverflow主题:

希望这能帮到你,欢迎留言评论!


最终我必须拥有两个 SomeService 类吗? - IllSc
@IIISc 这只是一个例子。重要的是Repo被注入的方式,而不是服务类。它可以是任何Spring管理的bean,也就是你想要注入的任何地方。无论如何,我已经重命名了服务类以避免混淆。如果您仍有疑问,请告诉我。 - SyntaX
我的主要关注点是有两种豆子类型,但每个豆子都有不同的豆子要注入。 - IllSc

1

在xml中定义两个someService bean,如下所示:

<bean id="someservice" class="">
     <constructor-arg>
         <value>JdbcRepo</value>
     </constructor-arg>
</bean>

<bean id="someservice2" class="">
     <constructor-arg>
         <value>HibernateRepo</value>
     </constructor-arg>
</bean>

0
如果您正在使用注解驱动,只需使用以下代码:
@Autowired private JdbcRepo jdbcRepo; 
@Autowired private HibernateRepo hibernateRepo ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接