三、Spring-Bean高级装配

内容

  • 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()一起使用
  1. SpEL表达式:"#{...}"
  2. 属性占位符:"${...}"

你可能感兴趣的:(三、Spring-Bean高级装配)