初始Spring

Spring介绍

String框架的核心技术

Spring是由Rod Johnson组织和开发的一个分层的Java SE/EE一站式(full-stack)轻量级开源框架。它最为核心的理念是IoC(控制反转)和AOP(面向切面编程),其中,IoC是Spring的基础,它支撑着Spring对JavaBean的管理功能;AOP是Spring 的重要特性,AOP是通过预编译方式和运行期间动态代理实现程序功能,也就是说可以在不修改源代码的情况下,给程序统一添加功能。

String框架的优点:

  • a.非侵入式设计

    b.降低耦合性

    c.支持AOP编程

    d.支持声明式事务

    e.方便程序的测试

    f.方便集成框架

    g.降低Java EE API的使用难度

Spring的体系结构

image-20230905221840272

Spring 框架主要有8大模块,每个大模块由多个或1个小模块组成。

  • 核心容器模块(Core Container)

    ​ 核心容器模块在Spring的功能体系中起着支撑性作用,是其他模块的基石。核心容器层主要由Beans模块、Core模块、Contex模块和SpEL模块组成。

    ​ (1)Beans模块。它提供了BeanFactory类,是工厂模式的经典实现,Beans模块的主要作用是创建和管理Bean对象。

    ​ (2)Core模块。它提供了Spring框架的基本组成部分,包括IoC和DI功能。

    ​ (3)Context模块。它构建于Beans模块和Core模块的基础之上,它可以通过ApplicationContext接口提供上下文信息。

    ​ (4)SpEL模块。它是Spring 3.0后新增的模块,提供了对SpEL表达式语言(Spring Expression Language)的支持,SpEL表达式语言是一个在程序运行时支持操作对象图的表达式语言。

  • 数据访问及集成模块(Data Access/Integration)

    数据访问及集成模块用于访问和操作数据库中的数据,它主要包含JDBC模块、ORM模块、OXM模块、JMS模块和Transactions模块。

    ​ (1) JDBC模块。它提供了一个JDBC的抽象层,消除了冗长的JDBC编码并能够解析数据库供应商特有的错误代码。

    ​ (2)ORM模块。它为主流的对象关系映射API提供了集成层,用于集成主流的对象关系映射框架。

    ​ (3)OXM模块。它提供了对XML映射的抽象层的支持,如JAXB、Castor等。

    ​ (4)JMS模块。它主要用于传递消息,包含消息的生产和消费。自4.1版本后,JMS模块支持与Spring-message模块的集成。

    ​ (5)Transactions模块。它的主要功能是事务管理。

  • Web模块

    ​ Web模块的实现基于APPlicationContext基础之上,它提供了Web应用的各种工具类,包括了Web模块、Servlet模块、WebSocket模块和Portlet模块。

    ​ (1) Web模块。它提供了针对Web开发的集成特性,如大部分文件上传功能等。此外,Web模块还包含一个HTTP客户端和Spring远程处理支持的Web相关部分。

    ​ (2)Servlet模块。它提供了Spring的模型、视图、控制器以及Web应用程序的REST Web服务实现。

    ​ (3)WebSocket模块。它是Spring 4.0以后新增的模块,它提供了WebSocket 和SockJS的实现,以及对STOMP的支持。

    ​ (4)Portlet模块。它类似Servlet模块的功能,提供了Portlet环境下的MVC实现。

  • 其他模块

​ (1) AOP模块。它提供了对面向切面编程的支持,程序可以定义方法拦截器和切入点,将代码按照功能进行分离,以降低程序的耦合性。

​ (2)Aspects模块。它提供了与AspectJ集成的支持。

​ (3)Instrumentation模块。它提供了对类工具的支持,并且实现了类加载器,该模块可以在特定的应用服务器中使用。

​ (4)Messaging模块。它是Spring 4.0以后新增的模块,它提供了对消息传递体系结构和协议的支持。

​ (5)Test模块。它提供了对程序单元测试和集成测试的支持。

Spring目录结构下文件夹

​ docs文件夹:该文件夹下存放Spring的相关文档,包括开发指南、API参考文档。

​ libs文件夹:该文件夹下存放开发所需的jar包和源码。整个Spring框架由21个模块组成,libs目录下Spring为每个模块都提供了三个压缩包,因此,libs文件夹下一共有63个jar包。这63个jar包分为三类。

​ schema文件夹:该文件夹下存放Spring各种配置文件的XML Schema文档。

