首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

profiles特征

2013-07-16 
profiles特性介绍Bean definition profiles是3.1版本引入的新特性。背景它提供了一种机制:当客户端请求某一

profiles特性
介绍
Bean definition profiles是3.1版本引入的新特性。

背景
它提供了一种机制:当客户端请求某一bean时,容器可以根据不同的环境注册并返回不同的bean。“environment”对不同的用户也说意义也不太一样,把应用部署在性能环境中测试时,注册的就是监控信息;或者客户A和客户B部署时各自有自己的实现。最常见场景是:在开发阶段使用单独的数据源,在生产环境可能用JNDI查找相同的数据源。Bean definition profiles提供了满足这些场景的通用机制。

简单的业务案例
用junit演示了银行系统中两个账户之间的转账功能


以上配置没什么问题,在不同的环境下我们经常的解决方案是准备几份配置,开发、测试、生成环境。在部署到生产环境时使用一些方法将生成环境配置覆盖掉之前的配置;或者结合系统环境变量和包含占位符${placeholder}的<import/>语句来解决路径问题。对spring容器来讲这并非最优方案。


理解Bean definition profiles  
了解以上案例特定于环境的配置,我们将对某一环境下注册这个环境的bean definition。也可以说注册特定场景A下的bean definitions,或注册场景B下的bean definition.
   spring 3.1中,<beans/>解决了这个问题,我们将把配置文件分为3份并注意*-datasource.xml中的profile="..."配置。
src/main/com/bank/config/xml/transfer-service-config.xml

src/main/com/bank/config/xml/standalone-datasource-config.xml

修改测试代码

当我们切换到生产环境使用JNDI查找时得激活production profile.在单元测试中编程式的指定是可以的,在war包被创建或者应用准备部署时这种做法是不可行的。出于这种原因,profiles可以使用spring.profiles.active或spring.profiles.default属性被声明式的激活。这些属性可以通过系统环境变量、JVM系统属性、web.xml中servlet上下文的参数、甚至JNDI中的一个实体。例如在web.xml配置如下

为了避免混乱内置<beans profile/>必须在文件最后指定,这点spring-beans-3.1.xsd中有要求

支持@Profile
之前的案例全部换成注解风格的,首先看看之前的xml配置


自定义@Profile
public void registerBean(Class<?> annotatedClass, String name, Class<? extends Annotation>... qualifiers) {AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);AnnotationMetadata metadata = abd.getMetadata(); if (ProfileHelper.isProfileAnnotationPresent(metadata)) {if (!this.environment.acceptsProfiles(ProfileHelper.getCandidateProfiles(metadata))) { //关键部分return;}}ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);abd.setScope(scopeMetadata.getScopeName());String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);if (qualifiers != null) {for (Class<? extends Annotation> qualifier : qualifiers) {if (Primary.class.equals(qualifier)) {abd.setPrimary(true);} else if (Lazy.class.equals(qualifier)) {abd.setLazyInit(true);} else {abd.addQualifier(new AutowireCandidateQualifier(qualifier));}}}BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);}

热点排行