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使用最贪心的依赖性可以得到满足的构造函数,即具有最大参数数量的构造函数。
建议使用@Autowired的required属性而不是@Required注解。 required属性表示该属性不是自动装配所必需的,如果无法自动装配,则会忽略该属性。 另一方面,@ Required更强大,因为它强制要求由容器支持的任何方式来设置的属性。如果未注入任何值,则会引发相应的异常。
您还可以将@Autowired用于众所周知的可解析依赖项的接口:BeanFactory,ApplicationContext,Environment,ResourceLoader,ApplicationEventPublisher和MessageSource。这些接口及其扩展接口(如ConfigurableApplicationContext或ResourcePatternResolver)将自动解析,无需特殊设置。
public class MovieRecommender { @Autowired private ApplicationContext context; public MovieRecommender() { } // ... }
@Autowired,@ Inject,@ Resource和@Value注解由Spring BeanPostProcessor实现来进行处理,这反过来意味着您不能在自己的BeanPostProcessor或BeanFactoryPostProcessor类型(如果有)中应用这些注解。必须通过XML或使用Spring @Bean方法显式地“连接”这些类型。