likes
comments
collection
share

【Java】第一个 Spring 入门程序

作者站长头像
站长
· 阅读数 0

一、前言

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

二、内容

2.1 准备工作

(1)创建空项目

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

【Java】第一个 Spring 入门程序

(2)基础配置

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

【Java】第一个 Spring 入门程序

【Java】第一个 Spring 入门程序

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

【Java】第一个 Spring 入门程序

【Java】第一个 Spring 入门程序

(3)创建模块

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

【Java】第一个 Spring 入门程序

(4)添加 Spring 依赖

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

<!-- 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

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

package com.example.bean;

public class Student {

}

2.3 创建 Spring 配置文件

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

【Java】第一个 Spring 入门程序

起一个名字,比如 beans.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和类名:

<bean id="student" class="com.example.bean.Student" />

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

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

2.5 编写测试代码

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

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

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);
    }
}

运行结果:

com.example.bean.Student@3febb011

2.6 程序解析

【Java】第一个 Spring 入门程序

(1)id不可重复

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

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

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

【Java】第一个 Spring 入门程序

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

(2)底层机制

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

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

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

package com.example.bean;

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

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

【Java】第一个 Spring 入门程序

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

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

(3)配置文件名不固定

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

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

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("配置文件的路径");

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

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

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

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

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml","spring.xml");

这也是可以的。

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

【Java】第一个 Spring 入门程序

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

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

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

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

<bean id="currentDate" class="java.util.Date" />

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

Object dateBean = applicationContext.getBean("currentDate");

(6)指定返回的类型

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

Student student = applicationContext.getBean("student", Student.class);

(7)BeanFactory接口

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

【Java】第一个 Spring 入门程序

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

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

三、总结

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