和maven profile类似,Spring bean definition profile 有两个组件:声明和激活。

【栗子:开发测试环境使用HyperSQL 生产环境使用JNDI上下文根据配置查找数据库源】

<beans>

  <beans profile="development,qa">

    <jdbc:embedded-database id="dataSource" type="HSQL">

      <jdbc:script location="classpath:com/wrox/config/sql/schema.sql"/>

      <jdbc:script location="classpath:com/wrox/config/sql/test-data.sql"/>

    </jdbc:embedded-database>

  </beans>

  <beans profile="production">

    <context:property-placeholder location="file:/settings.properties" />

    <jee:jndi-lookup id="dataSource" jndi-name="java:/comp/env/${production.dsn}" />

  </beans>

</beans>

【栗子:@Configuration版本】

interface DataConfiguration{

  DataSource dataSource();

}

@Configuration

@Import({DevQaDataConfiguration.class,ProductionDataConfiguration.class})

@ComponentScan(basePackages = "com.wrox.site",excludeFilters = @ComponentScan.Filter(Controller.class))

public class RootContextConfiguration{}

@Configuration

@Profile({"development","qa"})

public class DevQaDataConfiguration implements DataConfiguration{

  @Override

  @Bean

  public DataSource dataSource(){

    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.HSQL)

                      .addScript("classpath:com/wrox/config/sql/schema.sql")

                      .addScript("classpath:com/wrox/config/sql/test-data.sql")

                      .build();

  }

}

@Configuration

@Profile("production")

@PropertySource("file:settings.properties")

public class ProfuctionDataConfiguration implements DataConfiguration{

  @Value("production.dsr")

  String dataSourceName;

  @Override

  @Bean

  public DataSource dataSource(){

    return new JndiDataSourceLookup().getDataSource("java:/comp/env/"+this.dataSourceName);

  }

}

【激活profile】

1.应用程序级别激活

<context-param>

  <param-name>spring.profiles.active</param-name>

  <param-value>development</param-value>

</context-param>

2.Servlet级别激活

<servlet>

  <init-param>

    <param-name>spring.profiles.active</param-name>

    <param-value>development</param-value>

  </init-param>

3.运行时命令行参数激活  -Dspring.profiles.active=development

4.编程式激活 configurableEnvironment.setActiveProfiles("development");   将影响倒子应用上下文。

【profile细节】@Profile和@Component类似可以用作元数据注解,我们自己定义一个@Development注解。

@Documented

@Retention(value={ElementType.TYPE,ElementType.METHOD})

@Profile("development")

public @interface Development{}

【反模式和安全问题】当我们使用bean definition profile 解决问题要问自己。

1.有没有更简单的办法。如果多个profile创建的都是相同bean但使用的设置不同,这其实可以通过@PropertySource和properties文件完成。

2.profile中bean有哪些类型。大多数情况下,两个不同的profile具有的bean应该非常接近的,QA一搬和Prod一致,DEV和QA有一定区别。

3.安全意义?禁止去使用profile控制应用程序安全,因为终端用户可能会启用或禁用JVM命令行属性的方式   激活或冻结 profile,这样就绕过安全了。

一种比较傻叉的做法,dev禁用产品许可,qa和prod激活产品许可,聪明的用户只要将prod和qa切换回dev就能免费使用商业产品。

Spring 快速开始 Profile 和 Bean的更多相关文章

  1. Spring实战(四)Spring高级装配中的bean profile

    profile的原意为轮廓.剖面等,软件开发中可以译为“配置”. 在3.1版本中,Spring引入了bean profile的功能.要使用profile,首先要将所有不同的bean定义整理到一个或多个 ...

  2. Spring Boot 之 Profile --快速搞定多环境使用与切换

    Spring Profile是Spring3引入的概念,主要用在项目多环境运行的情况下,通过激活方式实现多环境切换,省去多环境切换时配置参数和文件的修改,并且Spring profile提供了多种激活 ...

  3. spring快速入门(三)

    一.在spring快速入门(二)的基础上,原先我们是采用构造方法完成对象的注入.这里还有其他的方法可以完成注入,通过set方法来完成. 修改UserActionImpl package com.mur ...

  4. spring快速入门(二)

    一.在spring快速入门(一)的基础上,我们来了解spring是如何解决对象的创建以及对象之间的依赖关系的问题 (比如client中依赖UserAction的具体实现,UserActionImpl中 ...

  5. Spring实战3:装配bean的进阶知识

    主要内容: Environments and profiles Conditional bean declaration 处理自动装配的歧义 bean的作用域 The Spring Expressio ...

  6. spring注解之@profile

    spring中@profile与maven中的profile很相似,通过配置来改变参数. 例如在开发环境与生产环境使用不同的参数,可以配置两套配置文件,通过@profile来激活需要的环境,但维护两套 ...

  7. Spring Boot 之 Profile 使用

    Spring Boot 之 Profile 使用 一个应用为了在不同的环境下工作,常常会有不同的配置,代码逻辑处理.Spring Boot 对此提供了简便的支持. 关键词: @Profile.spri ...

  8. Spring 环境与profile(一)——超简用例

    什么是profile,为什么需要profile? 在开发时,不同环境(开发.联调.预发.正式等)所需的配置不同导致,如果每改变一个环境就更改配置不但麻烦(修改代码.重新构建)而且容易出错.Spring ...

  9. Java基础-SSM之Spring快速入门篇

    Java基础-SSM之Spring快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java ...

随机推荐

  1. [WC2011]最大XOR和路径(贪心+线性基)

    题目大意:给一张无向图,求一条1-n的路径,是路径边权的异或和最小. 题解 这道题的思路很妙,首先我们可以随便找出一条从1到n的路径来,然后我们可以选一些环. 其实不管这个环和这条路径有怎样的关系,我 ...

  2. 单片机pwm控制基本原理详解

    前言 PWM是Pulse Width Modulation的缩写,它的中文名字是脉冲宽度调制,一种说法是它利用微处理器的数字输出来对模拟电路进行控制的一种有效的技术,其实就是使用数字信号达到一个模拟信 ...

  3. Vagrant 中配置局域网端口

    1. 在自己的电脑中想使用Vagrant在局域网中安装centos,并将其ip释放到局域网中提供给自己的机器访问,这种操作需要在VagrantFile中加入如下配置 config.vm.network ...

  4. String:字符串常量池

    String:字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池: 字 ...

  5. Vue--的src文件

    1.assest: 图片等等...... 2.components: 组件 3.App.vue: 根组件,三个部分:模板.行为(处理逻辑).样式: 模板: 只能有一个根标签: <HelloWor ...

  6. 【洛谷P4318】完全平方数

    题目大意:求第 K 个无平方因子数. 题解:第 k 小/大的问题一般采用二分的方式,通过判定从 1 到当前数中满足某一条件的数有多少个来进行对上下边界的转移. 考虑莫比乌斯函数的定义,根据函数值将整数 ...

  7. 基于Senparc.CO2NET 缓存策略扩展的缓存使用方法

    没啥说的,直接上代码 1.缓存  CacheFactory 实现: //---------------------------------------------------------------- ...

  8. 第二篇-Django建立数据库各表之间的联系(中)

    上篇中已经建立了两个table,Book和Publish.这篇介绍如何用python增删改查数据库中的数据. 在views.py中创建一个index函数 from django.shortcuts i ...

  9. Linux下学习摄像头使用

    刚接触Linux硬件驱动有关的项目,配置摄像头经历的一些操作 (这篇文章是刚接触Linux下V4L时作为记录记下的,感觉只有几个命令还有参考作用) 一 确定摄像头种类 确定是否符合UVC标准协议,一般 ...

  10. JS学习笔记Day7

    一.ES5扩展方法 1.严格模式"use strict" 1)必须加在作用域的开头 2.数组扩展方法 1)indexOf(元素,从哪个下标开始查找) 作用:在数组中查找指定的元素第 ...