Spring框架与Maven的使用指南
1. 图书管理系统功能选项
在图书管理系统中,提供了以下功能选项:
1. 查看图书详情
2. 添加图书
3. 更新图书
4. 删除图书
5. 退出
用户可以添加图书,然后对其进行查看、更新或删除操作。不过,该程序未包含异常处理代码,若输入错误信息(如需要数字时输入字符),程序将抛出异常。
2. Spring依赖注入之XML配置
2.1 添加依赖到pom.xml
要使用Spring框架,首先需在
pom.xml
文件中添加依赖,让Maven将合适的Spring库包含到项目中。以下是要添加的依赖标记:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
</dependencies>
添加后,需构建项目以确保库被下载。
2.2 创建XML配置文件
在项目的
src/main
文件夹下创建
resources
文件夹,在该文件夹内创建
applicationContext.xml
文件。先在该文件中添加以下标记:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
这些标签用于设置文件,使Spring能读取并理解其中内容。接着添加
<bean>
标签来标识不同类及其关联,以下是一些无依赖关系的简单类的配置:
<bean id="io" class="com.sg.booktracker.ui.UserIOConsoleImpl"/>
<bean id="dao" class="com.sg.booktracker.dao.BookDaoMemoryImpl"/>
使用
id
字段在XML其他部分引用类,
class
字段是要注入类的全限定名,注意这里使用的是
Impl
版本的类,而非接口。
其他类的
bean
配置如下:
<bean id="view" class="com.sg.booktracker.ui.BookView">
<constructor-arg ref="io"/>
</bean>
<bean id="service" class="com.sg.booktracker.service.BookService">
<constructor-arg ref="dao"/>
</bean>
<bean id="controller" class="com.sg.booktracker.controller.BookController">
<constructor-arg ref="service"/>
<constructor-arg ref="view"/>
</bean>
由于这些类的构造函数需要依赖项,所以使用
<constructor-arg>
标签,
ref
字段引用要注入类的
id
。
2.3 更新App类
最后,更新
App
类的
main
方法:
public static void main(String[] args) {
ApplicationContext appContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
BookController controller = appContext.getBean("controller", BookController.class);
controller.run();
}
第一行加载XML文件,
resources
目录便于Java读取数据,只需指定XML在类路径即可。
ApplicationContext
和
ClassPathXmlApplicationContext
类需从Spring库导入。加载后获取
controller
的
bean
,其背后会在内存中构建所需的一切,包括依赖项及其依赖项。若运行代码出错,需重新构建项目以拉取合适的依赖项。
3. Spring依赖注入之注解配置
3.1 添加依赖
使用注解配置时,同样要在
pom.xml
文件中添加依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
</dependencies>
添加后进行构建,确保库被下载并添加到项目中。
3.2 类注解
在XML配置中作为
bean
的类,需添加注解让Spring确定要实例化的类。以
UserIOConsoleImpl
类为例,在类声明前添加
@Component
注解:
@Component
public class UserIOConsoleImpl implements UserIO {
该注解告知Spring在内存中实例化此类,以便在其他地方注入,注解需从Spring库导入。同样,对
BookDaoMemoryImpl
类也添加
@Component
注解:
@Component
public class BookDaoMemoryImpl implements BookDao {
对于有依赖关系的类,如
BookView
类,除了
@Component
注解,还需在构造函数前添加
@Autowired
注解:
@Component
public class BookView {
private UserIO io;
@Autowired
public BookView(UserIO io) {
this.io = io;
}
}
也可将
@Autowired
注解直接放在
io
字段上:
@Component
public class BookView {
@Autowired
private UserIO io;
}
两种方式都有效。对
BookService
和
BookController
类也进行类似配置:
@Component
public class BookService {
private BookDao dao;
@Autowired
public BookService(BookDao dao) {
this.dao = dao;
}
}
@Component
public class BookController {
private BookService service;
private BookView view;
@Autowired
public BookController(BookService service, BookView view) {
this.service = service;
this.view = view;
}
}
使用构造函数自动注入可避免运行时出现空资源问题。
3.3 修改main方法
修改
App
类的
main
方法:
public static void main(String[] args) {
AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext();
appContext.scan("com.sg.booktracker");
appContext.refresh();
BookController controller = appContext.getBean("bookController", BookController.class);
controller.run();
}
这里使用
AnnotationConfigApplicationContext
类,需从Spring库导入。实例化后,指定从
com.sg.booktracker
包开始扫描注解,调用
refresh
方法时,Spring会检查该包及其子包中的类的注解,将
@Component
注解的类在内存中创建,并在看到
@Autowired
处注入依赖项。由于注解时未设置
id
,默认
id
是类名的驼峰形式,如
BookController
的默认
id
是
bookController
。
4. Spring依赖注入总结
-
需将外部库作为依赖项添加到Maven的
POM文件中。 - Spring应用上下文可使用XML或注解进行设置。
- 使用Spring应用上下文时,需读取XML文件或扫描注解。
- 注解在当今Java开发中更为常用。
5. 引入Maven
5.1 IDE内置构建管理工具的不足
在开发中,IDE内置的构建管理工具对于小型、独立且依赖外部库较少的项目能正常工作,但对于大型、多开发者项目存在以下缺点:
- 团队成员必须使用相同的IDE(如NetBeans)。
- 所有外部JAR文件需在项目中直接引用,并手动复制到每个开发者的机器上。
- 无法很好地管理所需外部库的版本。
- 无法在IDE之外构建项目,严重限制了团队在自动化构建机器以及将项目构建和部署到QA、性能测试和生产环境的选择。
5.2 Maven的优势
Maven是一个项目管理框架,提供独立于IDE的构建和依赖管理工具,可解决上述问题。
6. Maven学习目标
- 描述Maven。
- 解释项目对象模型(POM)。
- 解释Maven如何进行依赖管理。
- 概述Maven生命周期。
7. 什么是Maven
Maven自称为项目管理框架,致力于从一处管理项目的构建、报告和文档。其构建管理是声明式而非任务导向的,有内置生命周期,只需声明要做的事,无需说明如何做。同时,Maven的依赖管理也是声明式的,告知Maven所需的库(包括版本号),它会确保这些库对代码可用。
8. 项目对象模型(POM)
Maven基于项目对象模型(POM),定义在
pom.xml
文件中。该文件包含项目依赖的所有库的声明,还可包含Java版本等项目级设置。以下是一个典型的
POM
文件:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sg</groupId>
<artifactId>MeanMedianMode</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>MeanMedianMode</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>5.6.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>mean-median-mode</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
8.1 项目标识
-
groupId:传统上是项目的基础包,但并非强制要求,用于标识项目所属的组织。 -
artifactId:项目打包后的文件名。 -
version:项目版本,在NetBeans中默认是1.0-SNAPSHOT,可设置为任意值。 -
packaging:指示项目的打包方式,目前通常是jar(Java Archive),若开发Web应用则为war(Web Archive)。 -
name:项目名称,不一定要与artifactId匹配。
8.2 依赖项
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>5.6.0</version>
<scope>test</scope>
</dependency>
</dependencies>
每个依赖项有单独的
<dependency>
标签嵌套在
<dependencies>
标签内。使用
scope
标签可限制库的使用范围,如
test
表示该库仅在运行单元测试时使用,打包或安装项目时不包含。
8.3 构建设置
<build>
<finalName>mean-median-mode</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
build
标签包含影响项目构建的设置,这里关注编译器插件的
source
和
target
标签,
source
表示项目源代码使用的Java版本,
target
表示项目运行的JVM版本。
9. 依赖管理
Maven的一大特性是依赖管理。在没有Maven时,开发者需手动识别、下载和包含项目依赖的所有库的JAR文件,并负责存储和管理这些文件。使用Maven时,开发者仍需识别项目依赖的库,但Maven会自动将所有依赖项获取到本地机器的中央仓库(位于
~/.m2
目录),所有Maven项目共享该仓库,每个库只需下载一次。此外,Maven还会自动处理传递依赖项,例如项目依赖库A,而库A又依赖库B和C,Maven会自动将这三个库下载到本地仓库,无需开发者指定或知晓。
10. Maven生命周期
Maven的项目生命周期是预定义但灵活的,多数项目使用预定义生命周期即可。生命周期由多个阶段(目标)组成,开发者常用的目标如下:
| 目标 | 说明 |
| ---- | ---- |
| compile | 编译项目源代码 |
| test-compile | 编译项目测试源代码 |
| test | 运行项目单元测试 |
| package | 构建并打包项目 |
| install | 将项目包安装到本地
.m2
仓库,该包可在其他项目中使用 |
11. Maven总结
- Maven是独立于IDE的构建管理工具。
- Maven是声明式框架,可声明要做的事而无需说明如何做。
-
Maven构建由项目对象模型表示,定义在
pom.xml文件中。 - Maven管理项目依赖的外部库,包括传递依赖项的管理。
- Maven有预定义的生命周期,由多个目标组成。
- 使用Maven而非IDE内置的构建管理工具,可让软件团队在选择IDE时有更多灵活性,并便于与自动化构建和部署服务器集成。
12. Maven流程图
graph LR
A[开始] --> B[compile]
B --> C[test-compile]
C --> D[test]
D --> E[package]
E --> F[install]
F --> G[结束]
通过上述内容,我们了解了Spring框架的依赖注入以及Maven的使用,掌握这些知识有助于我们更高效地进行Java项目开发。
Spring框架与Maven的使用指南
13. Spring框架与Maven的结合应用
在实际的Java项目开发中,Spring框架与Maven常常结合使用,以提高开发效率和项目的可维护性。以下是它们结合使用的一些常见场景和操作步骤。
13.1 创建Spring项目并使用Maven管理依赖
-
步骤一:创建Maven项目
- 打开IDE(如IntelliJ IDEA或Eclipse),选择创建Maven项目。
-
在创建过程中,设置好
groupId、artifactId和version等信息。
-
步骤二:添加Spring依赖
在pom.xml文件中添加Spring相关的依赖,例如:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
</dependencies>
-
步骤三:配置Spring应用上下文
可以选择使用XML或注解进行配置。-
XML配置
:按照前面介绍的方法,创建
applicationContext.xml文件,并配置相关的bean。 -
注解配置
:在类上添加
@Component、@Autowired等注解,并在App类的main方法中使用AnnotationConfigApplicationContext进行扫描和加载。
-
XML配置
:按照前面介绍的方法,创建
13.2 使用Maven进行项目构建和部署
-
构建项目
在命令行中,进入项目根目录,执行mvn compile命令编译项目源代码,执行mvn test命令运行单元测试,执行mvn package命令构建并打包项目。 -
部署项目
执行mvn install命令将项目包安装到本地.m2仓库,该包可在其他项目中使用。如果需要将项目部署到生产环境,可以使用mvn deploy命令将项目包发布到远程仓库。
14. 常见问题及解决方法
在使用Spring框架和Maven的过程中,可能会遇到一些常见问题,以下是一些问题及解决方法。
14.1 Spring依赖注入失败
-
问题描述
:在运行项目时,出现
NoSuchBeanDefinitionException等异常,提示找不到要注入的bean。 -
解决方法
-
检查
applicationContext.xml文件或注解配置是否正确,确保所有需要注入的bean都已经正确定义。 -
检查
App类的main方法中是否正确加载了Spring应用上下文。 - 检查依赖项的版本是否兼容,可能需要调整依赖项的版本。
-
检查
14.2 Maven依赖下载失败
-
问题描述
:在执行
mvn命令时,出现依赖下载失败的错误信息。 -
解决方法
- 检查网络连接是否正常,确保可以访问Maven中央仓库。
-
清理本地
.m2仓库中的缓存文件,然后重新执行mvn命令。 -
可以尝试更换Maven仓库的镜像源,在
settings.xml文件中添加以下配置:
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
15. 最佳实践建议
为了更好地使用Spring框架和Maven进行Java项目开发,以下是一些最佳实践建议。
15.1 Spring框架使用建议
- 合理使用注解 :在大多数情况下,使用注解进行依赖注入和配置可以提高代码的可读性和可维护性。
- 遵循单一职责原则 :每个类和方法应该只负责单一的功能,避免类和方法过于复杂。
- 使用接口和抽象类 :通过定义接口和抽象类,可以提高代码的灵活性和可扩展性。
15.2 Maven使用建议
- 管理好依赖版本 :定期检查和更新依赖项的版本,确保使用的是最新的稳定版本。
- 使用插件 :Maven提供了许多插件,可以帮助我们完成各种任务,如代码检查、打包、部署等,合理使用这些插件可以提高开发效率。
- 遵循Maven生命周期 :按照Maven的生命周期进行项目构建和部署,确保项目的稳定性和可重复性。
16. 总结回顾
通过本文的介绍,我们详细了解了Spring框架的依赖注入(包括XML配置和注解配置)以及Maven的使用。Spring框架通过依赖注入实现了松耦合的设计,提高了代码的可维护性和可测试性;Maven作为项目管理框架,提供了独立于IDE的构建和依赖管理工具,解决了大型项目开发中的诸多问题。
在实际开发中,我们应该根据项目的需求和特点,选择合适的配置方式和工具,结合最佳实践建议,提高项目的开发效率和质量。同时,要不断学习和掌握新的技术和方法,以适应不断变化的开发环境。
17. 对比表格
| 对比项 | Spring XML配置 | Spring注解配置 |
|---|---|---|
| 配置方式 |
使用XML文件定义
bean
和依赖关系
|
使用注解在类上定义
bean
和依赖关系
|
| 可读性 | XML文件可能会比较冗长,尤其是项目规模较大时 | 注解直接写在类上,代码更简洁 |
| 维护性 | 修改配置需要编辑XML文件,可能会影响其他配置 | 直接在类上修改注解,相对更方便 |
| 适用场景 | 适合大型项目,配置复杂且需要集中管理的情况 | 适合小型项目或快速开发,强调代码简洁性的情况 |
18. 总结流程图
graph LR
A[项目开始] --> B{选择配置方式}
B -->|XML配置| C[Spring XML配置]
B -->|注解配置| D[Spring注解配置]
C --> E[Maven管理依赖]
D --> E
E --> F[项目构建和部署]
F --> G[项目结束]
希望本文对大家在使用Spring框架和Maven进行Java项目开发时有所帮助。通过不断实践和总结,我们可以更好地掌握这些技术,开发出高质量的Java项目。
超级会员免费看
1701

被折叠的 条评论
为什么被折叠?



