-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
Environments and Profiles
当我们的Bean根据环境不同需要定制的时候,此时我们应该想到使用Profile。例如我们针对开发环境,测试环境,生产环境使用三套不同的DataSource,通过如下可以做到,这种做法的好处在于只需要做一次Build,选用不同的Bean 只要激活相应的Profile即可。
- Java配置方式
public class DataSourceUtil {
@Bean
@Profile("dev")
public DataSource getDevelopmentDataSource() {
return null;
}
@Bean
@Profile("test")
public DataSource getTestDataSource() {
return null;
}
@Bean
@Profile("prod")
public DataSource getProdDataSource() {
return null;
}
}- XML 配置方式
<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="prod">
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myDatabase" resource-ref="true" proxy-interface="javax.sql.DataSource" />
</beans>- 激活profile使用spring.profiles.active参数
- 作为 DispatcherServlet的初始化参数
- 作为Web应用的context参数
- 作为JNDI的节点
- 作为环境变量
- 作为Java虚拟机属性
- 测试阶段可以使用@activeprofiles 注解来设定
除了Profile我们还有一个可选项,使用Conditional
Bean的域范围
默认情况下,Spring中的Bean是单例的,我们可以通过scope来在XML或者JavaBean中设置Bean的范围。
- singleton 单例模式
- prototype 多例模式
- Session 同一个session内单例
- Request 同一个request内单例
在JavaBean的配置方式中可以使用如下方式配置
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)在XML中使用如下方式配置
<bean id="cart" class="com.myapp.ShoppingCart" scope="session">使用qualifier注解来制定特定的Bean name
假如容器中存在一个Bean的实例不止一个,这时候如果自动注入会失败,那么我们只要在@autowire注解下面,紧接着来一个@qualifier注解制定需要寻找的Bean的名字。这里你会疑问,@component可以制定Bean的名字,为什么还需要@qualifier,因为@component只能在Bean定义的时候指定Bean的名字,但是Qualifier可以在注入的地方指定名字。
使用Spring表达式语言来组装Bean
使用#{ ... }这样的方式,我们可以在Java和XML中来使用Spring的表达式语言,它可以使得我们组装Bean更加便捷。
例如:#{2 * T(java.lang.Math).PI * circle.radius} 这样的表达式我们可以Java自带类库的Math函数,并且使用我们自定义的Bean circle的属性radius和数字进行运算。
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels