处理自动装配的歧义性
标示首选bean
@Primary和@Component组合使用,声明该bean在自动扫描时为首选bean,在遇到歧义时首先使用首选bean
限定自动装配的bean
@Autowired(@Inject)和@Qualifier配合使用,在注入时指定要注入进去的是哪个bean,如@Qualifier(“iceCream”),表明注入ID(确切地讲是限定符,只不过默认限定符和ID是相同的 )为iceCream的bean
创建自定义限定符
@Qualifier和bean声明(@Component或@Bean)一起使用时显示指定该bean的限定符
bean的作用域
在Spring中,bean默认都是单例的,但其实一共有以下几种作用域:
- Singleton:整个应用范围只创建bean的一个实例
- Prototype:每次注入或通过应用上下文获取的时候,都会创建一个新的bean的实例
- Session:在Web应用中,为每个会话创建一个bean实例
- Request:在Web应用中,为每个请求创建一个bean实例
通过@Scope和@Bean(或@Component)一起使用来指定bean的作用域。
代理模式
使用会话和请求作用域时,@Scope还有一个proxyMode属性,如下所示:
@Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode=ScopedProxyMode.INTERFACES)
proxyMode指定使用接口的方式实现该bean的代理,如果proxyMode的值设置为:ScopedProxyMode.TARGET_CLASS
则表明要使用CGLib来生成基于类的代理。
如果是使用xml的配置方式,要指定使用CGLib的基于类的代理需加上以下元素:
<aop:scoped-proxy/>
如果不使用该元素,默认就是使用基于接口的代理,也可以使用下面方式来显示指定接口方式的代理:
<aop:scoped-proxy proxy-target-class="false"/>
运行时值注入
注入外部的值
使用以下方式可以将文件中的键值对加载到Environment中,然后就可以在Environment中取这些属性。
@Configuration
@PropertySource("classpath:/com/pingan/config.properties")
public class CDPlayerConfig {}
我们还可以将属性定义到外部的属性文件中,并使用占位符值将其插入到Spring bean中。在装配时占位符的形式为”${…}”,这些属性是在配置文件以外的一个源得到的,可以在xml和注解中使用。使用注解方式时,需要配置一个PropertySourcesPlaceholderConfigurer的bean,如下所示:
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}
如果使用xml的配置方式,要使用占位符需要加入以下元素:
<context:property-placeholder/>
我们还可以使用Spring表达式语言(SpEL)来注入属性,SpEL表达式放到#{},使用SpEL表达式的值可以是:
- 调用方法
- 字面量
- 引用其他bean的属性和方法
- 访问类的静态方法和常量:要依赖T()
- 使用运算符计算表达式结果
- 计算正则表达式:matches运算符
- 计算集合