1.处理自动装配的歧义性
自动装配的时候,仅有一个bean匹配所需的结果时,自动装配才是最有效的,如果不仅有一个Bean能够匹配结果的话,这种歧义性会阻碍Spring自动装配属性、构造参数或者方法参数。如上图所示
当确实发生歧义性的时候,Spring提供了多种可选方案来解决这样的问题。你可以将可选Bean中的某一个设为首选(primary)的bean,或者使用限定符(qualifier)来帮助Spring将可选bean的范围到只有一个Bean。
1.1标示首选的bean
@Primary能够与@Component组合用在组件扫描的bean上,也可以与@Bean组合用在Java配置的bean声明中。
如下图所示距离
1.2限定自动装配的bean
@Qualifier注解是使用限定符的主要方式。它可以与@Autowired和@Inject协同使用,在注入的时候指定想到注入进去的是哪个bean
如图所示
为限定符@Qualifier注解所设置的参数就是想要注入的bean的ID。所有使用@Component注解声明的类都会创建为bean,并且Bean的ID的首字母变为小写的类名。
但是会存在一些问题,如下图所示
2.bean的作用域
在默认情况下,Spring应用上下文所有的Bean都是作为以单例的形式创建的。
Spring中定义了多种作用域,可以基于这种作用域创建bean
包括:
- 单例——在整个应用中只创建一个bean
- 原型——每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean的实例。
- 会话——在web应用中,为每个会话创建一个实例
- 请求——在web应用中,为每个请求创建一个bean的实例。
如果你是用组件扫描发现和声明Bean,那么你可以在Bean的类上使用@Scope注解将其声明为原型bean,如下图所示