略
- 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]}
集合
有些东西没做表述