Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用构造函数注入为Spring数据存储库创建JavaConfig工厂方法?_Java_Spring_Spring Data - Fatal编程技术网

如何使用构造函数注入为Spring数据存储库创建JavaConfig工厂方法?

如何使用构造函数注入为Spring数据存储库创建JavaConfig工厂方法?,java,spring,spring-data,Java,Spring,Spring Data,我有一个带有存储库、服务和控制器的简单应用程序。我在一个配置类中进行配置,在该类中我将接口绑定到实现。除EntityManager之外的所有依赖项都使用构造函数注入进行注入 我的问题是如何将CrudePository实例注入到我的服务中,因为我没有任何CrudePository的实现 我的服务看起来有点像这样: @Service public class ConcreteXService implements XService { private final XRepository r

我有一个带有存储库、服务和控制器的简单应用程序。我在一个配置类中进行配置,在该类中我将接口绑定到实现。除EntityManager之外的所有依赖项都使用构造函数注入进行注入

我的问题是如何将CrudePository实例注入到我的服务中,因为我没有任何CrudePository的实现

我的服务看起来有点像这样:

@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);
 }

谢谢,我个人更喜欢第二种选择。谢谢,我个人更喜欢第二种选择。