Skip to content

Spring组装Bean高阶用法 #18

@superstonne

Description

@superstonne

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参数
  1. 作为 DispatcherServlet的初始化参数
  2. 作为Web应用的context参数
  3. 作为JNDI的节点
  4. 作为环境变量
  5. 作为Java虚拟机属性
  6. 测试阶段可以使用@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和数字进行运算。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions