如何使用构造函数注入为Spring数据存储库创建JavaConfig工厂方法?
我有一个带有存储库、服务和控制器的简单应用程序。我在一个配置类中进行配置,在该类中我将接口绑定到实现。除EntityManager之外的所有依赖项都使用构造函数注入进行注入 我的问题是如何将CrudePository实例注入到我的服务中,因为我没有任何CrudePository的实现 我的服务看起来有点像这样:如何使用构造函数注入为Spring数据存储库创建JavaConfig工厂方法?,java,spring,spring-data,Java,Spring,Spring Data,我有一个带有存储库、服务和控制器的简单应用程序。我在一个配置类中进行配置,在该类中我将接口绑定到实现。除EntityManager之外的所有依赖项都使用构造函数注入进行注入 我的问题是如何将CrudePository实例注入到我的服务中,因为我没有任何CrudePository的实现 我的服务看起来有点像这样: @Service public class ConcreteXService implements XService { private final XRepository r
@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
}
我的配置看起来有点像这样:
@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
}
我的Crudepository实例被定义为扩展Crudepository的接口,如果我只是在测试中对它们进行字段注入,它们似乎可以工作,但我不知道如何编写一个配置来构造函数注入它们,因为没有实现。非常感谢您的帮助。作为调用xRepository方法的替代方法,您可以将存储库接口指定为方法参数:
作为调用xRepository方法的替代方法,您可以将存储库接口指定为方法参数:
我建议不要手动为应用程序组件声明bean,而只是使用组件扫描和自动连接。因此,基本上摆脱服务和控制器的@Bean方法,而是将@ComponentScan与应用程序基本包一起使用 如果您真的需要使用JavaConfig来实现这些功能,您可以将依赖项设置为factory方法的参数:
@Bean XService service(XRepository repository){
return new ConcreteXService(repository);
}
或者,将存储库自动关联到配置类:
@Autowired XRepository repository;
@Bean XService xService(){
return new ConcreteXService(repository);
}
我建议不要手动为应用程序组件声明bean,而只是使用组件扫描和自动连接。因此,基本上摆脱服务和控制器的@Bean方法,而是将@ComponentScan与应用程序基本包一起使用 如果您真的需要使用JavaConfig来实现这些功能,您可以将依赖项设置为factory方法的参数:
@Bean XService service(XRepository repository){
return new ConcreteXService(repository);
}
或者,将存储库自动关联到配置类:
@Autowired XRepository repository;
@Bean XService xService(){
return new ConcreteXService(repository);
}
谢谢,我个人更喜欢第二种选择。谢谢,我个人更喜欢第二种选择。