我有一个包含存储库,服务和控制器的简单应用程序。我在配置类中配置了我的接口,我将接口绑定到实现。使用构造函数注入注入所有依赖项(EntityManager
除外)。
我的问题是如何将CrudRepository
实例注入我的服务,因为我没有CrudRepository
的任何实现。
我的服务看起来像这样:
@Service
public class ConcreteXService implements XService {
private final XRepository repository;
@Autowired
public ConcreteXService(XRepository repository){
this.repository=repository;
}
// …
}
我的配置看起来像这样:
@Configuration
@EnableJpaRepositories("some.package")
public class MyConf{
@Bean
public EntityManagerFactory entityManagerFactory(){
// …
}
@Bean
public XController xController(){
return new ConcreteXController(xService());
}
@Bean XService xService(){
return new ConcreteXService(/*would like to write xRepository() here but that method does not exist.*/);
}
//Lots of other beans are omitted
}
我的CrudRepository
个实例被定义为扩展CrudRepository<…>
的接口,如果我只是在测试中注入它们,它们似乎有效,但我不知道如何编写可以构造函数注入的配置他们,因为没有实施。帮助将不胜感激。
答案 0 :(得分:3)
作为调用xRepository()
方法的替代方法,您可以将存储库接口指定为方法参数:
@Configuration
@EnableJpaRepositories("some.package")
public class MyConf{
@Bean
public EntityManagerFactory entityManagerFactory(){
//omitted
}
@Bean
public XController xController(xService xService){
return new ConcreteXController(xService);
}
@Bean XService xService(xRepository xRepository){
return new ConcreteXService(xRepository);
}
//Lots of other beans are omitted
}
答案 1 :(得分:2)
我建议不要手动为应用程序组件声明bean,而只是使用组件扫描和自动装配。所以基本上摆脱了服务和控制器的@Bean
方法,而是将@ComponentScan
与您的应用程序库包一起使用。
如果你确实需要使用JavaConfig,你可以将依赖项作为工厂方法的参数:
@Bean XService service(XRepository repository){
return new ConcreteXService(repository);
}
或者,将存储库自动装配到配置类中:
@Autowired XRepository repository;
@Bean XService xService(){
return new ConcreteXService(repository);
}