高级装配

  • Spring profile

前提:profile被激活(active)

Spring3.1只能在类上用,3.2可以在Config类中建不同环境下的bean

一、设置profile

Java方法

@Configuration
@Profile("dev")
public class DevelopmentProfileConfig{
    return new EmbeddedDataBaseBuilder()
    .setType(EmbeddedDataBase.H2)
    .addScript("classpath:schema.sql")
    .addScript("classpath:test-data.sql")
    .build();
}

XML方法

<beans xnlns="http://ww.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context"
      profile="dev">

      <beans profile="dev">
        <jdbc:embedded-database id="dataSource">
          <jdbc:script location="classpath:schema.sql" />
          <jdbc:script location="classpath:test-data.sql" />
          </jdbc:embedded-database>
      </beans>

      <beans profile="qa">
      <!--QA的DataSource-->
      </beans>

      <beans profile="prod">
      <!--生产环境的DataSource-->
      </beans>

</beans>

二、激活profile

例如在web.xml中

<context-param>
    <param-name>spring.profiles.default</param-name>
    <param-value>dev</param-value>
</context-param>
@ActiveProfiles("dev")

三、条件创建Bean(Spring4新特性)

@Conditional(xxxCondition.class)
//这个类需要实现Condition接口,返回true则创建,否则不创建

条件限定

  • @Primary
  • @Qualifer(xxx)
  • 自定义注解

四、Bean的作用域

  1. 单例(singleton)
  2. 原型(prototy)
  3. 会话(session)
  4. 请求(request)
JAVA设置方法@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)或者@Scope("prototype")
XML是scope属性,代理是<aop:scoped-proxy>,若代理接口还要设置proxy-target-class="false"
以及也要添加AOP的命名空间

会话层(Session)作用域

@Scope(
    value=WebApplicationContext.SCOPE_SESSION,
    proxyMode=ScopeProxyMode.INTERFACES)

若对类代理则需要改为proxyMode=ScopeProxyMode.TARGET_CLASS,但最好还是接口
这个做法是不传直接的引用给其他Bean,因为作用域可能不同,而是传一个代理,当那个Bean调用依赖的Bean的方法时,会由代理转到实际去执行

五、运行时注入

@PropertySource属性源
后再env.getProperty()

占位符

${...}为占位符,有点像html
@Value(${disc.title}) String title;
this.t = title;

SpEL 很强,后面要再看

格式#{...}
如#{T(System).currentTimeMillis()}
T()说明将其视为java.lang.System中的对应类型
xxx?.的?是为了进行方法处理时避免空指针异常
.?['param']查询运算符,返回符合查询条件的集合
.^[]查询运算符,返回第一个满足条件
.$[]查询运算符,返回最后一个满足条件
.![]投影运算符,去除集合中每个成员的属性投影到一个新的集合
KAI Java, Spring