classpath和classpath* 怎么理解?有什么区别

一、classpath路径指什么
    只知道把配置文件如:mybatis.xml、spring-web.xml、applicationContext.xml等放到src目录(就是存放代码.java文件的目录),然后使用“classpath:xxx.xml”来读取,都放到src目录准没错,那么到底classpath到底指的什么位置呢?
   
 

src路径下的文件在编译后会放到WEB-INF/classes路径下吧。默认的classpath是在这里。直接放到WEB-INF下的话,是不在classpath下的。用ClassPathXmlApplicationContext当然获取不到。
如果单元测试的话,可以在启动或者运行的选项里指定classpath的路径的。
用maven构建项目时候resources目录就是默认的classpath
classPath即为java文件编译之后的class文件的编译目录一般为web-inf/classes,src下的xml在编译时也会复制到classPath下
ApplicationContext ctx = new ClassPathXmlApplicationContext("xxxx.xml");  //读取classPath下的spring.xml配置文件
ApplicationContext ctx = new FileSystemXmlApplicationContext("WebRoot/WEB-INF/xxxx.xml");   //读取WEB-INF 下的spring.xml文件
 

二、web.xml 配置中classpath: 与classpath*:的区别

首先 classpath是指 WEB-INF文件夹下的classes目录 

解释classes含义: 
1.存放各种资源配置文件 eg.init.properties log4j.properties struts.xml 
2.存放模板文件 eg.actionerror.ftl 
3.存放class文件 对应的是项目开发时的src目录编译文件 
总结:这是一个定位资源的入口 

 

classpath 和 classpath* 区别: 
classpath:只会到你的class路径中查找找文件; 
classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找. 


Java代码  
<param-value>classpath:applicationContext-*.xml</param-value>  


或者引用其子目录下的文件,如 
Java代码 
<param-value>classpath:context/conf/controller.xml</param-value>  


classpath*的使用:当项目中有多个classpath路径,并同时加载多个classpath路径下(此种情况多数不会遇到)的文件,*就发挥了作用,如果不加*,则表示仅仅加载第一个classpath路径,代码片段: 
Java代码  收藏代码
<param-value>classpath*:context/conf/controller*.xml</param-value>  


另外: 
"**/" 表示的是任意目录; 
"**/applicationContext-*.xml"  表示任意目录下的以"applicationContext-"开头的XML文件。  
程序部署到tomcat后,src目录下的配置文件会和class文件一样,自动copy到应用的 WEB-INF/classes目录下 
classpath:与classpath*:的区别在于, 


前者只会从第一个classpath中加载,而 
后者会从所有的classpath中加载  


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


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


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

