内容
- Spring profile
- 条件化的bean声明
- 自动装配与歧义性
- bean的作用域
- Spring表达式语言
名词
- 单例 (Singleton)
- 原型 (Prototype)
- 会话 (Session)
- 请求 (Request)
- Spring表达式语言 (Spring Expression Language,SpEL)
3.1 处理自动装配的歧义性
@Autowired
public void setDessert(Dessert dessert) {
this.dessert = dessert;
}
@Component
public class Cake implements Dessert {...}
@Component
public class Ice implements Dessert {...}
@Component
public class Cookies implements Dessert {...}
以上都是注解,会被装载到Spring的上下文,但是并没有唯一,无歧义的可选值。因此,Spring会抛出异常,因此将bean中的某一个设为首选(primary)的bean,可以缩小这个可选的bean的范围。
3.1.1 标识首选的bean
@Primary+@Component用在组件扫描的bean上
@Primary+@Bean 用在配置bean的声明中
3.2 bean的作用域
默认情况下,Spring应用上下文中所有bean都是作为以单例(Singleton)的形式创建的。也就是说,不管给定的一个bean被注入到其他bean多少次,每次注入的都是同一个实例。但类是易变的(mutable),它们会保持一些状态。因此重用并不安全。
Spring的多种作用域:
名字 | 解释 |
---|---|
单例(singleton) | 在整个应用中只创建bean的一个实例 |
原型(Prototype) | 每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。 |
会话(Session) | 在Web应用中,为每个会话创建一个bean实例。 |
请求(Request) | 在Web应用中,为每个请求创建一个bean实例。 |
单例是默认作用域,如果要选择其他作用域,要使用@Scope注解,可以与@Bean和@Component一起使用。
3.3 使用Spring表达式语言进行装配
Spring表达式语言——(Spring Expression Language,SpEL)。
它以强大和简洁的方式将值装配到bean属性和构造器参数中,在这个过程中所使用的表达式会在运行时计算得到的值。
SpEL属性:
- 使用bean的ID来引用bean;
- 调用方法和访问对象的属性;
- 对值进行算术,关系和逻辑运算;
- 正则表达式匹配
- 集合操作
- 配合@Value()一起使用
- SpEL表达式:"#{...}"
- 属性占位符:"${...}"