控制反转

控制反转(Inversion of Control,缩写为IOC)是面向对象编程中的一个设计原则,用来降低程序代码之间的耦合度。在传统面向对象编程中,获取对象的方式是用new关键字主动创建一个对象,也就是说应用程序掌握着对象的控制权。耦合度偏高。

IOC控制反转机制指的是对象由Ioc容器统一管理,当程序需要使用对象时,可以直接从IoC容器中获取。这样对象的控制权就从应用程序转移到了IoC容器。IoC设计原则如图,它是借助于IoC容器实现具有依赖关系对象之间的解耦,各个对象类封装之后,通过IoC容器来关联这些对象类。

  • Spring提供了一个容器,称为IOC容器.

  • 被创建或被管理的对象在IOC容器中统称为Bean

image-20230905224922788

依赖注入

依赖注入(Dependency Inject,缩写DI)就是由IoC容器在运行期间动态地将某种依赖资源注入对象之中。例如,将对象B注入(赋值)给对象A的成员变量。依赖注入的基本思想是:明确地定义组件接口,独立开发各个组件,然后根据组件的依赖关系组装运行。

依赖注入和控制反转的比较

​ 依赖注入(DI)和控制反转(IoC)是从不同角度来描述了同一件事情。依赖注入是从应用程序的角度描述,即应用程序依赖IoC容器创建并注入它所需要的外部资源;而控制反转是从IoC容器的角度描述,即IoC容器控制应用程序,由IoC容器反向地向应用程序注入应用程序所需要的外部资源。这里所说的外部资源可以是外部实例对象,也可以是外部文件对象等。

依赖注入的类型

依赖注入的实现方式

​ 依赖注入的作用就是在使用Spring框架创建对象时,动态的将其所依赖的对象注入到Bean组件中。

构造方法注入

​ 构造方法注入是指Spring容器调用构造方法注入被依赖的实例,构造方法可以是有参的或者是无参的。Spring在读取配置信息后,会通过反射方式调用实例的构造方法,如果是有参构造方法,可以在构造方法中传入所需的参数值,最后创建类对象。

元素

​ 一个元素表示构造方法的一个参数,且定义时不区分顺序,只需要通过元素的name属性指定参数即可。元素还提供了type属性类指定参数的类型,避免字符串和基本数据类型的混淆。

属性setter方法注入

​ 属性setter方法注入是Spring最主流的注入方法,这种注入方法简单、直观,它是在被注入的类中声明一个setter方法,通过setter方法的参数注入对应的值。

Bean的配置

​ Spring容器支持XML和Properties两种格式的配置文件,在实际开发中,最常用的是XML格式的配置文件。XML是标准的数据传输和存储格式,方便查看和操作数据。在Spring中,XML配置文件的根元素是元素包含子元素,每个子元素可以定义一个Bean,通过元素将Bean注册到Spring容器中。

元素的常用属性

属性 描述
id id属性是元素的唯一标识符,Spring容器对Bean的配置和管理通过id属性完成,装配Bean时也需要根据id值获取对象。
name name属性可以为Bean指定多个名称,每个名称之间用逗号或分号隔开。
class class属性可以指定Bean的具体实现类,其属性值为对象所属类的全路径。
scope scope属性用于设定Bean实例的作用范围,其属性值有:singleton(单例)、prototype(原型)、request、session和global session。

元素的常用子元素

元素 描述
使用元素可以为Bean的属性指定值。
元素的作用是调用Bean实例中的setter方法完成属性赋值,从而完成依赖注入。
ref ref是等元素的属性,可用于指定Bean工厂中某个Bean实例的引用;也可用于指定Bean工厂中某个Bean实例的引用。
value value是等元素的属性,用于直接指定一个常量值;也可以用于直接指定一个常量值。
元素是等元素的子元素,用于指定Bean的属性类型为List或数组。
元素是等元素的子元素,用于指定Bean的属性类型为set。
元素是等元素的子元素,用于指定Bean的属性类型为Map。
entry>元素是元素的子元素,用于设定一个键值对。元素的key属性指定字符串类型的键。
<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">
    <!--使用id属性定义bean1,对应的实现类为com.itheima.Bean1-->
    <bean id="bean1" class="com.itheima.Bean1">
    </bean>
    <!--使用name属性定义bean2,对应的实现类为com.itheima.Bean2-->
    <bean name="bean2" class="com.itheima.Bean2"/>
