一、前言
本节,我们来编写一个 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的基本概念和使用方式。