创建两个依赖不同的相同bean

Ill*_*lSc 5 java spring dependency-injection spring-mvc

我有一个依赖于 Repository Bean 的服务类

@Service
public class SomeService{
   private Repo repoClass;
   @Autowired
   public SomeService(Repo repoClass){
      this.repoClass = repoClass;
   }
   //Methods
}
Run Code Online (Sandbox Code Playgroud)

但是我有两种回购

public class JdbcRepo implements Repo{
}

public class HibernateRepo implements Repo {
}
Run Code Online (Sandbox Code Playgroud)

我如何制作两个豆子,SomeService其中一个注入了JdbcRepo另一个注入了HibernateRepo

Syn*_*taX 3

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

我假设您正在使用注释驱动的方法:

@Primary
@Repository(value = "jdbcRepo")
public class JdbcRepo implements Repo{
}
Run Code Online (Sandbox Code Playgroud)

@Primary指示当多个候选者有资格自动装配单值依赖项时,应优先考虑某个 bean。如果候选者中恰好存在一个“主要”bean,则它将是自动装配的值。

@Repository(value = "hibernateRepo")
public class HibernateRepo implements Repo {
}
Run Code Online (Sandbox Code Playgroud)

要注入依赖项,您可以使用@Autowiredwith@Qualifier或 only @Resource

现在要注入JdbcRepo,您可以使用@Autowired,因为@Primary

@Service
public class SomeService{
   @Autowired
   private Repo repoClass;
}  
Run Code Online (Sandbox Code Playgroud)

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

 @Service
    public class RandomService{
       @Autowired
       @Qualifier("hibernateRepo")
       private Repo repoClass;
    }  
Run Code Online (Sandbox Code Playgroud)

对于您的担忧two beans of SomeService which one is injected with JdbcRepo and another is injected with HibernateRepo,您可以遵循与存储库相同的服务类模式。

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;
}
Run Code Online (Sandbox Code Playgroud)

注射SomeServicejdbcRepo

@Autowired
private SomeService someService;
Run Code Online (Sandbox Code Playgroud)

注射SomeServiceHibernateRepo

@Autowired
@Qualifier("hibernateService")
private SomeService someService;
Run Code Online (Sandbox Code Playgroud)

请考虑这些 Stackoverflow 线程以供进一步参考:

希望这对你有帮助,欢迎评论!