Python与java的“依赖”对比
先说结论Java 里通过 Maven 导入依赖之后通常也要import对应的类才能在代码里直接使用。但和 Python 不一样的是Python 通常是import 包/模块然后直接调用里面的函数Java 通常是导入依赖 → 在代码里import某个类 → 通过类/对象调用方法所以你记忆里那种“有些依赖导入了但我好像没直接调用它的函数”这也是对的因为Java 里不是每个依赖都要你手写代码去调它的方法。有些依赖只是提供运行环境支持提供自动配置提供注解提供底层能力被别的框架间接调用你先把 Java 里的这几层分开1Maven 导入依赖干的是什么事比如你在pom.xml里写dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency这一步的意思是告诉 Maven帮我把这个第三方库下载下来并加入到项目的编译和运行环境里。本质上就是下载对应的 jar 包下载它依赖的其他 jar 包放到项目的 classpath 里所以你说的这句第三方 jar 包好像是你通过 maven 管理下载之后就可以使用 jar 包中的类了这个理解是对的。更准确一点说是Maven 负责把 jar 包准备好Java 代码再去使用这些 jar 包里的类。2下载好了以后是不是就能直接用能用但前提是你要在代码里能访问到那个类。Java 是按“类”来用的不像 Python 常常按“模块”来用。比如你引了一个依赖里面有个类org.springframework.web.client.RestTemplate那你在代码里想用它就得import org.springframework.web.client.RestTemplate;然后RestTemplate restTemplate new RestTemplate();所以一般流程是Maven 导依赖 → 代码里 import 类 → 创建对象/调用静态方法/使用注解和 Python 对比一下你就更容易懂Python 里你装个库pip install requests然后代码里import requests requests.get(...)也就是说pip install安装库import requests导入模块requests.get()调用模块里的 APIJava 里你加个依赖dependency ... /dependency然后代码里import xxx.yyy.SomeClass;再SomeClass obj new SomeClass(); obj.someMethod();也就是说Maven 导依赖下载 jar 包import导入类通过对象/类调用方法为什么你会感觉“有些依赖没 import 也没直接调用”因为 Java 里的依赖确实分很多种不是每一种都要你手动写代码去用。这个特别重要。第一种你显式使用的依赖这种最像 Python。比如HutoolFastjson/JacksonApache CommonsMyBatis Plus 的某些工具类Spring AI 的某些 API 类你要用它就要import它的类。例如import cn.hutool.core.util.StrUtil;然后StrUtil.isBlank(str);这个就和 Python 调库很像。第二种通过注解使用的依赖比如 Spring Boot 里你写RestController GetMapping(/hello)这里你虽然不是在“调用函数”但本质上你还是在使用这个依赖提供的能力。只是你用的是它的注解。比如import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping;所以这也是“用依赖”只是不是调普通方法而是用注解。第三种你几乎不直接写代码用它在背后工作比如spring-boot-starter-web这个依赖你平时并不会在代码里写new SpringBootStarterWeb()根本没有这种写法。因为它的作用是帮你把 Spring MVC、Tomcat、JSON 处理等一堆相关依赖一起拉进来让 Spring Boot 自动配置 web 环境也就是说这种依赖很多时候是基础设施依赖不是给你“直接调用某个函数”的。你用到的是它带来的整体能力而不是某个具体 API。所以你会有这种感觉我导入了依赖但好像没直接调它的函数这是完全正常的。你可以把 Java 依赖分成这三类来记A. 工具类依赖你会直接 import 类然后调方法。比如StrUtilCollectionUtilsObjectMapperFilesJSONObject用法像import xxx.SomeUtil; SomeUtil.doSomething();B. 注解/接口型依赖你会 import 注解、接口、父类然后交给框架处理。比如import org.springframework.stereotype.Service;Service public class UserService { }这里你没有手动调方法但你确实在使用这个依赖。C. 启动器/底层支持依赖你可能几乎不直接 import 它的类但它让整个项目能跑起来。比如spring-boot-starter-web数据库驱动日志依赖自动配置依赖这些更多是“环境支撑”。那 Java 代码里到底什么时候需要 import一般来说1你要直接写出某个类名时就要 import。比如import java.util.List; import java.util.ArrayList;2你要用某个注解时也要 import。比如import org.springframework.beans.factory.annotation.Autowired;3同一个包下的类不需要 import。比如你自己写的两个类在同一个 package 下直接用就行。4java.lang包下很多类默认不用 import比如StringObjectSystemInteger这些默认可见。所以这也会让你觉得咦有些类没 import 也能用对因为它们是 Java 特殊处理的。“导入依赖”和“import”不是一回事这个你一定要彻底分开。Maven 导依赖是在pom.xml里做的事。作用下载 jar管理版本放进 classpath这是项目级别的。Java 里的 import是在.java文件顶部写的。作用告诉编译器你这个类名来自哪个包这是源码级别的。你可以这样类比Maven 依赖相当于“把工具箱买回来放家里”import相当于“我现在从工具箱里拿哪一个工具出来用”为什么有时候不写 import 也能用还有一种情况你可能也见过new java.util.ArrayList();这种就是全限定类名。因为你已经把完整包名写全了所以可以不 import。只是平时大家为了简洁通常会 import。再说你容易混淆的一点jar 包、依赖、类、函数的关系你可以这样串起来理解1. jar 包是打包好的 Java 类库文件。2. Maven 依赖是告诉项目要使用哪些 jar 包。3. 包packagejar 包里面会有很多 package。4. 类classpackage 里面有很多类。5. 方法method类里面才有方法。所以 Java 的使用路径一般是Maven 依赖 → jar 包 → 包 → 类 → 方法而不是像 Python 那样更常表现为安装库 → import 模块 → 调函数你记忆里的 Spring 为什么看起来“不像在调库”因为 Spring 尤其容易让人产生这种错觉。比如你写RestController public class HelloController { GetMapping(/hello) public String hello() { return hello; } }你会觉得“我也没怎么调用 Spring 的函数啊怎么它就跑起来了”因为 Spring 这种框架很多时候是你写类你加注解框架在启动时扫描这些类它替你创建对象、注册路由、处理请求也就是说你是在“声明式地使用框架”不是“命令式地直接调函数”。这和 Python 某些脚本式库的感觉很不一样。所以你现在该怎么建立一个清晰认知我帮你总结成一句最稳的Java 中Maven 负责把依赖下载到项目里你真正使用时通常还是要通过import导入类、注解或接口然后再在代码里使用它们。只是有些依赖你会直接调方法有些依赖你是通过注解在用有些依赖只是提供底层支撑你几乎不会直接写代码碰它给你几个例子你马上就能分清例子 1直接调方法的依赖dependency groupIdcn.hutool/groupId artifactIdhutool-all/artifactId version.../version /dependency代码里import cn.hutool.core.util.StrUtil; boolean blank StrUtil.isBlank( );这是最典型的“导依赖 import 调方法”。例子 2通过注解使用dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency代码里import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping;RestController public class TestController { GetMapping(/test) public String test() { return ok; } }这里你主要是在用注解。例子 3底层支撑型依赖数据库驱动dependency groupIdmysql/groupId artifactIdmysql-connector-j/artifactId /dependency你平时可能不会直接去 new 它里面的类但 Spring Boot、MyBatis、JDBC 在底层会用到它。所以这个依赖是“让数据库连接能成立”的。最后给你一个判断口诀以后遇到一个 Maven 依赖你就问自己三件事1这个依赖是给谁用的给我业务代码直接用给注解/接口用给框架底层用2我在代码里有没有写出它的类名/注解名有的话一般就要 import没有的话可能是底层支撑依赖3它是“我主动调用”还是“框架替我调用”主动调用工具类/API框架替我调用Spring 这种声明式框架你现在这个困惑其实特别正常因为你同时在学 Python 和 Java就会把两边的“调库方式”混起来。但你只要记住这个区别就行Python 更像安装库 → import 模块 → 调函数Java 更像引依赖 → import 类/注解 → 通过类、对象、注解、框架机制去使用