</beans>

Bean的实例化

构造方法实例化
静态工厂实例化
实例工厂实例化
singleton作用域
作用域名城 描述
singleton 单例模式。在单例模式下,Spring 容器中只会存在一个共享的Bean实例,所有对Bean的请求,只要请求的id(或name)与Bean的定义相匹配,会返回Bean的同一个实例。
prototype 原型模式,每次从容器中请求Bean时,都会产生一个新的实例。
request 每一个HTTP请求都会有自己的Bean实例,该作用域只能在基于Web的Spring ApplicationContext中使用。
session 每一个HTTPsession请求都会有自己的Bean实例,该作用域只能在基于Web的Spring ApplicationContext中使用。
global session 限定一个Bean的作用域为Web应用(HTTPsession)的生命周期,只有在Web应用中使用Spring时,该作用域才有效。

Bean的装配方式(DI)

基于XML的装配

​ 在基于XML的装配就是读取XML配置文件中的信息完成依赖注入,Spring容器提供了两种基于XML的装配方式,属性setter方法注入和构造方法注入。下面分别对这两种装配方式进行介绍。

a.属性setter方法注入

​ 属性setter方法注入要求一个Bean必须满足以下两点要求。

​ (1)Bean类必须提供一个默认的无参构造方法。

​ (2)Bean类必须为需要注入的属性提供对应的setter方法。

b.构造方法注入

​ 使用构造方法注入时,在配置文件里,需要使用元素的子元素来定义构造方法的参数,例如,可以使用其value属性(或子元素)来设置该参数的值。

基于注解的装配

XML与注解装配的比较

​ 在Spring中,使用XML配置文件可以实现Bean的装配工作,但在实际开发中如果Bean的数量较多,会导致XML配置文件过于臃肿,给后期维护和升级带来一定的困难。为解决此问题,Spring提供了注解,通过注解也可以实现Bean的装配。

注解 描述
@Component 指定一个普通的Bean,可以作用在任何层次。
@Controller 指定一个控制器组件Bean,用于将控制层的类标识为Spring中的Bean,功能上等同于@Component。
@Service 指定一个业务逻辑组件Bean,用于将业务逻辑层的类标识为Spring中的Bean,功能上等同于@Component。
@Repository 指定一个数据访问组件Bean,用于将数据访问层的类标识为Spring 中的Bean,功能上等同于@Component。
@Scope 指定Bean实例的作用域。
@Value 指定Bean实例的注入值。
@Autowired 指定要自动装配的对象。
@Resource 指定要注入的对象。
@Qualifier 指定要自动装配的对象名称,通常与@Autowired联合使用。
@PostConstruct 指定Bean实例完成初始化后调用的方法。
@PreDestroy 指定Bean实例销毁前调用的方法。
自动装配

​ Spring的元素中包含一个autowire属性,可以通过设置autowire属性的值实现Bean的自动装配。

属性值 描述
default(默认值) 的上级元素的default-autowire属性值确定。
byName 根据元素id属性的值自动装配。
byType 根据元素的数据类型(Type)自动装配,如果一个Bean的数据类型,兼容另一个Bean中的数据类型,则自动装配。
constructor 根据构造函数参数的数据类型,进行byType模式的自动装配。
no 默认值,不使用自动装配,Bean依赖必须通过元素或ref属性定义。

Bean的生命周期

​ Bean的生命周期是指Bean实例被创建、初始化和销毁的过程。在Bean的两种作用域singleton和prototype中,Spring容器对Bean的生命周期的管理是不同的。在singleton作用域中,Spring容器可以管理Bean的生命周期,控制着Bean的创建、初始化和销毁。在prototype作用域中, Spring容器只负责创建Bean实例,不会管理其生命周期。

​ 在Bean的生命周期中,有两个时间节点尤为重要,这两个时间节点分别是Bean实例初始化后和Bean实例销毁前,在这两个时间节点通常需要完成一些指定操作。因此,常常需要对这两个节点进行监控。

​ 监控两个节点的方式有两种,一种是使用XML配置文件,一种是使用注解。

Spring容器提供了@PostConstruct用于监控Bean对象初始化节点,提供了@PreDestroy用于监控Bean对象销毁节点。

posted @ 2023-09-29 22:42  李z豪  阅读(42)  评论(0)    收藏  举报