spring框架学习(基于官方文档学习)
springFramework
1、了解spring
tip:从 Spring Framework 6.0 开始,Spring 需要 Java 17+
1.1、概述
-
Spring 使创建 Java 企业应用程序变得容易
-
Spring支持的应用场景非常广泛
-
Spring 是开源的
1.2、什么是spring(春天)
"spring"可以用来指代 Spring Framework 项目本身,它是一切的起点
Spring Framework 分为模块。核心是核心容器的模块,包括配置模型和依赖注入机制
1.3、历史
有兴趣去官网上看或者去网上搜一下
1.4、设计理念
Spring 框架的指导原则:
- 在每个级别提供选择。Spring 让您尽可能晚地推迟设计决策
- 包容不同的观点
- 保持强大的向后兼容性
- 关心API设计
- 为代码质量设定高标准
2、核心技术
2.1、IOC容器
2.1.1、Spring IOC容器和Bean介绍
-
控制反转 (IoC) 原则的 Spring Framework 实现,IoC 也称为依赖注入 (DI)
-
在这个过程中,对象仅通过构造函数参数、工厂方法的参数或在对象实例被构造或从工厂方法返回后设置的属性来定义它们的依赖关系(即它们使用的其他对象),然后容器在创建 bean 时注入这些依赖项
-
这个过程基本上是 bean 本身的逆过程(因此得名,控制反转),它通过使用类的直接构造或服务定位器模式等机制来控制其依赖项的实例化或位置
通俗来说就是IOC就是将控制对象创建的对象是创建对象的人,而不是中间有一个创建对象的过程
实现原理:
-
org.springframework.beans
和org.springframework.context
包是 Spring Framework 的 IoC 容器的基础 -
BeanFactory
接口提供了一种高级配置机制,能够管理任何类型的对象。ApplicationContext
是BeanFactory
的子接口 -
BeanFactory
提供了配置框架和基本功能,并在ApplicationContext
添加了更多企业特定的功能
在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean,bean 是由 Spring IoC 容器实例化、组装和管理的对象。否则,bean 只是应用程序中众多对象中的一个。Bean 以及它们之间的依赖关系反映在容器使用的配置元数据中
针对BeanFactory和ApplicationContext两个接口写一点小小的了解
- 这两个接口是IOC容器很重要的一个东西,比如ApplicationContext的实现类
ClassPathXmlApplicationContext
就是我们实例化每一个bean的一个实现类,这个在后面会提到 - 对于BeanFactory这个结构里面会有一个method,
getBean
,这个方法顾名思义,就是获取bean对象
2.1.2、容器概述
ApplicationContext就是一个容器,这个容器负责实例化,配置和组装bean,通过配置元数据获取相应的实例化的数据,可以通过XML,java注释等来进行配置
ApplicationContext,Spring 提供了该接口的多个实现
在独立应用程序中,通常创建 ClassPathXmlApplicationContext 或FileSystemXmlApplicationContext(通常不用这个)
虽然 XML 一直是定义配置元数据的传统格式,但可以通过提供少量 XML 配置以声明方式启用对这些额外元数据格式的支持,从而指示容器使用 Java 注释或代码作为元数据格式,这个就是通过注释来装配bean
容器的大致图样
2.1.3、配置元数据
Spring IOC 容器使用一种形式进行配置元数据。此配置元数据表示作为应用程序开发人员如何告诉 Spring 容器在您的应用程序中实例化、配置和组装对象(就是通过配置文件来进行对象的实例化,实例化过程由spring容器来进行)
这里首先进行最基本的一个配置方式的讲解-XML,之后会有基于java configuration和注释的形式进行配置,这种使用场景比较广泛
-
Spring 配置包含至少一个且通常不止一个容器必须管理的 bean 定义
-
基于 XML 的配置元数据将这些 bean 配置为
<bean/>
元素是顶级元素<beans/>
的一个子元素 -
而Java 配置通常使用
@Bean
在类中使用带注释的方法@Configuration
来进行配置 -
这些 bean 定义对应于构成的应用程序的实际对象
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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="..."> (1) (2)
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
(1):该id
属性是一个字符串,用于标识单个 bean 定义
(2):该class
属性定义 bean 的类型并使用完全限定的类名
2.1.4、实例化容器
提供给构造函数的位置路径或路径
ApplicationContext
是资源字符串,让容器从各种外部资源(如本地文件系统、Java CLASSPATH等)加载配置元数据
实例化容器格式,使用ApplicationContext接口中的ClassPathXmlApplicationContext实现类
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
至于ClassPathXmlApplicationContext这个实现类可以在API文档中查看相应的方法,这个就是使用了其中的一个构造方法,读取相应的配置文件
services.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- services -->
<bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
<property name="accountDao" ref="accountDao"/>
<property name="itemDao" ref="itemDao"/>
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions for services go here -->
</beans>
daos.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="accountDao"
class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions for data access objects go here -->
</beans>
在前面的示例中,服务层由PetStoreServiceImpl
类和类型为JpaAccountDao和JpaItemDao的两个数据访问对象组成(基于 JPA 对象关系映射标准)
property name
元素是指JavaBean属性的名称,元素ref
是指另一个bean定义的名称id
和元素之间的这种联系ref
表达了协作对象之间的依赖关系