初始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的体系结构

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

依赖注入
依赖注入(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配置文件的根元素是
属性 | 描述 |
---|---|
id | id属性是 |
name | name属性可以为Bean指定多个名称,每个名称之间用逗号或分号隔开。 |
class | class属性可以指定Bean的具体实现类,其属性值为对象所属类的全路径。 |
scope | scope属性用于设定Bean实例的作用范围,其属性值有:singleton(单例)、prototype(原型)、request、session和global session。 |
元素 | 描述 |
---|---|
使用 |
|
ref | ref是 |
value | value是 |
|
|
entry>元素是 |
<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.构造方法注入
使用构造方法注入时,在配置文件里,需要使用
基于注解的装配
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的
属性值 | 描述 |
---|---|
default(默认值) | 由 |
byName | 根据 |
byType | 根据 |
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对象销毁节点。