@PropertySource注解解释
// @since 3.1 它也只能标注在类上面 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable(PropertySources.class) public @interface PropertySource { // 该配置项PropertySource 的名字。若不指定 则用的是Resource#getDescription() // 示例:class path resource [jdbc.properties] String name() default ""; // 配置文件地址。支持${...} placeholders。也支持classpath String[] value(); // @since 4.0 默认是false就是强制要求文件必须存在的~ boolean ignoreResourceNotFound() default false; // 可写:UTF-8 String encoding() default ""; // PropertySource的创建工厂,一般性而言,不要自己实现,用默认的即可 Class<? extends PropertySourceFactory> factory() default PropertySourceFactory.class; }
至于上面的言论:可不可以导入非properties文件呢?这里答案显然是否定的,只能是key-value形式的属性文件形式。
(显然yaml也是默认不支持的,除非你自己去实现,Spring是提供了这种扩展开口的)
总结
我个人认为这两个注解还是比较有用的,特别是@PropertySource注解在我们分模块开发时候有非常大的作用,它能让你的代码更清晰,配置更隔离,减少出错
说到配置我啰嗦一句:其实任何事都一样,隔离性、自治性都是需要保证的,这样后续才好维护。比如我看到非常多的小伙伴配置@Bean的时候,根本不考虑到底配置在哪个@Confiuration配置类下呢?随便乱扔,虽然可能能正常work,但是若真出了问题,可以说将是灾难性的,会付出很大的代价去查找~~~ 希望小伙伴们能保持一个良好的分层、隔离的编码习惯
我对它体会最深处是我在之前某家公司的时候,对臃肿的的配置文件的重构。当时我还是一个刚好1年经验的java新生,完全不懂的原理,但我知道这么做很好,哈哈~~~
还有就是Spring暴露出来给我们使用的API,我认为都是很有必要去学习、了解的。虽然它有很多也是重复发明轮子,但是人家有这个能力并且你可以很方便的使用它(至少比JavaEE方便),因此熟悉后,这方面的开发效率会大大的提升,最终受益者也是你自己个
小知识点:@Order注解对@Bean、以及@Service都是不能生效的(控制不了Bean的顺序),若你想在Spring环境下控制Filter的顺序,请使用其它方式(SpringBoot可以很友好的控制Servlet三大组件的顺序,这个以后再说~)
附
使用Properties读取xml文件
其实这也是我的一个意外收获。在看SpringBoot源码的时候有这么一个类:
public class PropertiesPropertySourceLoader implements PropertySourceLoader { @Override public String[] getFileExtensions() { return new String[] { "properties", "xml" }; } }
发现它不仅加载properties
,也加载xml
文件。可见Spring团队对jdk底层是非常非常熟悉的。
勾起兴趣后,mark下这个:使用Properties
也能读取xml文件。
Demo如下:
xml文件内容(请注意:是有DTD要求的,并且可以看到是sun官方的DTD):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <!-- properties标签下只有这comment和entry两个值 --> <properties> <comment>系统配置</comment> <entry key="logo.location"><![CDATA[/image/logo/]]></entry> <entry key="mail.host"><![CDATA[webmaster@zlex.org]]></entry> <entry key="site.name"><![CDATA[zlex中文网站]]></entry> <entry key="welcome"><![CDATA[欢迎您,{0}!]]></entry> </properties>
读取:
public static void main(String[] args) throws IOException { ClassPathResource resource = new ClassPathResource("my.xml"); Properties properties = new Properties(); properties.loadFromXML(resource.getInputStream()); System.out.println(properties); //{logo.location=/image/logo/, site.name=zlex中文网站, welcome=欢迎您,{0}!, mail.host=webmaster@zlex.org} }
可以正常读取到内容。此xml内容同下面properties文件。xml没有中文乱码问题,这是它一大优秀的地方
#系统配置 logo.location=/image/logo/ mail.host=webmaster@zlex.org site.name=zlex中文网站 welcome=欢迎您,{0}!
备注:loadFromXML()方法JDK5提供。平时我们使用中还是推荐使用properties文件,但这个可以炫技用,哈哈
关于Properties的读取加载,推荐工具类:org.springframework.core.io.support.PropertiesLoaderUtils,两种格式都能读
关于Properties文件的使用小细节
logo.location=/image/logo/ mail.host=webmaster@zlex.org site.name=zlex中文网站 welcome=欢迎您,{0}!
读取程序如下;
public static void main(String[] args) throws IOException { ClassPathResource resource = new ClassPathResource("my.properties"); Properties properties = new Properties(); InputStream inputStream = resource.getInputStream(); properties.load(inputStream); properties.forEach((k, v) -> { System.out.println(k + "=" + v); }); }
发现是有中文乱码的。
mail.host=webmaster@zlex.org welcome=欢迎您,{0}ï¼ site.name=zlexä¸æ–‡ç½‘ç«™ logo.location=/image/logo/
1、解决中文乱码问题: 使用Reader
读取
public static void main(String[] args) throws IOException { ClassPathResource resource = new ClassPathResource("my.properties"); Properties properties = new Properties(); InputStream inputStream = resource.getInputStream(); //properties.load(inputStream); // 解决中文乱码问题 使用Reader (若直接使用inputStream,请把中文使用native2ascii.exe转换~~~) Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); properties.load(reader); properties.forEach((k, v) -> { System.out.println(k + "=" + v); }); }
这样中文就没有乱码了。(请保证你的文件编码是utf-8)
2、Properties
文件中可议使用:
吗?
形如下面,使用:配置。
logo.location:/image/logo/ mail.host:webmaster@zlex.org site.name:zlex中文网站 welcome:欢迎您,{0}!
最终结果:也是ok的
3、=/:
中间可以有N个空格吗?
形如这样:
logo.location: /image/logo/ mail.host :webmaster@zlex.org site.name : zlex中文网站 welcome:欢迎您,{0}!
发现打印的结果一模一样。结论:中间
有N个空格,都是无所谓的
4、头、尾有空格呢?
logo.location:/image/logo/ mail.host:webmaster@zlex.org site.name:zlex中文网站 welcome:欢迎您,{0}!
/image/logo/后面有N个空格~~~
输出。结论为:头部N个空格都没关系,但是,但是,但是尾部的空格是会当作值的一部分的。这个特别特备引起注意,很多人在这里踩过坑,因为这个错误还非常的不好找~~~
以上为关于properties配置文件的一些使用细节,希望能帮助到大家。虽然遵循规范是最好,但是若别人使用了一些非工整格式,比如使用:,比如多空格啥的,你要知道咋回事~~这就是高手