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
?
我这里有一个简单的解决方案,请查看
@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)
要注入依赖项,您可以使用@Autowired
with@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)
注射SomeService
用jdbcRepo
:
@Autowired
private SomeService someService;
Run Code Online (Sandbox Code Playgroud)
注射SomeService
用HibernateRepo
@Autowired
@Qualifier("hibernateService")
private SomeService someService;
Run Code Online (Sandbox Code Playgroud)
请考虑这些 Stackoverflow 线程以供进一步参考:
希望这对你有帮助,欢迎评论!