一、Spring Framework的简介
1、概念
Spring Framework是Spring 基础框架,可以视为 Spring 基础设施,基本上任何其他 Spring 项目都是以 Spring Framework 为基础的。是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架 。
2、Spring FrameWork的特征
Spring Framework的特征主要体现在以下几个方面:
(1)非侵入式:使用 Spring Framework 开发应用程序时,Spring 对应用程序本身的结构影响非常小。对领域模型(domain)可以做到零污染;对功能性组件也只需要使用几个简单的注解进行标记,完全不会破坏原有结构,反而能将组件结构进一步简化。这就使得基于 Spring Framework 开发应用程序时结构清晰、简洁优雅。
(2)面向切面编程AOP:AOP——Aspect Oriented Programming,在不修改源代码的基础上增强代码功能。
(3)控制反转IOC:IOC——Inversion of Control,反转资源获取方向。把自己创建资源变成环境将资源准备好,我们享受资源注入。
(4)容器:Spring IOC 是一个容器,因为它包含并且管理组件对象的生命周期。组件享受到了容器化的管理,替程序员屏蔽了组件创建过程中的大量细节,极大的降低了使用门槛,大幅度提高了开发效率。
(5)组件化:Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用 XML 和 Java 注解组合这些对象。这使得我们可以基于一个个功能明确、边界清晰的组件有条不紊的搭建超大型复杂应用系统。
(6)声明式:很多以前需要编写代码才能实现的功能,现在只需要声明需求即可由框架代为实现。
(7)一站式:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。而且 Spring 旗下的项目已经覆盖了广泛领域,很多方面的功能性需求可以在 Spring Framework 的基础上全部使用 Spring 来实现。
3、Spring FrameWork的五大功能组件
功能模块 | 简介 |
Core Container | 核心容器,在spring环境下任何时候都要使用IOC容器 |
AOP&Aspect | 面向切面编程 |
Test | Spring提供了对junit或者是TestNG测试框架的整合 |
DataAccess&Integration | Spring提供对数据访问或集成的功能 |
Spring MVC | Spring提供了面向Web的集成功能能 |
二、Spring Container的简介
1、Spring Container的概念
1. 普通容器
普通容器只是负责存储数据(对象),例如我们在JavaSE中学习的数组、List、Map等等,可以让我们使用它存储数据、获取数据,不具备其它复杂的功能
2. 复杂容器
复杂容器不仅要负责存储对象,还需要具备创建对象、调用对象方法、管理对象生命周期、并且在一定情况下负责销毁对象。例如我们之前学习的Tomcat就是一个复杂容器,它能够负责创建Servlet、Filter、Listener等等对象,并且管理他们的生命周期,在生命周期的不同阶段调用他们的不同方法。而我们后续要学习的IOC容器也是一个复杂容器
2、IOC的概念
1、传统的方式创建对象
public User user=new User();
在传统创建对象的过程中:就以创建一个用户类对象来说,在创建完用户类型的变量后,我们需要手动new一个对象,如此这般,程序的耦合性提高。
2、IOC方式创建对象的方式
IOC,即控制反转,对象的使用者在使用对象时不需要创建对象,而是将对象反转给Spring容器创建和管理。其中,反转的意思是对象的创建工作,也就是说,在Spring容器的加持下,我们上述创建对象时就不需要new一个对象了,这一步容器会帮我们完成。
3、IOC容器的两种实现方式
Spring 的 IOC 容器就是 IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做 bean。在创建 bean 之前,首先需要创建 IOC 容器。Spring 提供了 IOC 容器的两种实现方式:
1. BeanFactory
这是 IOC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 框架本身,供Spring框架内部功能使用,不建议开发人员使用。
2. ApplicationContext
BeanFactory 的子接口,提供了更多高级特性。面向 Spring 框架的使用者,几乎所有场合都使用 ApplicationContext 而不是底层的 BeanFactory。
以后在 Spring 环境下看到一个类或接口的名称中包含 ApplicationContext,那基本就可以断定,这个类或接口与 IOC 容器有关。
3. ApplicationContext的主要实现类
类型名 | 简介 |
---|---|
ClassPathXmlApplicationContext | 通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象 |
FileSystemXmlApplicationContext | 通过文件系统路径读取 XML 格式的配置文件创建 IOC 容器对象 |
ConfigurableApplicationContext | ApplicationContext 的子接口,包含一些扩展方法 refresh() 和 close() ,让 ApplicationContext 具有启动、关闭和刷新上下文的能力。 |
AnnotationConfigApplicationContext | 可以实现基于Java的配置类加载Spring的应用上下文,创建IOC容器对象 |
WebApplicationContext | 专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对象,并将对象引用存入 ServletContext 域中。 |
三、Spring IOC
1、快速入门
(1)实现思路
(2)导入依赖
在pom.xml文件中引入以下依赖:
<dependencies>
<!--导入spring所需的所有jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
<!--junit测试框架-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!--spring整合junit测试框架-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
</dependencies>
(3)创建组件类
创建一个Book实体类
package com.atshen.entity;
public class Book {
private String name;
private String author;
private String price;
public Book() {
}
public Book(String name, String author, String price) {
this.name = name;
this.author = author;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price='" + price + '\'' +
'}';
}
}
(4)创建Spring配置文件并配置bean
<?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">
<!--
配置Book相对应的bean
每一个实现类都对应一个bean
name是bean的一个标识(在这里也可以使用id)
class的值为实现类对应的全限定名
-->
<bean name="book" class="com.atshen.entity.Book"></bean>
</beans>
(5)编写测试类
package com.atshen;
import com.atshen.entity.Book;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringDemo01 {
@Test
public void test01(){
//读取Spring配置文件的信息,并把配置文件的路径以参数的形式传到ApplicationContext中
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath:spring-config.xml");
//从容器中获取Book对象
Book bean = classPathXmlApplicationContext.getBean(Book.class);
//调用对象的方法
bean.setName("活着");
bean.setAuthor("余华");
bean.setPrice(45.6);
System.out.println(bean);
}
}
运行结果: