Spring 快速开始 Profile 和 Bean
和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的更多相关文章
- Spring实战(四)Spring高级装配中的bean profile
profile的原意为轮廓.剖面等,软件开发中可以译为“配置”. 在3.1版本中,Spring引入了bean profile的功能.要使用profile,首先要将所有不同的bean定义整理到一个或多个 ...
- Spring Boot 之 Profile --快速搞定多环境使用与切换
Spring Profile是Spring3引入的概念,主要用在项目多环境运行的情况下,通过激活方式实现多环境切换,省去多环境切换时配置参数和文件的修改,并且Spring profile提供了多种激活 ...
- spring快速入门(三)
一.在spring快速入门(二)的基础上,原先我们是采用构造方法完成对象的注入.这里还有其他的方法可以完成注入,通过set方法来完成. 修改UserActionImpl package com.mur ...
- spring快速入门(二)
一.在spring快速入门(一)的基础上,我们来了解spring是如何解决对象的创建以及对象之间的依赖关系的问题 (比如client中依赖UserAction的具体实现,UserActionImpl中 ...
- Spring实战3:装配bean的进阶知识
主要内容: Environments and profiles Conditional bean declaration 处理自动装配的歧义 bean的作用域 The Spring Expressio ...
- spring注解之@profile
spring中@profile与maven中的profile很相似,通过配置来改变参数. 例如在开发环境与生产环境使用不同的参数,可以配置两套配置文件,通过@profile来激活需要的环境,但维护两套 ...
- Spring Boot 之 Profile 使用
Spring Boot 之 Profile 使用 一个应用为了在不同的环境下工作,常常会有不同的配置,代码逻辑处理.Spring Boot 对此提供了简便的支持. 关键词: @Profile.spri ...
- Spring 环境与profile(一)——超简用例
什么是profile,为什么需要profile? 在开发时,不同环境(开发.联调.预发.正式等)所需的配置不同导致,如果每改变一个环境就更改配置不但麻烦(修改代码.重新构建)而且容易出错.Spring ...
- Java基础-SSM之Spring快速入门篇
Java基础-SSM之Spring快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java ...
随机推荐
- [NOI2016]优秀的拆分&&BZOJ2119股市的预测
[NOI2016]优秀的拆分 https://www.lydsy.com/JudgeOnline/problem.php?id=4650 题解 如果我们能够统计出一个数组a,一个数组b,a[i]表示以 ...
- 洛谷P4553 80人环游世界
题目描述 https://www.luogu.org/problemnew/show/P4553 题解 思路比较显然,把图建出来,一个国家拆成两个点,中间设置上下界,然后跑费用流. 我把源那边的流量也 ...
- [NOI2010]超级钢琴(RMQ+堆)
小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负 ...
- Python反转过程学习
Pyhon的反转过程的学习: #coding:utf-8 #反转过程.py """ def add(x,y): return x+y params=(1,2) add(* ...
- 编写高质量代码:改善Java程序的151个建议 --[52~64]
编写高质量代码:改善Java程序的151个建议 --[52~64] 推荐使用String直接量赋值 Java为了避免在一个系统中大量产生String对象(为什么会大量产生,因为String字符串是程序 ...
- 百度地图API,展示地图和添加控件
1.申请百度账号和AK 点我申请 2.准备页面 根据HTML标准,每一份HTML文档都应该声明正确的文档类型,我们建议您使用最新的符合HTML5规范的文档声明: <!DOCTYPE html&g ...
- 【css技能提升】完美的 Sticky Footer 布局
在总结之前所做的项目时,遇到过下面这种情况. 在主体内容不足够多或者未完全加载出来之前,就会导致出现左边的这种情况,原因是因为没有足够的垂直空间使得页脚推到浏览器窗口最底部.但是,我们期望的效果是页脚 ...
- Idea + Git + GitLab 使用
首先去下载Git,https://git-scm.com/ 安装好之后,打开Idea--->Settings,,,设置Git路径,然后点击Test按钮 然后是GitLab,一般企业内部开发都会有 ...
- poj 2229 Sumsets(记录结果再利用的DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 将一个数N分解为2的幂之和共有几种分法? 题解: 定义dp[ i ]为数 i 的 ...
- 阿里面试:MYSQL的引擎区别
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...