48、Spring框架与Maven的使用指南

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 进行扫描和加载。
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项目。

先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值