【Java】第一个 Spring 入门程序

一、前言

本节,我们来编写一个 Spring 的入门程序,从头开始创建一个超级简单的 Spring 程序,帮助你理解 Spring 框架的基本概念和使用方法。

二、内容

2.1 准备工作

(1)创建空项目

首先,我们打开IDEA创建Empty Project:

(2)基础配置

然后,设置JDK版本和编译器版本:

接下来设置IDEA的Maven,关联自己的maven:

(3)创建模块

在空的工程spring_project中创建第一个模块:spring-01:

(4)添加 Spring 依赖

下面,我们来添加spring context的依赖,配置如下:

xml 复制代码
<!-- pom.xml 依赖配置 -->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.0.11</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

当加入spring context的依赖之后,会关联引入其他依赖:

  • spring aop:面向切面编程
  • spring beans:IoC核心
  • spring core:spring的核心工具包
  • spring jcl:spring的日志包
  • spring expression:spring表达式

2.2 创建 bean

下面,简单的,我们来编写一个学生类:

java 复制代码
package com.example.bean;

public class Student {

}

2.3 创建 Spring 配置文件

在 IDEA 中编写spring的配置文件很方便,我们按照模板来,如下所示:

起一个名字,比如 beans.xml

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>

2.4 配置 bean

在前面创建好的配置文件 beans.xml 中,我们进行bean的配置:

在 <beans></beans>标签中,我们添加子标签 <bean>,并指定bean的ID和类名:

xml 复制代码
<bean id="student" class="com.example.bean.Student" />

值得注意的是,这里的bean标签有两个重要属性:

  • id属性:对象的唯一标识
  • class属性:指定要创建的java对象的类名(必须是全限定类名)

2.5 编写测试代码

最后,我们来编写测试代码:

创建一个测试类(StudentTest),初始化Spring容器上下文,获取bean对象,然后打印Bean的信息。

Java 复制代码
package com.example.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class StudentTest {

    @Test
    public void testFirst(){
        // 初始化Spring容器上下文(解析beans.xml文件,创建所有的bean对象)
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
        // 根据id获取bean对象
        Object userBean = applicationContext.getBean("student");
        // 打印该对象
        System.out.println(userBean);
    }
}

运行结果:

bash 复制代码
com.example.bean.Student@3febb011

2.6 程序解析

(1)id不可重复

在Spring配置文件中,bean标签的id属性是用于唯一标识一个bean的,因此应该是唯一的,不应重复。

每个id必须是在Spring容器中唯一的,以便正确地识别和获取特定的bean。

我们来验证一下,比如现在在配置文件中定义了两个含有相同 id属性的bean标签,那么运行结果如下:

可以看到,Spring配置文件中的 id 属性是不能重名的。

(2)底层机制

Spring框架实际上就是一个IoC(Inversion of Control,控制反转)容器,它负责管理应用程序中的对象(称为bean)。

在底层,Spring创建对象时通常使用反射机制来调用无参数构造方法。这是Spring的默认行为,称为无参构造函数实例化。

我们来验证一下,在 Student 类中手动添加无参构造函数:

java 复制代码
package com.example.bean;

public class Student {
    public Student() {
        System.out.println("Student类的无参构造方法执行了...");
    }
}

现在,运行测试代码,结果如下:

可以看到,创建对象时确实调用了Student类的无参数构造函数

需要注意的是,如果代码中没有写有参构造,也没有无参构造,编译器会调用默认的无参构造。但是!如果代码中写了有参构造,那么必须显示给出无参构造,否则会出错;

(3)配置文件名不固定

Spring配置文件的名字不一定非要叫做"beans.xml"。虽然本文中使用的配置文件名是"beans.xml",但Spring容器实际上不强制要求配置文件必须使用这个名称。

我们可以使用不同的文件名来命名Spring配置文件,只要你在创建Spring容器时明确指定了配置文件的名称或路径。

java 复制代码
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("配置文件的路径");

(4)可以有多个配置文件

我们可以拥有多个Spring配置文件,并且在一个应用程序中使用它们。

多个配置文件有助于将应用程序的配置分成更小的模块,使配置更易于管理和维护。Spring容器允许你加载多个配置文件,并合并它们的配置信息。

比如我们再写一个配置文件名为:spring.xml,然后在程序中引用它:

java 复制代码
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml","spring.xml");

这也是可以的。

为什么我们可以传入多个配置文件?我们来源码:

可以看到,有构造函数接受一个可变长度的参数configLocations,这就允许我们传递一个或多个配置文件的位置,Spring将加载这些配置文件并创建一个应用程序上下文

(5)也可以配置JDK中的类

在Spring的配置文件中,我们既可以配置自定义类,也可以配置JDK中的类,如java.util.Date。

比如,下面在Spring配置文件中配置一个使用java.util.Date的bean:

xml 复制代码
<bean id="currentDate" class="java.util.Date" />

这个配置会创建一个名为"currentDate"的bean,它的类型是java.util.Date,并且它是java.util.Date类的一个实例。我们可以在应用程序中使用这个bean来获取当前的日期和时间。

java 复制代码
Object dateBean = applicationContext.getBean("currentDate");

(6)指定返回的类型

getBean()方法返回的类型是Object,如果访问子类的特有属性和方法时,还需要向下转型。为了不手动向下转型,我们可以指定返回的类型:

java 复制代码
Student student = applicationContext.getBean("student", Student.class);

(7)BeanFactory接口

ApplicationContext的超级父接口是 BeanFactory 接口。

BeanFactory是Spring容器的基本接口,它提供了对 bean 的创建、获取和管理的核心功能。BeanFactory是一个轻量级容器,它支持懒加载(延迟加载)和使用XML配置文件或注解进行配置。它的主要职责是管理bean的生命周期和依赖关系。

ApplicationContext 扩展了BeanFactory的功能,提供了更多的功能,如国际化、事件传播、资源加载、AOP等。它也支持自动装配和使用更多的应用程序上下文事件。

三、总结

通过这个入门程序,我们已经了解了如何创建一个简单的Spring应用程序,配置bean,并使用Spring容器来管理它们。这是学习Spring框架的第一步,有助于掌握Spring的基本概念和使用方式。

相关推荐
Swot几秒前
上传一张 4MB 图片,我先后撞上了三层请求体限制
后端
聪明的笨猪猪1 分钟前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
IT_陈寒11 分钟前
Vite的HMR把我整不会了:一个生产环境的热更新坑
前端·人工智能·后端
OLRainM18 分钟前
实习复盘:大模型网关渠道质量评分实战(二)—— 报错了到底算谁的锅?流式归因与 Token 补账踩过的 8 个真坑
后端
愿有所息22 分钟前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
梦想恒远30 分钟前
Spring Boot + LangChain4j 统计 token 成本:ChatModelListener 实测与单价口径
spring boot·后端
秋饼41 分钟前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
努力的小郑1 小时前
数据查到了,回答去哪儿了?一次百炼 + LangChain 排查实录
后端·langchain·agent
SL_staff2 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
isfox2 小时前
Python 虚拟环境:别再把所有项目塞进一个"大仓库"了
后端