略
- Spring profile
 - 条件化的bean声明
 - 自动装配与歧义性
 - bean的作用域
 - Spring表达式语言
 
环境与profile
随意切换开发环境,生产环境,QA环境,等而不用更改代码.例如开发环境和生产环境使用不同的数据库,使用profile可以做到快速切换.
配置profile bean
@Profile("dev")<beans ..... profile="yuda"></beans>
激活profile
web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14<!--为上下文配置-->
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>dev</param-value>
</context-param>
<!--为Servlet配置-->
<servlet>
<servlet-name>...</servlet-name>
<servlet-class>...</servlet-class>
<init-param>
<param-name>spring.profiles.default</param-name>
<param-value>dev</param-value>
</init-param>
</servlet>
测试环境
1
2
3
4
5
6
public class MainTest {
//......
}
条件化的bean
符合某个条件才会创建特定的bean
略
处理自动装配的歧义性
标示首选的bean
@Primary有多个bean符合时,使用这个注解修饰的primary="true"xml中使用
限定自动装配的bean
@Qualifier(“id名”)` ——-限定了名字
bean的作用域
默认情况下,所有的bean都是单例(singleton)的.scope属性可以修改
- 单例(Singleton)–整个应用就一个
 - 原型(Prototype)–每次注入或通过上下文获取都是一个新的实例
 - 会话(Session)–用在web应用中,会话内唯一
 - 请求(Request)–用在web应用中,请求内唯一
 
配置
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)<bean ... scope="prototype"/>
使用会话和请求作用域
略
在XML中声明作用域代理
略
运行时注入
防止硬编码,有两种方式
- 属性占位符
 - Spring表达式(SpEL)
 
注入外部的值
1  | <!--导入数据库配置的例子-->  | 
c3p0.properties
1  | jdbc.driverClass=com.mysql.jdbc.Driver  | 
使用Spring表达式语言进行装配
- 使用bean的ID来引用
 - 调用方法和访问对象的属性
 - 对值进行算术,关系和逻辑运算
 - 正则匹配
 - 集合操作
 
例子:
#{T(System).currentTimeMillis()}–系统时间获取#{systemProperties['disc.title']}–系统属性的引用#{3.1415926}–数字引用#{9.87E4}–科学计数法#{fasle}–布尔#{beanID.XXX(..)}–bean的属性或者方法#{T(java.lang.Math).PI}–甚至引用Java中的属性#{T(java.lang.Math).random()}或方法内部还可以使用算术,比较,逻辑,条件等运算和正则表达式
1
2#{admin.email matches '[a-zA-Z0-9._%+-]+@[[a-zA-Z0-9.-]+\\.com'}
//如果是邮箱地址就是true否则为false#{jukebox.songs[4]}集合
有些东西没做表述