<think>好的,用户现在问的是关于MyBatis中路径配置里的通配符***区别,具体是在`classpath:mapper/**/*.xml`这个例子中的使用。我需要仔细分析他们的疑问点,并确保回答准确。 首先,用户可能已经了解了MyBatis的基本配置,但遇到了路径匹配的问题,尤其是在使用通配符时。他们可能在实际配置时遇到了文件无法加载的情况,或者想更深入理解两者的区别以避免错误。 接下来,我需要回忆Ant风格路径匹配的规则。在SpringMyBatis中,`*``**`有不同的含义。`*`通常匹配单层目录中的任意字符,而`**`可以跨多级目录。例如,`mapper/*.xml`只能匹配mapper目录下的直接XML文件,而`mapper/**/*.xml`可以匹配mapper下所有子目录中的XML文件。 用户的问题可能源于对这两个通配符的具体用法不清楚,导致配置路径时出现错误,比如文件未被正确加载。需要详细解释两者的区别,并举一些例子来说明不同情况下的匹配结果,这样用户能更直观地理解。 还要考虑用户可能的使用场景。比如在大型项目中,模块化结构可能需要多级目录,这时候`**`就非常有用。同时,如果用户使用了错误的通配符,可能会导致部分文件未被加载,出现BindingException。因此,强调正确的通配符选择对项目配置的重要性是必要的。 另外,用户可能对资源路径的配置方式不太熟悉,特别是classpath文件系统路径的区别,但这里的问题主要集中在通配符上。需要保持回答的针对性,专注于解释***的不同,避免引入其他复杂概念。 最后,应该提供一些最佳实践或常见错误的解决方法,帮助用户避免常见的陷阱。例如,检查编译后的目录结构,确保资源文件被正确复制,或者在多模块项目中如何正确配置路径。这些实际建议能帮助用户更好地应用所学知识,解决实际问题。</think>在 MyBatis 或 Spring 的路径配置中,`*` `**` 是 **通配符**,但它们的匹配规则有本质区别。以下是具体解析: --- ### **1. 单星号 `*`** #### **作用** 匹配 **单层路径** 中的任意字符(**不跨目录层级**)。 #### **示例** - `classpath:mapper/*.xml` - ✅ 匹配:`mapper/user.xml` - ✅ 匹配:`mapper/order.xml` - ❌ 不匹配:`mapper/subdir/user.xml`(因为 `*` 无法跨子目录) --- ### **2. 双星号 `**`** #### **作用** 匹配 **任意层级的子目录**(包括零层或多层目录)。 #### **示例** - `classpath:mapper/**/*.xml` - ✅ 匹配:`mapper/user.xml`(零层子目录) - ✅ 匹配:`mapper/subdir/user.xml`(一层子目录) - ✅ 匹配:`mapper/subdir1/subdir2/user.xml`(多层子目录) --- ### **3. 对比总结** | **通配符** | **匹配范围** | **示例路径** | **是否匹配** | |------------|---------------------------|----------------------------------|------------| | `*` | 单层目录中的文件或目录名 | `mapper/*.xml` | ✅ `mapper/a.xml`<br>❌ `mapper/sub/a.xml` | | `**` | 任意层级的子目录 | `mapper/**/*.xml` | ✅ 所有层级子目录下的 XML 文件 | --- ### **4. 实际场景中的典型用法** #### **场景 1:单层目录匹配** ```yaml # 仅扫描 mapper 直接子目录下的 XML mybatis.mapper-locations=classpath:mapper/*.xml ``` - 匹配文件: `mapper/UserMapper.xml` `mapper/OrderMapper.xml` - 不匹配文件: `mapper/subdir/UserMapper.xml` #### **场景 2:递归匹配所有子目录** ```yaml # 扫描 mapper 及其所有子目录下的 XML mybatis.mapper-locations=classpath:mapper/**/*.xml ``` - 匹配文件: `mapper/UserMapper.xml` `mapper/subdir/UserMapper.xml` `mapper/subdir1/subdir2/UserMapper.xml` --- ### **5. 常见错误与验证** #### **错误示例** ```yaml # 错误:试图用 * 匹配多级目录 mybatis.mapper-locations=classpath:mapper/*/*.xml ``` - 只能匹配 `mapper/subdir/UserMapper.xml`,但无法匹配: `mapper/UserMapper.xml`(缺少中间目录) `mapper/subdir1/subdir2/UserMapper.xml`(仅支持单层目录) #### **验证方法** 1. **检查编译后的路径**: 查看 `target/classes`(Maven/Gradle)目录,确认 XML 文件是否按预期复制到对应子目录。 2. **通配符测试工具**: 使用 Spring 的 `PathMatchingResourcePatternResolver` 测试路径匹配逻辑(需编写单元测试)。 --- ### **6. 扩展规则** - **`classpath*:` 前缀**: 使用 `classpath*:` 会扫描 **所有类路径**(包括依赖 Jar 包),而 `classpath:` 仅扫描当前项目的类路径。 示例:`classpath*:com/**/mapper/*.xml`(跨模块匹配所有符合条件的 XML)。 --- ### **总结** - **`*`**:用于单层路径匹配(文件或目录名)。 - **`**`**:用于跨任意层级子目录匹配。 - **组合使用**:`**` 通常与 `*` 配合,例如 `**/*.xml` 表示“所有目录下的 XML 文件”。 - **关键点**:正确使用通配符可避免因路径错误导致的 `BindingException` 问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值