zoukankan      html  css  js  c++  java
  • spring路径通配符

    在应用Spring的工程中,使用class path的方式加载配置文件应该是最常用的做法,然而对大部分人来说,刚开始使用Spring时,几乎都碰到过加载配置文件失败的情况,除了配置上的错误外,很多时候是因为配置文件的路径和程序中指定的加载路径不一致,从而导致配置文件找不到,或是加载了错误地方的配置文件。本文将就Spring如何从class path中加载配置文件做一些简要的分析。

           

    classpath:与classpath*:的区别在于,前者只会从第一个classpath中加载,而后者会从所有的classpath中加载

    如果要加载的资源,不在当前ClassLoader的路径里,那么用classpath:前缀是找不到的,这种情况下就需要使用classpath*:前缀

    另一种情况下,在多个classpath中存在同名资源,都需要加载,那么用classpath:只会加载第一个,这种情况下也需要用classpath*:前缀

    可想而知,用classpath*:需要遍历所有的classpath,所以加载速度是很慢的,因此,在规划的时候,应该尽可能规划好资源文件所在的路径,尽量避免使用classpath*

    情形一:使用classpath加载且不含通配符

    这是最简单的情形,Spring默认会使用当前线程的ClassLoader的getResource方法获取资源的URL,如果无法获得当前线程的ClassLoaderSpring将使用加载类org.springframework.util.ClassUtils的ClassLoader。

        

    1.当工程目录结构如图所示:

     
         

    即配置文件放在bin目录中的conf文件夹里,这时使用 

    ApplicationContext context =

    new ClassPathXmlApplicationContext("conf/application-context.xml");来创建ApplicationContext对象的话,Spring将加载bin/conf目录下的application-context.xml文件。Spring启动时的输出显示为: 

    Loading XML bean definitions from

    class path resource [conf/application-context.xml]

        

      

     
    2.当工程目录结构如图所示:
    即bin目录下只有.class文件,没有配置文件,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar文件结构如图所示:

    这时使用 

    ApplicationContext context =

    new ClassPathXmlApplicationContext("conf/application-context.xml");来创建ApplicationContext对象的话,Spring将加载conf.jar文件中conf目录下的application-context.xml文件。Spring启动时的输出显示为: 

    Loading XML bean definitions from

    class path resource [conf/application-context.xml]

       

     
    3. 当工程目录结构如图所示:
    即配置文件放在bin目录中的conf文件夹里,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar文件结构如图所示:

    这时使用 

    ApplicationContext context =

    new ClassPathXmlApplicationContext("conf/application-context.xml");来创建ApplicationContext对象的话,由于没有使用classpath*前缀,Spring只会加载一个application-context.xml文件。在eclipse中将会加载bin/conf目录下的application-context.xml文件,而jar包中的conf/application-context.xml并不会被加载,Spring启动时的输出显示为: 

    Loading XML bean definitions from

    class path resource [conf/application-context.xml]
        
        
     
     

    情形二:使用classpath加载,包含通配符

    碰到通配符的情况时,Spring会通过使用路径中的非通配符部分先确定资源的大致位置,然后根据这个位置在确定具体的资源位置,结合下面给出的几种情况可以更好地理解Spring的这种工作方式

      

    1. 当工程目录结构如图所示:

    即配置文件放在bin目录中的conf文件夹里,这时使用

    ApplicationContext context = new

    ClassPathXmlApplicationContext("conf/**/*application-context.xml");

    来创建ApplicationContext对象的话,Spring首先会通过路径中的非通配符部分即conf,先确定conf的路径,即bin/conf目录,然后从该目录下加载配置文件,由于使用了/**/的方式,表明要加载conf目录下包括各级子目录中的所有配置文件,因此bin/conf/application-context.xml文件和

    bin/conf/admin/admin-application-context.xml都会被加载,Spring启动时的输出显示为:

    Loading XML bean definitions from file

    [D:myworkspacespring-studyinconfadminadmin-application-context.xml]

    Loading XML bean definitions from file

    [D:myworkspacespring-studyinconfapplication-context.xml]

      

    2.当工程目录结构如图所示:
    即bin目录下只有.class文件,没有配置文件,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar文件结构如图所示:

    这时使用

    ApplicationContext context = new

    ClassPathXmlApplicationContext("conf/**/*application-context.xml");来创建ApplicationContext对象的话,Spring首先会通过路径中的非通配符部分即conf,先确定conf的路径,即conf.jar中的conf目录,然后从该目录下加载配置文件,由于使用了/**/的方式,表明要加载conf目录下包括各级子目录中的所有配置文件,因此conf/application-context.xml文件和

    conf/admin/admin-application-context.xml都会被加载,Spring启动时的输出显示为:

    Loading XML bean definitions from class path resource

    [conf/admin/admin-application-context.xml]

    Loading XML bean definitions from class path resource

    [conf/application-context.xml]

      

    3.当工程目录结构如图所示:
    即配置文件放在bin目录中的conf文件夹里,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar文件结构如图所示:

    这时使用

    ApplicationContext context = new

    ClassPathXmlApplicationContext("conf/**/*application-context.xml");来创建ApplicationContext对象的话,Spring首先会通过路径中的非通配符部分即conf,先确定conf的路径,在eclipse中是bin/conf目录,然后从该目录下加载配置文件,由于使用了/**/的方式,表明要加载conf目录下包括各级子目录中的所有配置文件,因此bin/conf/application-context.xml文件和

    bin/conf/admin/admin-application-context.xml都会被加载,但conf.jar文件中的配置文件并不会被加载,Spring启动时的输出显示为:

    Loading XML bean definitions from file

    [D:myworkspacespring-studyinconfadminadmin-application-context.xml]

    Loading XML bean definitions from file

    [D:myworkspacespring-studyinconfapplication-context.xml]
      
      

    情形三:使用classpath*前缀且不包含通配符

    使用classpath*前缀可以获取所有与给定路径匹配的classpath资源,从而避免出现两个不同位置有相同名字的文件,Spring只加载其中一个的情况。

    当工程目录结构如图所示:
    即配置文件放在bin目录中的conf文件夹里,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar文件结构如图所示:

    这时使用

    ApplicationContext context = new

    ClassPathXmlApplicationContext("classpath*:conf/application-context.xml");来创建ApplicationContext对象的话, Spring将会加载bin目录下的application-context.xml文件和jar包里的application-context.xml文件,Spring启动时的输出显示为:

    Loading XML bean definitions from URL

    [file:/D:/myworkspace/spring-study/bin/conf/application-context.xml]

    Loading XML bean definitions from URL

    [jar:file:/D:/myworkspace/conf1.jar!/conf/application-context.xml]

    情形四:使用classpath*前缀,包含通配符

     当工程目录结构如图所示:

    即配置文件放在bin目录中的conf文件夹里,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar文件结构如图所示:

    这时使用 

    ApplicationContext context = new

    ClassPathXmlApplicationContext("classpath*:conf/**/*application-context.xml");来创建ApplicationContext对象的话,Spring首先会通过路径中的非通配符部分即conf,先确定conf的路径,由于使用了classpaht*前缀,因此bin目录下的conf和jar包里的conf都会被加载,同时由于使用了/**/的方式,表明要加载conf目录下包括各级子目录中的所有配置文件,因此bin/conf/application-context.xml和 

    bin/conf/admin/admin-application-context.xml以及jar包中的 

    conf/application-context.xml和 

    conf/admin/admin-application-context.xml都会被加载,Spring启动时的输出显示为: 

    Loading XML bean definitions from file

    [D:myworkspacespring-studyinconfadminadmin-application-context.xml]

    Loading XML bean definitions from file

    [D:myworkspacespring-studyinconfapplication-context.xml]

    Loading XML bean definitions from URL

    [jar:file:/D:/myworkspace/conf1.jar!/conf/admin/admin-application-context.xml]

    Loading XML bean definitions from URL

    [jar:file:/D:/myworkspace/conf1.jar!/conf/application-context.xml]

      

    特别注意: 

    如果工程目录如图所示:
    即配置文件直接放在bin目录中,同时在工程属性的Java Build Path->Libraries里导入conf.jar文件,jar
  • 相关阅读:
    CF1454F Array Partition
    leetcode1883 准时抵达会议现场的最小跳过休息次数
    leetcode1871 跳跃游戏 VII
    leetcode1872 石子游戏VIII
    CF1355C Count Triangles
    CF1245D Shichikuji and Power Grid
    CF1368C Even Picture
    CF1368D AND, OR and square sum
    CF1395C Boboniu and Bit Operations
    SpringBoot和开发热部署
  • 原文地址:https://www.cnblogs.com/onetwo/p/5377183.html
Copyright © 2011-2022 走看看