Spring 就是一个包含了众多工具方法的 IoC 容器。既然是容器那么它就具备两个最基本的功能
将对象存储到容器(Spring)中;
从容器中将对象取出来
在 Java 语言中对象也叫做 Bean,所以后面咱们再遇到对象就以 Bean 著称
一、创建 Spring 项目
使用 Maven 方式来创建⼀个 Spring 项目,创建 Spring 项目和 Servlet 类似,总共分为以下 3 步:
- 创建⼀个普通 Maven 项目
- 添加 Spring 框架支持(spring-context、spring-beans)
- 添加启动类
1、先创建一个 maven 项目
2、添加 spring 框架支持 (spring-context / spring-beans)
在项目的 pom.xml
中添加 Spring 框架的支持,xml 配置如下:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
从上述配置中可以看出,添加的框架有 spring-context:spring
上下文,还有 spring-beans
: 管理对象的模块
——如果一直不成功,可以配置国内的源:
设置 Settings & New Projects Settings 选中,配置文件 settings.xml
——导入成功:
3、创建一个启动类并添加 main
在创建好的项目 java 文件夹下创建一个启动类,包含 main 方法即可
public class App {
public static void main(String[] args) {
System.out.println("hello spring");
}
}
二、存储 Bean 对象
存储 Bean 分为以下 2 (/3) 步:
- 如果是第一次添加,先在 spring 项目中添加配置文件,非第一次此步骤省略
- 存储 Bean 之前,先得有 Bean 才行,因此先要创建一个 Bean 对象
- 在配置文件中将需要将创建的 Bean 对象注册到 Spring 容器中
1、添加配置文件
创建 spring-config.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、创建一个 Bean 对象
Bean 就是 Java 语言中的一个普通对象,创建 User
类,写一个 sayHi 方法,实现代码如下:
3、将 bean 通过配置文件注册到 spring 中
在创建好的项目中添加 Spring 配置文件 spring-config.xml
,将此文件放到 resources 的根目录下:
PS: id 可以不等于 class 里面的类名的,但是要尽量符合规范
类名使用大驼峰,bean id
通常使用的是小驼峰。假设类名是 UserInfo,那么通常情况下 id 它应该是 userlnfo
三、从 spring 中将 bean 对象读取出来
1、先得到 spring 上下文对象
——使用 ApplicationContext
2、通过上下文对象提供 getBean() 获取需要使用的 bean 对象
3、使用 bean 对象【可选步骤】
使用 bean 对象 调用我们上面在 User 中写得 sayHi 方法,运行结果:hello: 张三!
四、注意问题
1、ApplicationContext VS BeanFactory
1.1、对比
除了 ApplicationContext
之外,我们还可以使用 BeanFactory
来作为 Spring 的上下文,如下代码所示:
ApplicationContext
和BeanFactory
效果是⼀样的,ApplicationContext 属于 BeanFactory 的子类,它们的区别如下:
ApplicationContext VS BeanFactory:(常见面试题)
——相同点:
- 都可以实现从容器中获取 bean 对象,都提供了 getBean 方法
——不同点:
- 继承关系和功能方面来说:
- Spring 容器有两个顶级的接口:
BeanFactory
和ApplicationContext
- 其中
BeanFactory
只提供了基础的访问容器的能力getBean()
方法,而ApplicationContext
属于BeanFactory
的子类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化支持、资源访问支、以及事件传播等方面的支持。
- 从性能方面来说:
ApplicationContext
是一次性加载并初始化所有的 Bean 对象,而BeanFactory
是需要那个才去加载那个,因此更加轻量
1.2、验证
——创建 Article
类,代码如下:
package com.beans;
public class Article {
public Article() {
System.out.println("加载了 Article");
}
public void sayHi() {
System.out.println("hello Article");
}
}
——修改 User 类,代码:
package com.beans;
public class User {
public User() {
System.out.println("加载了 User");
}
public void sayHi(String name) {
System.out.println("hello: " + name + "!");
}
}
——将 Article 对象存储到容器中,在 spring-config.xml 中添加:
<bean id="article" class="com.beans.Article"></bean>
- 使用 ApplicationContext 得到上下文对象:
证实 ApplicationContext
是一次性加载并初始化所有的 Bean 对象
- 使用 BeanFactory 得到上下文对象:
运行程序,没有加载对象
BeanFactory
需要那个才去加载那个
4、getBean 方法的更多用法
1、使用 bean name 获取 bean
User user = (User) context.getBean("userInfo");
2、根据 bean type 获取 bean
User user = context.getBean(User.class);
- 写法简单,但容易出问题。当同一个类型被注入到 spring 中多次(多个) 时候,就会报错。
在配置文件中加入这两条:
<bean id="userInfo" class="com.beans.User"></bean>
<bean id="user" class="com.beans.User"></bean>
运行结果:
3、根据 bean name 和类型获取 bean
User user = context.getBean("user", User.class);
4、总结
- 操作容器之前,先要有容器,所以先要得到容器
- 存对象
- 创建 Bean(普通类)
- 将 Bean 注册(配置)到 spring-confing.xml 中
- 取对象
- 得到 Spring 上下文,并读取到 Spring 的配置文件
- 获取某⼀个 Bean 对象
- 使用 Bean 对象
操作流程如下图所示: