高级装配
- 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的作用域
- 单例(singleton)
- 原型(prototy)
- 会话(session)
- 请求(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']查询运算符,返回符合查询条件的集合
.^[]查询运算符,返回第一个满足条件
.$[]查询运算符,返回最后一个满足条件
.![]投影运算符,去除集合中每个成员的属性投影到一个新的集合