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

时间:2015-10-05 10:53:27

标签: java spring spring-data

我有一个包含存储库,服务和控制器的简单应用程序。我在配置类中配置了我的接口,我将接口绑定到实现。使用构造函数注入注入所有依赖项(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<…>的接口,如果我只是在测试中注入它们,它们似乎有效,但我不知道如何编写可以构造函数注入的配置他们,因为没有实施。帮助将不胜感激。

2 个答案:

答案 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);
 }