弹簧注射,不带自动线注释

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

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


答案 1

从 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;
    }
}

但是您仍然需要进行设置器注射。我刚才检查了(使用),当我删除时,豆子没有被注射。@AutowiredSpring Boot 1.5.7Spring 4.3.11@Autowired


答案 2

是的,示例是正确的(从春季4.3版本开始)。根据文档(例如),如果Bean具有单个构造函数,则可以省略注释。@Autowired

但有几个细微差别:

1. 当存在单个构造函数并且 setter 用注释标记时,构造函数和 setter 注入将依次执行:@Autowired

@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.另一方面,如果根本没有(如您的示例所示),则将通过构造函数注入一次对象,并且setter可以以其常用方式使用而无需任何注入。@Autowiref


推荐