Skip to content

Spring组装Bean高阶用法 #18

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和数字进行运算。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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