首页 / 资讯中心 / 文章详情

Spring框架入门:Eclipse环境配置与Maven依赖实战指南

Spring框架入门:Eclipse环境配置与Maven依赖实战指南 ★ FEATURED ARTICLE
1. 为什么Spring值得你花时间配置环境1.1 先聊聊Spring核心价值IoC与DI到底是什么Spring这个名字搞Java的人不可能没听过。它最核心的并不是那堆眼花缭乱的注解而是IoC控制反转容器。我们平时写代码最简单的对象依赖是什么在service里new一个dao然后调用dao的方法。这样写起来很直接但问题在于一旦dao的实现要换比如你从JDBC实现换成MyBatis实现所有new了它的地方都要改。这还只是一个问题对象何时创建、何时销毁、是不是单例这些事如果全靠开发者自己管项目一大代码里全是new和生命周期管理心累。Spring做的事情简单说就是把“创建对象、组装依赖”这件事从你手里拿过去统一放到容器里管理。你只需要在配置文件里声明“我要一个User对象名字叫张三年龄18”容器启动的时候会自动帮你创建好然后你根据id取出来用。这就是控制反转控制权从代码转移到容器。依赖注入则是它的实现手段一个对象需要哪些协作对象容器负责给它“塞进去”你不用自己new。Spring在Eclipse环境下安装使用是很多老牌教材、学校课程的核心章节也是不少人入行的第一道坎。原因很简单不是Spring本身难而是环境配置过程中的版本匹配、jar包依赖、路径问题会把新手折磨到怀疑人生。这篇内容的目标就是把这些坑提前踩平。1.2 为什么到现在还选择Eclipse而非其他IDE可能有人会问现在大家都用IntelliJ IDEA了Eclipse还有必要专门讲吗实际情况是Eclipse在高校课堂、传统企业、国内不少外包公司和老项目中依然大量存在免费、开源、插件体系庞大而且很多老开发者的肌肉记忆都留在Eclipse的快捷键上。你如果刚入职一家维护了十年的老项目打开公司配的电脑上面装的很可能是Eclipse。另外Eclipse对Spring的支持虽然不像IDEA那样“开箱即用”但通过Maven和Spring Tool Suite插件完整的开发流程完全跑得通。Spring Tool Suite最初也是从Eclipse插件演化而来很多老教程的截图都是Eclipse界面你照着做反而更贴合。说白了工具只是手段理解Spring的配置逻辑才是重点。这篇内容适合两类人第一刚开始学Spring框架的学生学校要求用Eclipse被环境搭建卡住第二工作中必须用Eclipse维护老项目的开发者需要快速补齐Spring配置的知识点。不管你是哪种只要照着下面的版本方案和步骤走环境基本能一遍过。2. 动手前先选对版本JDK、Eclipse与Spring的兼容性2.1 JDK与Spring的版本匹配关系配置Spring最容易犯的第一个错误就是版本随便选。很多同学下载了最新的Spring 6.x结果机器上装的是JDK 8一运行直接报UnsupportedClassVersionError其实这是Spring 6.x要求JDK 17及以上的硬性门槛。版本不兼容的问题不会一开始就暴露往往是项目跑到一半报警回头查环境才发现特别浪费时间。我在实际使用中的推荐组合是JDK 8 Spring 5.3.x。这个组合兼容性最好资料最多报错也能搜到大量解决方案。Spring 5.3.x是目前生命周期比较长的版本官方支持范围覆盖到JDK 8、11、17无论你是老电脑还是新机器基本都能跑。如果你的机器已经装了JDK 17用Spring 5.3.x也完全没问题但建议把编译级别设置成和JDK版本匹配别出现“源码1.8编译但JDK 17运行”这种混合状态虽然能跑但没意义。JDK版本确认方式命令行输入java -version看到1.8.0_xxx就是JDK 8。Eclipse方面建议用2021-09之后的版本这个版本开始对Java 17的编译和运行支持比较完善。如果你用旧一点的2020-06也能跑JDK 8但如果后面升级依赖版本可能会遇到IDE内部的编译问题。2.2 两种安装方式的对比Maven依赖还是手动jar包Spring安装核心其实就两种路线一种是使用Maven自动管理依赖另一种是手动下载jar包导入。前者是现代开发的主流也是我这篇内容的主推方案后者是早期教程的做法特别适合离线环境或者教材演示。对比项Maven方式手动jar包方式依赖下载自动下载传递依赖完整手动一个个找容易漏版本管理pom.xml统一声明文件名写死升级麻烦外网依赖需要网络可配置国内镜像完全离线可操作上手难度需要理解Maven基础适合纯入门教学团队协作别人导入pom即可每人都要重复导jar包项目规模大型项目、后续扩展练习、教学场景我个人强烈建议哪怕是初学者也第一口就吃Maven这种方式。原因很简单当你以后做真实项目不可能手动去管理几十个jar包。Maven不仅帮你下载还帮你处理传递依赖。比如你引入一个spring-context它自动把spring-core、spring-beans、spring-aop、spring-expression等依赖一起拉下来。这些底层依赖如果让你自己手动下载搞错版本的概率极高。如果你所在的环境确实没有外网或者公司安全限制很严格手动方式作为备选也完全可行。后面第四章我会专门讲传统方式的完整操作。3. 基于Maven的Spring安装全流程实操3.1 创建Maven工程并配置pom.xml我以一个最基础的用户管理模块为例把整个搭建过程走一遍。先在Eclipse里新建Maven项目打开File菜单选择New - Other在弹出的窗口里找到Maven - Maven Project。这时会有一个是否勾选Create a simple project的选项建议勾选这样不会生成那一堆复杂的archetype模板。接下来填Group Id、Artifact IdGroup Id一般用公司或个人域名倒写比如com.demoArtifact Id写spring-demoVersion保持默认0.0.1-SNAPSHOT即可。项目建好后打开pom.xml文件默认内容只有坐标信息和一堆没用的注释。把下面内容整体替换project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.demo/groupId artifactIdspring-demo/artifactId version1.0-SNAPSHOT/version packagingjar/packaging properties maven.compiler.source1.8/maven.compiler.source maven.compiler.target1.8/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding spring.version5.3.29/spring.version /properties dependencies dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version${spring.version}/version /dependency /dependencies /project这里只引入了一个依赖spring-context它负责提供Spring容器的最核心支持。Spring的运行机制就靠这一个小小的坐标Maven会自动把编成依赖的罐子全部拉到项目里。保存后eclipse右下角会自动开始下载依赖第一次会比较慢因为要去中央仓库拉东西。如果等了很久还没结束大概率是网络问题后面第五章我会给解决办法。3.2 编写Spring配置文件和第一个被管理的对象Spring的配置文件传统上叫applicationContext.xml放在src/main/resources目录下Maven项目里resources目录就是classpath根路径容器默认会从这里加载xml文件。在Eclipse的项目结构里你需要在src/main/java下面右键New - Folder建立一个叫resources的文件夹然后再在里面新建一个Spring Bean配置文件。有些版本的Spring插件可以直接右键New - Spring Bean Configuration File如果没有这个选项也没关系手动创建一个XML文件内容照样能识别。配置文件内容如下?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd bean iduser classcom.demo.bean.User property namename value张三 / property nameage value18 / /bean /beans这个XML的作用很直白声明容器里有一个id为user的bean类型是com.demo.bean.User并且通过setter方法注入两个属性。也就是说Spring创建User对象后会自动调用setName(张三)和setAge(18)。前提是你User类里得有这些setter方法否则运行时报错也是在这里。接下来写User类package com.demo.bean; public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name name; } public int getAge() { return age; } public void setAge(int age) { this.age age; } Override public String toString() { return User [name name , age age ]; } }这个类很简单就是标准的POJO没有任何Spring相关的代码侵入。这其实是Spring老版本最优雅也最值钱的设计你的业务类根本不需要知道容器存在它只是一个普通类容器通过配置文件来描述它装配完全与代码解耦。3.3 编写main方法启动容器并验证有了配置、有了Bean类就可以写一个入口来验证环境是否真正搭好。我在com.demo.main包下新建MainApp类package com.demo.main; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.demo.bean.User; public class MainApp { public static void main(String[] args) { ApplicationContext context new ClassPathXmlApplicationContext(applicationContext.xml); User user context.getBean(user, User.class); System.out.println(user); ((ClassPathXmlApplicationContext) context).close(); } }ClassPathXmlApplicationContext是Spring提供的从classpath路径加载配置文件的容器实现参数传applicationContext.xml即可因为我们文件放在了resources根目录。运行main方法控制台输出User [name张三, age18]看到这个结果说明你的Spring环境已经完全打通容器成功读取XML配置创建了User对象完成了属性注入你从容器中按id取出了完整的对象。这一步成功了后面所有的Spring学习都会顺畅很多。如果你运行时直接抛出一堆异常不要慌多半不是代码逻辑问题而是依赖缺失或版本问题去第五章对照排查。3.4 扩展一步注解方式与XML方式如何互补如果你只跑通了XML版本就觉得完事其实还差一块拼图。真实项目里现在很少纯粹用XML写Bean更多是注解驱动加零配置。但是理解XML版本依然是必要的因为它能帮你理解容器背后发生了什么。我们在现有配置上扩展一个注解扫描就能同时用两种方式。首先修改applicationContext.xml增加context命名空间和一个组件扫描声明?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xsi:schemaLocationhttp://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd context:component-scan base-packagecom.demo.bean / bean iduser classcom.demo.bean.User property namename value张三 / property nameage value18 / /bean /beans在User类上加上Component注解表示这个类也交给容器管理package com.demo.bean; import org.springframework.stereotype.Component; Component(user2) public class User { // 省略原有字段、setter与toString }这样容器里同时存在两个beanuserXML声明和user2注解扫描。main方法里同时取两个User user context.getBean(user, User.class); User user2 context.getBean(user2, User.class); System.out.println(user); System.out.println(user2);运行结果会看到两个User对象一个是张三一个属性为空。这说明容器既支持XML装配也支持注解扫描两种方式完全可以共存。实际项目中推荐用注解标记业务类用配置类或者少量XML管理跨模块的复杂Bean规则简单能注解的地方用注解涉及第三方类、参数配置时用XML或Java配置。4. 没有Maven怎么办传统手动jar包方式安装4.1 Spring核心jar包到底有哪些现实中还是有完全不具备Maven环境的角落学校机房断网、公司内网私有仓库没配好、考试现场只给了Eclipse。这时候手动导jar包是唯一选择。Spring框架官方发布的是一个压缩包里面包含了所有模块的jar包和依赖说明下载之后解压找到lib目录。对于最基础的容器使用其实不需要把几十个jar包全部导入只需要核心几个spring-context、spring-beans、spring-core、spring-aop、spring-expression、spring-jcl。其中spring-jcl是Spring 5之后出现的日志桥接包替代了老版本里的commons-logging依赖。很多人拿着老教程去下载Spring 4时代的依赖清单硬塞进Spring 5里运行后经常会冒出各种NoClassDefFoundError原因就在这里。模块作用简述spring-core核心工具类与异常体系其他模块都依赖它spring-beansBean的定义、创建、属性赋值实现spring-contextApplicationContext容器提供运行时环境spring-aopAOP切面编程的支撑模块spring-expressionSpEL表达式语言支持spring-jcl统一的日志桥接API如果你的业务后续要使用声明式事务、注解配置还需要额外引入spring-tx、aspectjweaver等jar包。但初学环境和演示场景上面六个足以跑通。4.2 在Eclipse中手动添加jar包的完整步骤导入方式很简单在Eclipse项目根目录新建一个lib文件夹把jar包全部拷进去然后右键项目 - Build Path - Configure Build Path打开Java Build Path窗口在Libraries选项卡里点击Add JARs选中lib文件夹里的所有jar包确定即可。注意是Add JARs不是Add External JARs。前者的前提是jar包在项目内部团队提交代码时能够一起提交别人拉下来不用重新配置后者是引入项目外部的绝对路径一旦换机器路径就失效不推荐。添加完成后Project Explorer中展开项目能看到Referenced Libraries列表里面应该有Spring的jar包。这时把第三章的User类、applicationContext.xml、MainApp代码全部复制粘贴到项目里跑一次main方法如果输出User对象说明传统方式的安装也成功了。注意Spring的配置文件放在src目录下时会被编译到classes目录下ClassPathXmlApplicationContext(applicationContext.xml)默认就是从classes目录寻找。你如果用的是普通Java项目而非Maven项目直接把applicationContext.xml放在src目录下也可以。4.3 传统方式在我实际使用中的感受手动导包最大的问题不是“能不能跑”而是“什么时候又缺一个包”。你以为六个包就够了写代码时用了注解Spring运行的时候可能需要cglib生成代理类再往前写点事务又需要aopalliance的接口这些坑都靠报错来回试错补齐效率确实低。所以我的真实建议是手动方式只适合临时救急或者帮助你理解依赖结构但凡有条件还是回Maven怀抱。手动导包成功跑通之后你反而能体会Maven帮你省了多少事。5. 实战中最常见的坑与排查方法5.1 Maven依赖下载慢或者卡住这个问题十个新手九个遇到。Eclipse创建Maven项目后右下角一直转圈Maven Dependencies里空空如也或者idea导入后爆红。根本原因是从中央仓库下载jar包的网络延迟太高。解决办法是修改Maven全局配置文件settings.xml添加镜像仓库地址。settings.xml一般在Maven安装目录的conf目录下也可能在用户目录的.m2目录下两种位置的作用域不同建议改全局的方便统一管理。在settings.xml的mirrors节点中加入mirrors mirror idmirror/id mirrorOf*/mirrorOf nameInternal Mirror/name url改成你本地能访问的仓库地址/url /mirror /mirrors改完重启Eclipse右键项目 - Maven - Update Project强制刷新依赖一般就能解决。如果你所在的环境无法访问外网那只能走第四章的传统方式或者找内部搭建的私服仓库地址。5.2 启动报NoClassDefFoundError或者ClassNotFoundException这是手动导包方式最经典的报错出现位置通常是这样一句Exception in thread main java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext看到这个说明Spring容器的jar包根本没加载进来。排查思路先检查Referenced Libraries里有没有对应的jar包如果没有说明你漏导了。如果用的是Maven项目先看Maven Dependencies里有没有spring-context相关jar如果没有去Maven仓库的本地缓存路径看jar包是否下载成功路径一般是用户目录/.m2/repository。如果本地仓库里没有找到把pom.xml关闭再打开或者直接右键项目 - Maven - Update Project。Eclipse里的Maven项目有时候就是需要手动刷新这种“项目在但依赖没生效”的情况并不少见。5.3 配置文件路径引发的加载失败报错内容像这样Exception in thread main org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [applicationContext.xml]大部分原因不是文件不存在而是路径不对。ClassPathXmlApplicationContext(applicationContext.xml)会从classpath的根目录找配置Eclipse里Maven项目编译后的路径是target/classes。如果你的xml文件放在了src/main/java下面编译后确实也会出现在classes根目录但这是不规范的容易和java源码混在一起。正确做法是放在src/main/resources下Maven会自动把resources里的文件复制到target/classes根目录。还有个细节文件名前面不要写斜杠写/applicationContext.xml会从文件系统根路径找必错。5.4 控制台没有任何日志输出Spring 5内部使用的日志体系是spring-jcl它本身只是桥接API需要你提供具体的日志实现才能看到容器启动的过程信息。如果控制台只有输出结果没有那些Spring启动横幅和bean初始化日志说明日志实现没配置。对于学习和调试来说能看到容器加载日志其实很有帮助。最简单的办法是加入logback或者log4j2依赖。以logback为例在pom.xml中加dependency groupIdch.qos.logback/groupId artifactIdlogback-classic/artifactId version1.2.13/version /dependency然后在src/main/resources下创建logback.xml配置一个控制台输出器就能看到Spring容器启动时的详细日志包括bean创建顺序、依赖注入过程。这些日志在排查配置问题时价值巨大。不过要提醒一点别为了看日志引入一堆没用的依赖logback一个足够。5.5 版本不兼容Spring 6.x遇到JDK 8如果你用了Spring 6.x的依赖坐标运行main方法时控制台会直接提示UnsupportedClassVersionError意思是编译版本高于运行版本。Spring 6要求JDK 17起步而很多教学机器还停留在JDK 8等于强行错配。处理办法有两个要么把Spring版本降回5.3.x看看要么升级JDK到17以上。对于学习Spring传统配置方式我建议直接用Spring 5.3.x组合没必要在版本搭配这种环节给自己增加难度。5.6 顺手给一张排查速查表现象常见原因解决方式下载依赖一直转圈中央仓库网络慢配置镜像仓库并更新项目NoClassDefFoundErrorjar包缺失或Build Path未刷新检查依赖列表Maven Update ProjectBeanDefinitionStoreException配置文件路径错误把xml放在resources根目录去掉文件名前斜杠控制台无Spring日志缺日志实现引入logback并配置控制台输出UnsupportedClassVersionErrorSpring与JDK版本不匹配统一用JDK 8 Spring 5.3.x或JDK 17 Spring 6.x中文属性在控制台乱码工作区编码不是UTF-8Eclipse设置General Workspace编码为UTF-85.7 一个容易忽略的问题Eclipse工作区编码Spring配置文件和Java源码里包含中文比如张三如果控制台输出乱码或者报编码错误很可能是Eclipse的默认编码和文件编码不一致。建议在Window - Preferences - General - Workspace里把Text file encoding设置为UTF-8同时保证XML文件头的encoding属性也是UTF-8。这样配置一次后面项目基本不会再被中文乱码恶心到。6. 最后分享一些我自己摸索出来的经验Spring在Eclipse环境下跑通说难不难说简单也绝不是双击两下就好。我给准备走这条路的人一个建议不要跳步。第一次配置老老实实从XML方式创建bean开始跑通后再尝试注解方式。很多新手一上来就写Component、Autowired报错了也不知道是容器没扫描到、还是依赖没注入成功、还是jar包少了茫茫然。调试的时候也有个技巧你可以在MainApp里给new ClassPathXmlApplicationContext(...)这行代码打断点然后以Debug方式运行展开context对象内部结构能看到一个beens容器里所有已注册的BeanDefinition。其中有id为user的定义、有scope默认单例、有property的配置值。这一眼看过去比背十遍“Spring容器管理bean生命周期”都管用。还有多利用Eclipse自带的Spring工具视图。如果你装了Spring Tool Suite插件双击applicationContext.xml会出现一个beans页面左侧能看到你定义的所有bean点开能看属性具体值写错了也能立刻发现。这个功能很多教程都没提但实际调试时非常顺手。最后再讲一个思路上的建议先别急着学Spring Boot。Boot确实“快”一个依赖加一个注解项目就起来了但它把你和原理隔开了。遇到问题你完全不知道底层是IoC还是自动装配在起作用。在Eclipse里手动配置一次原生的Spring从XML到容器启动哪怕只是跑通一个bean输出你收获的东西都远比表面看起来多得多。往后你在任何Spring体系的项目里遇到诡异报错脑子里都能浮现出“容器、Bean、依赖注入”这三个词那就是你真正开始懂Spring的时刻。
阅读完成 · 觉得有帮助?
咨询建站