Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.9.2 @Autowired

6.9.2 @Autowired

正如料想的那样,您可以将@Autowired应用于传统的setter方法:

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Autowired
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    // ...

}

在下面的示例中,可以使用JSR 330@Inject代替Spring@Autowired。有关详细信息,请参见此处

您还可以将应用于具有任意名称和/或多个参数的方法:

public class MovieRecommender {

    private MovieCatalog movieCatalog;

    private CustomerPreferenceDao customerPreferenceDao;

    @Autowired
    public void prepare(MovieCatalog movieCatalog,
            CustomerPreferenceDao customerPreferenceDao) {
        this.movieCatalog = movieCatalog;
        this.customerPreferenceDao = customerPreferenceDao;
    }

    // ...

}

您可以将@Autowired应用于构造函数和字段:

public class MovieRecommender {

    @Autowired
    private MovieCatalog movieCatalog;

    private CustomerPreferenceDao customerPreferenceDao;

    @Autowired
    public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
        this.customerPreferenceDao = customerPreferenceDao;
    }

    // ...

}

通过将注添加到需要该类型数组的字段或方法,还可以通过ApplicationContext提供特定类型的所有bean

public class MovieRecommender {

    @Autowired
    private MovieCatalog[] movieCatalogs;

    // ...

}

这同样适用于类型集合:

public class MovieRecommender {

    private Set<MovieCatalog> movieCatalogs;

    @Autowired
    public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
        this.movieCatalogs = movieCatalogs;
    }

    // ...

}

您的bean可以实现org.springframework.core.Ordered接口,或者如果您希望将数组或列表中的项目按特定顺序排序,请使用@Order或标准的@Priority注解

只要预期的键类型是String,即使是类型化的Maps也可以自动装配。Map值将包含所需类型的所有bean,并且键将包含相应的bean名称:

public class MovieRecommender {

    private Map<String, MovieCatalog> movieCatalogs;

    @Autowired
    public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
        this.movieCatalogs = movieCatalogs;
    }

    // ...

}

默认情况下,只要零个候选bean可用,自动装配就会失败默认行为是将带注的方法,构造函数和字段视为指示所需的依赖项。可以更改此行为,如下所示。

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Autowired(required=false)
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    // ...

}

每个类只能标记一个required的构造函数,但可以注多个非必需的构造函数。 在这种情况下,每个都被认为是候选者之一,Spring使用最贪心的依赖性可以得到满足构造函数,即具有最大参数数量的构造函数。

建议使用@Autowiredrequired属性而不是@Required required属性表示该属性不是自动装配所必需的,如果无法自动装配,则会忽略该属性。 另一方面,@ Required更强大,因为它强制要求由容器支持的任何方式设置属性。如果未注入任何值,则会引发相应的异常。

您还可以将@Autowired用于众所周知的可解析依赖项的接口:BeanFactoryApplicationContextEnvironmentResourceLoaderApplicationEventPublisherMessageSource。这些接口及其扩展接口(如ConfigurableApplicationContextResourcePatternResolver)将自动解析,无需特殊设置。

public class MovieRecommender {

    @Autowired
    private ApplicationContext context;

    public MovieRecommender() {
    }

    // ...

}

@Autowired@ Inject@ Resource@ValueSpring BeanPostProcessor实现来进行处理,这反过来意味着您不能在自己的BeanPostProcessorBeanFactoryPostProcessor类型(如果有)中应用这些注。必须通过XML或使用Spring @Bean方法显式地连接这些类型。

原文地址:https://www.cnblogs.com/springmorning/p/10389316.html