`

mybatis源码学习总结-class.getResource方法与claasloader.getResource方法的区别

阅读更多

Class.getResources(String path) path如果是以 / 开头,就从classpath中去找(classpath可以认为是eclipse的bin目录或者是target的classes目录),
如果不以/开头,就以当前类的位置开始找,也就是它有两种搜索方式。

.classloader不能以/为开头,classloader.getResource只能从classpath中去找。


例如在src/com/test/example2目录下存在aa.xml文件则。
      
@Test
	public void test1()
	{
		
		System.out.println(TestResource.class.getResource("aa.xml"));  --没有以/开头,从当前类位置去找。
		System.out.println(TestResource.class.getClassLoader().getResource("aa.xml")); 
		System.out.println("TestResource.test1()");
	}

       执行结果为:
      file:/C:/Users/ltchyj/workspace/testapp2/bin/com/test/example2/aa.xml
      null
     TestResource.test1()


可以看出,classloader.getResource在当前路径下找不到相关资源,但是class.getResource方法可以找到相关资源


@Test
	public void test2()
	{
		System.out.println(TestResource.class.getResource("/com/test/example2/aa.xml")); //以/为开头。从classpath下面去找。
		System.out.println(TestResource.class.getClassLoader().getResource("com/test/example2/aa.xml"));//classloader不能以/为开头,
		System.out.println("TestResource.test2()");
	}
执行结果为:
  	file:/C:/Users/ltchyj/workspace/testapp2/bin/com/test/example2/aa.xml
file:/C:/Users/ltchyj/workspace/testapp2/bin/com/test/example2/aa.xml
TestResource.test2()

以上执行结果可以看出,class.getResource和classloader.getResource方法在当前classpath下都看可以找到指定的资源,唯一的区别是class.getResouece以/开头,classloader.getResource不以/开头。

@Test
	public void test3()
	{
		System.out.println(TestResource.class.getResource("")); //获取的
		System.out.println(TestResource.class.getClassLoader().getResource(""));
		System.out.println("TestResource.test3()");
	}

file:/C:/Users/ltchyj/workspace/testapp2/bin/com/test/example2/
file:/C:/Users/ltchyj/workspace/testapp2/bin/
TestResource.test3()



class.getResourceAsStream 和getClassLoader().getResourceAsStream
class.getResourceAsStream,如之前的class.getResource一样,只不过包装了一个流,返回给你一个输入流。



现在来看一段mybstis的源码。
public void registerAliases(String packageName, Class<?> superType){ //这里传入的是Object.class
    ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<Class<?>>();
    resolverUtil.find(new ResolverUtil.IsA(superType), packageName);
    Set<Class<? extends Class<?>>> typeSet = resolverUtil.getClasses();
    for(Class<?> type : typeSet){
      // Ignore inner classes and interfaces (including package-info.java)
      // Skip also inner classes. See issue #6
      if (!type.isAnonymousClass() && !type.isInterface() && !type.isMemberClass()) {
        registerAlias(type);
      }
    }


     public ResolverUtil<T> find(Test test, String packageName) {
    String path = getPackagePath(packageName); //获取package对应的path,将.替换为/

    try {
      List<String> children = VFS.getInstance().list(path);
      for (String child : children) {
        if (child.endsWith(".class")) {
          addIfMatching(test, child);
        }
      }
    } catch (IOException ioe) {
      log.error("Could not read package: " + packageName, ioe);
    }

    return this;
  }

 protected String getPackagePath(String packageName) {
    return packageName == null ? null : packageName.replace('.', '/');  
  }

public List<String> list(String path) throws IOException {
    List<String> names = new ArrayList<String>();
    for (URL url : getResources(path)) {
      names.addAll(list(url, path));
    }
    return names;
  }


  protected static List<URL> getResources(String path) throws IOException {
    return Collections.list(Thread.currentThread().getContextClassLoader().getResources(path));//


  根据上述代码可以看出,外部传入一个包名,
1.首先将包名中的.替换为/
2.使用classloader.getResource获取当前包路径下的所有class资源。
3. 使用classloader加载








分享到:
评论

相关推荐

    mybatis-demo.zip

    《MyBatis 框架实战教程:基于 mybatis-demo.zip 示例项目》 在现代 Java Web 开发中,MyBatis 作为一个轻量级的持久层框架,因其灵活性和高效性而深受开发者喜爱。本教程将通过分析 `mybatis-demo.zip` 文件中的...

    springboot-mybatis-demo.zip

    《SpringBoot整合Mybatis实战详解》 在现代Java开发中,SpringBoot以其便捷的配置、自动化的特性,已经成为主流的微服务框架。而Mybatis作为轻量级的持久层框架,以其灵活的SQL操作和良好的性能深受开发者喜爱。将...

    SpringBoot 2.0.2.RELEASE以XML的形式整合 Mybatis (SpringBoot 2.0.2.RELEASE版本)

    SpringBoot旨在简化Spring应用的初始搭建以及开发过程,而Mybatis则是一个轻量级的持久层框架,通过SQL映射文件将Java对象与数据库表进行绑定。接下来,我们将深入探讨如何在SpringBoot项目中实现这一整合,并利用...

    neo4j mybatis的例子

    Neo4j是一个强大的图形数据库,而MyBatis则是一个流行的Java持久层框架,主要用于操作关系型数据库。将这两者结合可以实现对图形数据的高效管理。在这个例子中,我们将探讨如何在Java应用中使用MyBatis与Neo4j进行...

    SpringBoot + mybatis-plus + druid 实现mySql与Orcl双数据源

    总结起来,通过SpringBoot、Mybatis-Plus和Druid,我们可以方便地实现双数据源配置,使得应用能同时处理MySQL和Oracle数据库的数据。在实际开发中,要根据业务场景灵活切换数据源,确保数据操作的正确性和效率。同时...

    mybatis开发教程.docx

    ### MyBatis 开发教程知识点总结 #### 一、MyBatis 概念与特性 1. **定义**: - MyBatis 是一款优秀的支持定制化 SQL、存储过程及高级映射的持久层框架。 - 它通过简单的 XML 或注解方式,将参数类型与 Java ...

    Mybatis配置.docx

    MyBatis是一个流行的Java持久层框架,它简化了在实体对象和SQL语句之间的数据映射过程,提供了半自动的ORM(对象关系映射)实现。这个框架允许开发者编写动态的SQL,使得数据库操作更加灵活。以下是MyBatis配置的...

    mybatis的总结一

    ### MyBatis总结 #### JDBC回顾与MyBatis简介 **JDBC(Java Database Connectivity)** 是Java中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。它由一组用Java语言...

    springboot-mybatis

    Mapper接口提供了与数据库交互的方法,这些方法将在运行时由MyBatis动态生成SQL。例如: ```java public interface UserMapper { User getUserById(Integer id); List&lt;User&gt; getAllUsers(); void insertUser...

    SpringBoot整合Mybatis开发项目.docx

    在本文中,我们将深入探讨如何将Mybatis与SpringBoot整合,以便在开发Java Web应用程序时实现高效的数据访问层。我们将遵循以下步骤: 1. **环境准备** 首先,确保你拥有以下软件的正确版本: - IDEA 2020.1.3:...

    SpringBoot集成Mybatis-Plus+代码生成工具.doc

    SpringBoot 集成 Mybatis-Plus 代码生成工具 SpringBoot 是一个基于 Java 的框架,它提供了快速构建生产级别的应用程序的能力。Mybatis-Plus 是一个基于 Mybatis 框架的增强工具,它提供了代码生成、分页、查询等...

    springmybatis

    mybatis实战教程mybatis in action之五与spring3集成附源码 mybatis实战教程mybatis in action之六与Spring MVC 的集成 mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in ...

    Spring Boot 集成mybatis

    这样,我们就完成了Spring Boot与MyBatis的集成。通过调用`UserService`的`getAllUsers`方法,即可获取到数据库中的所有用户信息。 总的来说,Spring Boot集成MyBatis的过程主要包括添加依赖、配置数据库、创建...

    MyBatis3--开发指南(附JavaDB实例)

    &lt;mapper class="org.mybatis.example.mapper.UserMapper"/&gt; ``` #### SQL映射XML文件 - **Select元素**:定义查询操作。 ```xml &lt;select id="selectAllUsers" resultType="com.example.model.User"&gt; ...

    MyBatis Generator工具,存放桌面,方便快捷

    MyBatis Generator是一款强大的自动化代码生成工具,它能够帮助开发者自动生成Java实体类、Mapper接口与XML配置文件,以及Service层的基本 CRUD 操作,极大地提高了开发效率。在本压缩包中,包含的是"MyBatis ...

    springboot集成mybatis-plus遇到的问题及解决方法

    mybatisPlus.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation())); } return mybatisPlus; } } ``` 问题三:MyBatis-Plus 与 Spring Boot 整合问题 在 Spring Boot ...

    基于IDEA 的maven 项目 的 MyBatis配置

    在Java开发领域,MyBatis是一个非常流行的持久层框架,它简化了数据库操作与Java对象之间的映射。本文将深入探讨如何在IntelliJ IDEA(IDEA)的Maven项目中配置MyBatis,这对于初学者来说是一个重要的起点。通过遵循...

    整合flex-spring-mybatis

    ### 整合flex-spring-mybatis #### 一、项目背景及目标 本文档旨在详细介绍如何将Flex技术与Spring框架及MyBatis框架进行有效整合,以实现一个高性能且易于维护的企业级应用。通过整合这三种技术,可以充分利用Flex...

    springmvc和mybatis整合

    ### Spring MVC 和 MyBatis 整合详解 #### 一、整合概述 Spring MVC 和 MyBatis 是目前非常流行的两种技术栈。Spring MVC 作为一款优秀的 MVC 框架,可以很好地实现业务逻辑与表现层的分离;而 MyBatis 作为一款...

    spring boot mybatis整合

    在IT行业中,Spring Boot和MyBatis是两个非常流行的开源框架,它们分别简化了Java Web应用的开发和数据库操作。Spring Boot提供了快速构建应用程序的能力,而MyBatis则是一个轻量级的持久层框架,专注于SQL映射和...

Global site tag (gtag.js) - Google Analytics