在没有@Autowire的情况下实例化Java Spring存储库接口

时间:2018-07-08 16:30:26

标签: java spring spring-boot interface repository

这是我的Spring存储库界面。

@Repository
public interface WebappRepository extends CrudRepository<myModel, Long> {

}

由于Spring注释的魔力,即使在它的接口中,我也可以实例化WebappRepository

public class controller{

    @Autowire
    WebappRepository repo;

    public controller(){

    }
}

但是使用构造函数的此变体正常工作,因为WebappRepository是一个接口。

public class controller{

    WebappRepository repo;

    public controller(){
        this.repo = new WebappRepository();
    }
}

Olivier Gierke本人advocates to avoid @Autowire fields at all costs。如何在避免@Autowire的同时“实例化”我的Spring应用程序中的存储库接口?

2 个答案:

答案 0 :(得分:2)

在构造函数中注入依赖项:

@Component
public class Controller{


    WebappRepository repo;

    @Autowire
    public Controller(WebappRepository repo){
        this.repo = repo;
    }
}

答案 1 :(得分:2)

如果您使用的是Spring 4.3+,并且您的目标类只有一个构造函数,则可以省略自动装配的注释。 Spring将为其注入所有必需的依赖项。 因此,只需在构造函数下面编写即可:

public controller(WebappRepository repo){
    this.repo = repo;
}

参考:https://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#beans-autowired-annotation