Spring实战4
第1部分 Spring的核心
第3章 高级装配
- Spring profile
- 条件化的bean声明
- 自动装配与歧义性
- bean的作用域
- Spring表达式语言
3.1 环境与profile
不同的环境同一个功能可能需要不同的bean
3.1.1 配置profile bean
要使用profile,首先要讲所有不同的bean定义整理到一个或多个profile中。
-
在Java配置中,可以使用@Profile注解指定某个bean属于哪一个profile。
-
在XML中配置profile
3.1.2 激活profile
Spring在确定哪个profile处于激活状态时,需要依赖两个独立的属性:spring.profiles.active和spring.profiles.default
- 如果设置了spring.profiles.active属性的话,那么它的值就会用来确定哪个profile是激活的。
- 如果没有设 置spring.profiles.active属性的话,那Spring将会查找spring.profiles.default的值。
- 如 果spring.profiles.active和spring.profiles.default均没有设置的话,那就没有激活的profile,因此只会创建那些没有定义在 profile中的bean。
有多种方式来设置这两个属性:
- 作为DispatcherServlet的初始化参数;
- 作为Web应用的上下文参数;
- 作为JNDI条目;
- 作为环境变量;
- 作为JVM的系统属性;
- 在集成测试类上,使用@ActiveProfiles注解设置。
3.2 条件化的bean
Spring 4引入了一个新的@Conditional注解,它可以用到带有@Bean注解的方法上。如果给定的条件计算结果为true,就会创建这个bean,否则的话,这个bean会被忽略。
3.3 处理自动装配的歧义性
自动装配时,合适的bean不唯一时,会报错,歧义性
3.3.1 标示首选的bean
3.3.2 限定自动装配的bean
-
创建自定义的限定符
-
使用自定义的限定符注解
3.4 bean的作用域
Spring定义了多种作用域,可以基于这些作用域创建bean,包括:
- 单例(Singleton):在整个应用中,只创建bean的一个实例。
- 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
- 会话(Session):在Web应用中,为每个会话创建一个bean实例。
- 请求(Rquest):在Web应用中,为每个请求创建一个bean实例。
单例 是默认的作用域。如果选择其他的作用域,要使用 @Scope 注解
原型 作用域,使用 ConfigurableBeanFactory 类的 SCOPE_PROTOTYPE 常量设置了原型作用域,如下:
- 自动装配
- Java配置
- XML配置
3.4.1 使用会话和请求作用域
使用@Scope注解,将value设置成了WebApplicationContext中的SCOPE_SESSION常量(它的值是session),每个会话创建一个。
@Scope同时还有一个proxyMode属性,它被设置成了ScopedProxyMode.INTERFACES。这个属性解决了将会话或请求作 用域的bean注入到单例bean中所遇到的问题。
作用域代理:
3.4.2 在XML中声明作用域代理
3.5 运行时值注入
Spring提供了两种在运行时求值的方式:
- 属性占位符(Property placeholder)。
- Spring表达式语言(SpEL)。
3.5.1 注入外部的值
-
声明属性源并通过Spring的Environment来检索属性
-
Spring的Environment中getProperty()方法有四种重载变种:
-
解析属性占位符
需要配置PropertySourcesPlaceholderConfigurer:
3.5.2 使用Spring表达式语言进行装配
Spring 3引入了Spring表达式语言(Spring Expression Language,SpEL),它能够以一种强大和简洁的方式将值装配到bean属性和构造器参 数中,在这个过程中所使用的表达式会在运行时计算得到值。
SpEL拥有很多特性,包括:
- 使用bean的ID来引用bean;
- 调用方法和访问对象的属性;
- 对值进行算术、关系和逻辑运算;
- 正则表达式匹配;
- 集合操作。
-
SpEL样例
SpEL表达式要放到“#{ … }”之中
类的方法:
bean的属性:
系统属性:
-
表示字面值
表示浮点数、String值以及Boolean值
-
引用bean、属性和方法
-
在表达式中使用类型
T()运算符
-
SpEL运算符
-
计算正则表达式
-
计算集合
集合和数组相关
查询运算符(.?[]):
(.^[]) 和 (.$[]):查询第一个匹配项和最后一个匹配项
投影运算符(.![])
3.6 小结
Spring profile,它解决了Spring bean要跨各种部署环境的通用问题。
结合使用@Conditional注解和Spring Condition接口的实现,能够为开发人员提供一种强大和灵活的机制, 实现条件化地创建bean。
两种解决自动装配歧义性的方法:首选bean以及限定符。
Spring能够让bean以单例、原型、请求作用域或 会话作用域的方式来创建。
Spring表达式语言,它能够在运行时计算要注入到bean属性中的值。