Spring-高级装配

  • Spring profile
  • 条件化的bean声明
  • 自动装配与歧义性
  • bean的作用域
  • Spring表达式语言

环境与profile

随意切换开发环境,生产环境,QA环境,等而不用更改代码.例如开发环境和生产环境使用不同的数据库,使用profile可以做到快速切换.

配置profile bean

  1. @Profile("dev")
  2. <beans ..... profile="yuda"></beans>

激活profile

  1. 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>

  2. 测试环境

    1
    2
    3
    4
    5
    6
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath*:Spring-ioc.xml")
    @ActiveProfiles("dev")
    public class MainTest {
    //......
    }

条件化的bean

符合某个条件才会创建特定的bean

处理自动装配的歧义性

标示首选的bean

  1. @Primary 有多个bean符合时,使用这个注解修饰的
  2. primary="true" xml中使用

限定自动装配的bean

@Qualifier(“id名”)` ——-限定了名字

bean的作用域

默认情况下,所有的bean都是单例(singleton)的.scope属性可以修改

  1. 单例(Singleton)–整个应用就一个
  2. 原型(Prototype)–每次注入或通过上下文获取都是一个新的实例
  3. 会话(Session)–用在web应用中,会话内唯一
  4. 请求(Request)–用在web应用中,请求内唯一

配置

  1. @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
  2. <bean ... scope="prototype"/>

使用会话和请求作用域

在XML中声明作用域代理

运行时注入

防止硬编码,有两种方式

  1. 属性占位符
  2. Spring表达式(SpEL)

注入外部的值

1
2
3
4
5
6
7
8
<!--导入数据库配置的例子-->
<context:property-placeholder location="classpath*:c3p0.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

c3p0.properties

1
2
3
4
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/test?useSSL=false
jdbc.username=root
jdbc.password=123456

使用Spring表达式语言进行装配

  • 使用bean的ID来引用
  • 调用方法和访问对象的属性
  • 对值进行算术,关系和逻辑运算
  • 正则匹配
  • 集合操作

例子:

  1. #{T(System).currentTimeMillis()} –系统时间获取

  2. #{systemProperties['disc.title']} –系统属性的引用

  3. #{3.1415926} –数字引用

  4. #{9.87E4} –科学计数法

  5. #{fasle} –布尔

  6. #{beanID.XXX(..)} –bean的属性或者方法

  7. #{T(java.lang.Math).PI} –甚至引用Java中的属性

  8. #{T(java.lang.Math).random()} 或方法

  9. 内部还可以使用算术,比较,逻辑,条件等运算和正则表达式

    1
    2
    #{admin.email matches '[a-zA-Z0-9._%+-]+@[[a-zA-Z0-9.-]+\\.com'} 
    //如果是邮箱地址就是true否则为false
  10. #{jukebox.songs[4]} 集合

有些东西没做表述