已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Spring3.1提供了新的属性管理API,而且功能非常强大且很完善,对于一些属性配置信息都应该使用新的API来管理。虽然现在Spring已经到4版本了,这篇文章来的晚点。新的属性管理APIPropertySource:属性源,key-value属性对抽象,比如用于配置数据PropertyResolver:属性解析器,用于解析相应key的valueEnvironment:环境,本身是一个PropertyResolver,但是提供了Profile特性,即可以根据环境得到相应数据(即激活不同的Profile,可以得到不同的属性数据,比如用于多环境场景的配置(正式机、测试机、开发机DataSource配置)Profile:剖面,只有激活的剖面的组件/配置才会注册到Spring容器,类似于maven中profile也就是说,新的API主要从配置属性、解析属性、不同环境解析不同的属性、激活哪些组件/配置进行注册这几个方面进行了重新设计,使得API的目的更加清晰,而且功能更加强大。PropertySourcekey-value对,API如下所示:Java代码1. publicStringgetName()/属性源的名字2. publicTgetSource()/属性源(比如来自Map,那就是一个Map对象)3. publicbooleancontainsProperty(Stringname)/是否包含某个属性4. publicabstractObjectgetProperty(Stringname)/得到属性名对应的属性值非常类似于Map;用例如下:Java代码1. Test2. publicvoidtest()throwsIOException3. Mapmap=newHashMap();4. map.put(encoding,gbk);5. PropertySourcepropertySource1=newMapPropertySource(map,map);6. System.out.println(propertySource1.getProperty(encoding);7. 8. ResourcePropertySourcepropertySource2=newResourcePropertySource(resource,classpath:perties);/name,location9. System.out.println(propertySource2.getProperty(encoding);10. MapPropertySource的属性来自于一个Map,而ResourcePropertySource的属性来自于一个properties文件,另外还有如PropertiesPropertySource,其属性来自Properties,ServletContextPropertySource的属性来自ServletContext上下文初始化参数等等,大家可以查找PropertySource的继承层次查找相应实现。Java代码1. Test2. publicvoidtest2()throwsIOException3. /省略propertySource1/propertySource24. CompositePropertySourcecompositePropertySource=newCompositePropertySource(composite);5. compositePropertySource.addPropertySource(propertySource1);6. compositePropertySource.addPropertySource(propertySource2);7. System.out.println(compositePropertySource.getProperty(encoding);8. CompositePropertySource提供了组合PropertySource的功能,查找顺序就是注册顺序。另外还有一个PropertySources,从名字可以看出其包含多个PropertySource:Java代码1. publicinterfacePropertySourcesextendsIterablePropertySource2. booleancontains(Stringname);/是否包含某个name的PropertySource3. PropertySourceget(Stringname);/根据name找到PropertySource4. 示例如下:Java代码1. Test2. publicvoidtest3()throwsIOException3. /省略propertySource1/propertySource24. MutablePropertySourcespropertySources=newMutablePropertySources();5. propertySources.addFirst(propertySource1);6. propertySources.addLast(propertySource2);7. System.out.println(propertySources.get(resource).getProperty(encoding);8. 9. for(PropertySourcepropertySource:propertySources)10. System.out.println(propertySource.getProperty(encoding);11. 12. 默认提供了一个MutablePropertySources实现,我们可以调用addFirst添加到列表的开头,addLast添加到末尾,另外可以通过addBefore(propertySourceName,propertySource)或addAfter(propertySourceName,propertySource)添加到某个propertySource前面/后面;最后大家可以通过iterator迭代它,然后按照顺序获取属性。到目前我们已经有属性了,接下来需要更好的API来解析属性了。PropertyResolver属性解析器,用来根据名字解析其值等。API如下所示:Java代码1. publicinterfacePropertyResolver2. 3. /是否包含某个属性4. booleancontainsProperty(Stringkey);5. 6. /获取属性值如果找不到返回null7. StringgetProperty(Stringkey);8. 9. /获取属性值,如果找不到返回默认值10. StringgetProperty(Stringkey,StringdefaultValue);11. 12. /获取指定类型的属性值,找不到返回null13. TgetProperty(Stringkey,ClasstargetType);14. 15. /获取指定类型的属性值,找不到返回默认值16. TgetProperty(Stringkey,ClasstargetType,TdefaultValue);17. 18. /获取属性值为某个Class类型,找不到返回null,如果类型不兼容将抛出ConversionException19. ClassgetPropertyAsClass(Stringkey,ClasstargetType);20. 21. /获取属性值,找不到抛出异常IllegalStateException22. StringgetRequiredProperty(Stringkey)throwsIllegalStateException;23. 24. /获取指定类型的属性值,找不到抛出异常IllegalStateException25. TgetRequiredProperty(Stringkey,ClasstargetType)throwsIllegalStateException;26. 27. /替换文本中的占位符($key)到属性值,找不到不解析28. StringresolvePlaceholders(Stringtext);29. 30. /替换文本中的占位符($key)到属性值,找不到抛出异常IllegalArgumentException31. StringresolveRequiredPlaceholders(Stringtext)throwsIllegalArgumentException;32. 33. 从API上我们已经看出解析器的作用了,具体功能就不要罗嗦了。示例如下:Java代码1. Test2. publicvoidtest()throwsException3. /省略propertySources4. 5. PropertyResolverpropertyResolver=newPropertySourcesPropertyResolver(propertySources);6. 7. System.out.println(propertyResolver.getProperty(encoding);8. System.out.println(propertyResolver.getProperty(no,default);9. System.out.println(propertyResolver.resolvePlaceholders(mustbeencoding$encoding);/输出mustbeencodinggbk10. 从如上示例可以看出其非常简单。另外Environment也继承了PropertyResolver。Environment环境,比如JDK环境,Servlet环境,Spring环境等等;每个环境都有自己的配置数据,如System.getProperties()、System.getenv()等可以拿到JDK环境数据;ServletContext.getInitParameter()可以拿到Servlet环境配置数据等等;也就是说Spring抽象了一个Environment来表示环境配置。Java代码1. publicinterfaceEnvironmentextendsPropertyResolver/继承PropertyResolver2. 3. /得到当前明确激活的剖面4. StringgetActiveProfiles();5. 6. /得到默认激活的剖面,而不是明确设置激活的7. StringgetDefaultProfiles();8. 9. /是否接受某些剖面10. booleanacceptsProfiles(Sfiles);11. 12. 从API上可以看出,除了可以解析相应的属性信息外,还提供了剖面相关的API,目的是: 可以根据剖面有选择的进行注册组件/配置。比如对于不同的环境注册不同的组件/配置(正式机、测试机、开发机等的数据源配置)。它的主要几个实现如下所示:MockEnvironment:模拟的环境,用于测试时使用;StandardEnvironment:标准环境,普通Java应用时使用,会自动注册System.getProperties() 和 System.getenv()到环境;StandardServletEnvironment:标准Servlet环境,其继承了StandardEnvironment,Web应用时使用,除了StandardEnvironment外,会自动注册ServletConfig(DispatcherServlet)、ServletContext及JNDI实例到环境;除了这些,我们也可以根据需求定义自己的Environment。示例如下:Java代码1. Test2. publicvoidtest()3. /会自动注册System.getProperties()和System.getenv()4. Environmentenvironment=newStandardEnvironment();5. System.out.println(environment.getProperty(file.encoding);6. 其默认有两个属性:systemProperties(System.getProperties())和systemEnvironment(System.getenv())。在web环境中首先在web.xml中配置:Java代码1. 2. myConfig3. hello4. 5. 6. 7. spring8. org.springframework.web.servlet.DispatcherServlet9. 10. contextConfigLocation11. classpath:spring-mvc.xml12. 13. 使用StandardServletEnvironment加载时,默认除了StandardEnvironment的两个属性外,还有另外三个属性:servletContextInitParams(ServletContext)、servletConfigInitParams(ServletConfig)、jndiProperties(JNDI)。然后在程序中通过如下代码注入Environment:Java代码1. Autowired2. Environmentenv;另外也可以直接使用ApplicationContext.getEnvironment()获取;接着就可以用如下代码获取配置:Java代码1. System.out.println(env.getProperty(myConfig);2. System.out.println(env.getProperty(contextConfigLocation);另外我们在运行应用时可以通过-D传入系统参数(System.getProperty()),如java -Ddata=123 com.sishuok.spring3.EnvironmentTest,那么我们可以通过environment.getProperty(data) 获取到。如果我们拿到的上下文是ConfigurableApplicationContext类型,那么可以:ctx.getEnvironment().getPropertySources();然后通过PropertySources再添加自定义的PropertySource。Profileprofile,剖面,大体意思是:我们程序可能从某几个剖面来执行应用,比如正式机环境、测试机环境、开发机环境等,每个剖面的配置可能不一样(比如开发机可能使用本地的数据库测试,正式机使用正式机的数据库测试)等;因此呢,就需要根据不同的环境选择不同的配置;如果用过maven,maven中就有profile的概念。profile有两种:默认的:通过“files.default”属性获取,如果没有配置默认值是“default”明确激活的:通过“files.active”获取查找顺序是:先进性明确激活的匹配,如果没有指定明确激活的(即集合为空)就找默认的;配置属性值从Environment读取。API请参考Environment部分。设置profile属性,常见的有三种方式:一、启动Java应用时,通过-D传入系统参数Java代码1. -Dfiles.active=dev二、如果是web环境,可以通过上下文初始化参数设置Java代码1. 2. files.active3. dev4. 三 、通过自定义添加PropertySourceJava代码1. Mapmap=newHashMap();2. map.put(files.active,dev);3. MapPropertySourcepropertySource=newMapPropertySource(map,map);4. env.getPropertySources().addFirst(propertySource);四、直接设置ProfileJava代码1. env.setActiveProfiles(dev,test);以上方式都可以设置多个profile,多个之间通过如逗号/分号等分隔。接着我们就可以通过如下API判断是否激活相应的Profile了:Java代码1. if(env.acceptsProfiles(dev,test)2. /dosomething3. 它们之间是或的关系;即找到一个即可;如果有人想不匹配某个profile执行某些事情,可以通过如!dev 即没有dev激活时返回true。当然这种方式还不是太友好,还需要我们手工编程使用,稍候会介绍如何更好的使用它们。$key占位符属性替换器,配置如下:Java代码1. location:表示属性文件位置,多个之间通过如逗号/分号等分隔;file-encoding:文件编码;ignore-resource-not-found:如果属性文件找不到,是否忽略,默认false,即不忽略,找不到将抛出异常ignore-unresolvable:是否忽略解析不到的属性,如果不忽略,找不到将抛出异常properties-ref:本地java.util.Properties配置local-override:是否本地覆盖模式,即如果true,那么properties-ref的属性将覆盖location加载的属性system-properties-mode:系统属性模式,ENVIRONMENT(默认),NEVER,OVERRIDE ENVIRONMENT:将使用Spring 3.1提供的PropertySourcesPlaceholderConfigurer,其他情况使用Spring 3.1之前的PropertyPlaceholderConfigurer 如果是本地覆盖模式:那么查找顺序是:properties-ref、location、environment,否则正好反过来; OVERRIDE:PropertyPlaceholderConfigurer使用,因为在spring 3.1之前版本是没有Enviroment的,所以OVERRIDE是spring 3.1之前版本的Environment 如果是本地覆盖模式:那么查找顺序是:properties-ref、location、System.getProperty(),System.getenv(),否则正好反过来; NEVER:只查找properties-ref、location;order:当配置多个时的查找顺序,关于顺序问题请参考:/topic/1131688具体使用请参考如下文件中的如dataSource:/zhangkaitao/es/blob/master/web/src/main/resources/spring-config.xmlPropertySource()Spring 3.1提供的Java Config方式的注解,其属性会自动注册到相应的Environment;如:Java代码1. Configuration2. PropertySource(value=classpath:perties,ignoreResourceNotFound=false)3. publicclassAppConfig4. 接着就可以使用env.getProperty(encoding)得到相应的属性值。另外如果想进行Bean属性的占位符替换,需要注册PropertySourcesPlaceholderConfigurer:Java代码1. Bean2. publicPropertySourcesPlaceholderConfigurerpropertySourcesPlaceholderConfigurer()3. returnnewPropertySourcesPlaceholderConfigurer();4. 如上配置等价于XML中的配置。如果想导入多个,在Java8之前需要使用PropertySources注册多个PropertySource()。此处要注意:使用不会自动把属性注册到Environment中,而PropertySource()会;且在XML配置中并没有PropertySource()等价的XML命名空间配置,如果需要,可以自己写一个。占位符替换使用Environment属性替换,如: PropertySource(value = classpath:$env/perties)ComponentScan(basePackages = com.sishuok.$package)ImportResource(value = classpath:$env/cfg.xml)Value($env) new ClassPathXmlApplicationContext(classpath:$env/cfg.xml)使用PropertySourcesPlaceholderConfigurer / PropertyPlaceholderConfigurer进性Bean属性替换,如:Java代码1. 2. 3. 4. 5. 6. SpEL表达式:请参考【第五章】Spring表达式语言 之 5.4在Bean定义中使用EL跟我学spring3通过如上方式可以实现不同的环境有不同的属性配置,但是如果我们想不同的环境加载不同的Bean呢,比如测试机/正式机环境可能使用远程方式访问某些API,而开发机环
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年牡丹江辅警招聘考试真题含答案详解(夺分金卷)
- 2025年潮州辅警招聘考试题库含答案详解(研优卷)
- 2025年连云港辅警协警招聘考试备考题库及答案详解(新)
- 2025年璧山县辅警协警招聘考试真题及完整答案详解1套
- 2025年雅安辅警招聘考试真题及参考答案详解
- 《物流项目管理》期末试卷A答案
- (完整版)分数乘除法单元测试题
- 2025年锦州辅警协警招聘考试真题附答案详解(完整版)
- 2025年石嘴山辅警招聘考试题库及完整答案详解一套
- 2025年锡林郭勒盟辅警招聘考试真题完整参考答案详解
- 设备管理基础知识
- 办公室会务培训课件
- 公园养护策划方案
- 美术作品与客观世界 课件-2022-2023学年高中美术湘美版(2019)美术鉴赏
- 第2章-考古学研究方法与步骤
- 中国石油大学(北京)工业流变学考试要点
- 2023学年完整公开课版《共圆中国梦》
- (word完整版)CAD机械制图练习图
- 布朗芬布伦纳生态心理学课件
- 全国各大银行及支行联行号查询
- 药物化学考试模拟题及参考答案
评论
0/150
提交评论