【小家Spring】Spring中@PropertySource和@ImportResource的区别,以及各自的实现原理解析(下)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【小家Spring】Spring中@PropertySource和@ImportResource的区别,以及各自的实现原理解析(下)

@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配置文件的一些使用细节,希望能帮助到大家。虽然遵循规范是最好,但是若别人使用了一些非工整格式,比如使用:,比如多空格啥的,你要知道咋回事~~这就是高手

相关文章
|
20天前
|
存储 缓存 算法
HashMap深度解析:从原理到实战
HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
67 13
|
2月前
|
运维 持续交付 云计算
深入解析云计算中的微服务架构:原理、优势与实践
深入解析云计算中的微服务架构:原理、优势与实践
76 1
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
88 2
|
13天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
6天前
|
存储 物联网 大数据
探索阿里云 Flink 物化表:原理、优势与应用场景全解析
阿里云Flink的物化表是流批一体化平台中的关键特性,支持低延迟实时更新、灵活查询性能、无缝流批处理和高容错性。它广泛应用于电商、物联网和金融等领域,助力企业高效处理实时数据,提升业务决策能力。实践案例表明,物化表显著提高了交易欺诈损失率的控制和信贷审批效率,推动企业在数字化转型中取得竞争优势。
43 14
|
20天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
72 14
|
14天前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
66 1
|
2月前
|
XML Java 数据库连接
Spring高手之路25——深入解析事务管理的切面本质
本篇文章将带你深入解析Spring事务管理的切面本质,通过AOP手动实现 @Transactional 基本功能,并探讨PlatformTransactionManager的设计和事务拦截器TransactionInterceptor的工作原理,结合时序图详细展示事务管理流程,最后引导分析 @Transactional 的代理机制源码,帮助你全面掌握Spring事务管理。
39 2
Spring高手之路25——深入解析事务管理的切面本质
|
1月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
2月前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
78 8

热门文章

最新文章