没有自动装配注释的Spring注入

时间:2017-10-02 09:55:12

标签: java spring dependency-injection annotations autowired

我找到了一些答案:https://stackoverflow.com/a/21218921/2754014关于依赖注入。没有任何注释,例如@Autowired@Inject@Resource。让我们假设这个示例TwoInjectionStyles bean没有任何XML配置(简单<context:component-scan base-package="com.example" />除外。)

在没有指定注释的情况下注入是否正确?

2 个答案:

答案 0 :(得分:9)

从Spring 4.3开始,构造函数注入不需要注释。

public class MovieRecommender {

    private CustomerPreferenceDao customerPreferenceDao;

    private MovieCatalog movieCatalog;

    //@Autowired - no longer necessary
    public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
        this.customerPreferenceDao = customerPreferenceDao;
    }

    @Autowired 
    public setMovieCatalog(MovieCatalog movieCatalog) {
        this.movieCatalog = movieCatalog;
    }
}

但是你仍需要@Autowired进行二传手注射。我刚才用Spring Boot 1.5.7(使用Spring 4.3.11)检查过,当我删除@Autowired时,没有注入bean。

答案 1 :(得分:7)

是的,示例是正确的(从Spring 4.3发布开始)。根据文档(例如this),如果bean具有单个构造函数,则可以省略@Autowired注释。

但有几个细微差别:

1。当存在单个构造函数且setter标记为@Autowired注释时,构造函数和&amp;二传手注射将一个接一个地进行:

@Component
public class TwoInjectionStyles {
    private Foo foo;

    public TwoInjectionStyles(Foo f) {
        this.foo = f; //Called firstly
    }

    @Autowired
    public void setFoo(Foo f) { 
        this.foo = f; //Called secondly
    }
}

2。另一方面,如果根本没有@Autowire(如example中所述),则f对象将被注入一次通过构造函数,setter可以以常用方式使用而无需任何注入。