SpringBoot笔记_0
技术体系架构
单一架构
一个项目,一个工程,导出一个
war
包,在一个Tomcat
上运行
- 应用框架:
Spring
,SpringMVC
,Mybatis
SpringMVC
在表述层简化跟前端的交互Spring
每一层都有Mybatis
对JDBC
的封装,在持久化层简化操作
分布式架构
一个项目,多个模块,每个模块是一个
module
,每个工程都运行在自己的Tomcat
上,模块之间可以相互调用,每个模块可以看作是一个单一架构
SpringBoot
是对SSM
的封装和简化,节省创建过程SpringCloud
维护服务之间的互相调用
- 框架 =
jar
包 + 配置文件 = 反射 + 注解 + 设计模式
SpringFramework
主要功能模块
功能模块 | 介绍 |
---|---|
Core Container |
核心容器,Spring 环境下所有的功能都必须基于IoC 容器,实现对象管理 |
AOP & Aspects |
面向切面编程,对面向对象编程的完善 |
TX |
声明式事务管理 |
Spring MVC |
提供面向Web 应用程序的集成功能 |
IoC
核心容器
Spring
帮助完成组件管理IoC
,包括组件对象实例化,组件属性赋值,组件对象引用,组件对象存活周期管理…
- 组件一定是对象,对象未必是组件,组件是映射到应用程序中所有可重用组件的
Java
对象
IoC
概念(`Inversion of Control) 控制反转
- 主要针对对象的创建和调用控制而言,当应用程序需要使用一个对象的时候,不再是应用程序直接创建该对象,而是由
IoC
容器来创建和管理 - 控制权由应用程序转移到
IoC
容器,实现了反转。 - 基本通过依赖查找方式实现,即
IoC
容器维护着构成应用程序的对象,负责创建这些对象
DI
概念(Dependency Injection
) 依赖注入
- 组件之间传递依赖关系的过程中,将依赖关系在容器内部进行处理,不必在应用程序代码中硬编码对象之间的以来关系,实现对象之间的耦合
Spring
中DI
是通过XML
配置文件或者注解方式实现的,提供三种形式的依赖注入:Setter
方法注入,构造函数注入,接口注入
优点
- 解耦合,通过依赖注入减少依赖关系
- 提高可复用性
- 通过
XML
文件或者注解进行配置管理 - 通过
Spring
管理的对象可以使用框架其他功能(AOP
等)
IoC
容器具体接口和实现类
BeanFactory
接口提供了高级配置机制,可以管理任何类型对象,是Spring IoC
容器的标准化超接口ApplicationContext
是BeanFactory
的子接口,扩展了以下功能- 更容易与
Spring AOP
功能集成 - 消息资源处理(国际化)
- 特定于应用程序给予接口实现,比如
Web
应用程序的WebApplicationContext
- 更容易与
BeanFactory
提供了配置框架和基本功能,ApplicationContext
添加更多特定功能,后者是前者的完整超集
类型名 | 介绍 |
---|---|
ClassPathXmlApplicationContext |
通过读取类路径下的XML 格式配置文件创建IoC 容器对象,类路径下的resources |
FileSystemXmlApplicationContext |
通过文件系统路径读取XML 格式配置文件创建IoC 容器对象 |
AnnotationConfigApplicationContext |
通过读取Java 配置类创建IoC 容器对象 |
WebApplicationContext |
专门为Web 应用准备,基于Web 环境创建IoC 容器对象,将对象引入存入ServletContext 域 |
Spring
框架提供了多种配置方式XML
配置方式,最早期就有,配置和解析比较复杂,逐渐不使用- 注解方式,2.5版本开始存在,在
Bean
上使用注解替代XML
配置信息,将Bean
注册到Spring IoC
容器中 Java
配置类方式,3.0版本开始,使用Java
编写配置信息,通过@Configuration, @Bean
等注解实现Bean
和依赖关系的配置
IoC/DI
实现步骤
- 配置元数据
- 基于
XML
的配置元数据基本结构 id
属性标识单个Bean
定义的字符串,随便取,只需要不重复即可class
属性定义Bean
类型并使用全限定类名- 如果一个组件类,声明两个组件信息,默认是单例模式,会实例化两个组件对象
1 |
|
- 实例化
IoC
容器
- 提供给
ApplicationContext
构造函数的位置路径是资源字符串地址,允许容器从各种外部资源加载配置元数据
1 | //实例化ioc容器,读取外部配置文件,最终会在容器内进行IoC和DI动作 |
- 获取
Bean
(组件)
ApplicationContext
是一个高级工厂接口,能够维护不同的Bean
以及其依赖项的注册表- 使用
T getBean(String name, Class<T> requiredType)
可以检索Bean
实例
1 | //创建IoC容器对象,指定配置文件,IoC也开始实例组件对象 |
- 无参构造函数实例化配置只需要
<bean id class />
- 静态工厂类
IoC
配置<bean id class factory-method="静态工厂方法"/>
- 非静态工厂
IoC
配置<bean id="A" class/>
<bean id="B" factory-bean="A" factory-method="静态工厂方法"/>
FactoryBean
不需要再指定factory-method
FactoryBean<T>
提供了三种方法T getObject()
返回工厂的对象实例,返回值存储到IoC
容器中,在内部编写复杂的实例化过程boolean isSingleton()
如果FactoryBean
返回单例,则返回true
,默认实现返回true
,否则返回false
Class<?> getObjectType()
返回getObject()
方法返回的对象类型,不知道对象类型则返回null
- 用于代理类场景,第三方框架整合,复杂对象实例化
- 工厂
bean
的标识就是&id
FactoryBean
VS BeanFactory
FactoryBean
是Spring
中特殊的Bean
,可以在getObject()
工厂方法自定义逻辑创建Bean
,能够生产其他Bean
的Bean
- 容器启动时创建,实际使用通过调用
getObject()
得到生产的Bean
,可以自定义任何初始化逻辑 BeanFactory
是Spring
框架基础,顶级接口定义了容器的基本行为,例如管理bean
的生命周期,配置文件的加载和解析,bean
的装配和依赖注入- 提供了访问
bean
的方式,比如getBean()
指定获取bean
的实例,从不同来源获取bean
定义,将其转换为bean
实例 - 包含很多子类,比如
ApplicationContext
接口 - 前者创建
Bean
的接口,提供灵活初始化功能,后者管理bean
的框架基础接口,提供容器基本功能和bean
生命周期管理
Bean
依赖注入配置DI
- 配置
IoC
- 配置
DI
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33<!-- 无参构造函数声明IoC -->
<bean id="A" class />
<!-- 单构造参数注入 -->
<bean id="B" class>
<!-- value表示值,此处用不上 -->
<!-- ref 表示对另一个IoC对象的引用 -->
<constructor-arg ref="A">
</bean>
<!-- 多构造参数注入 -->
<bean id="B1" class>
<!-- 按照顺序赋值 -->
<constructor-arg value="">
<constructor-arg value="">
<constructor-arg ref="A">
</bean>
<bean id="B2" class>
<!-- 按照参数名 -->
<constructor-arg name="" value="">
<constructor-arg name="" value="">
<constructor-arg name="" ref="A">
</bean>
<bean id="B2" class>
<!-- 按照参数下标 -->
<constructor-arg index="1" value="">
<constructor-arg index="0" value="">
<constructor-arg index="2" ref="A">
</bean>
<!-- setter方法注入 -->
<bean id class>
<!-- name 是setter方法去掉set和,并且首字母小写的值 -->
<!-- value ref 同样二选一 -->
<property name ref value>
</bean>
Spring IoC
是一个高级容器,会先创建对象(IoC
),在进行赋值(DI
)- 因此先后顺序没有关系
读取`IoC组件信息
1 | // 方式1 创建时指定xml文件即可,可以指定多个,或者一个,也可以无参 |
Bean
组件的作用域和周期方法配置
- 组件类中定义方法,当
IoC
容器实例化和小会组件对象的时候调用 - 组件声明
<bean>
只是将Bean
信息配置给IoC
容器,在容器中,bean
标签对应的信息转成Spring
内部的BeanDefinition
对象 - 包含定义的信息
id,class,属性
,创建多少个Bean
实例对象,由Bean
的Scope
属性指定
作用域 | 含义 | 创建对象时机 | 默认 |
---|---|---|---|
singleton |
IoC 容器中,这个bean 对象始终为单例 |
IoC 容器初始化时 |
是 |
propotype |
IoC 容器中,这个bean 对象有多个实例 |
获取bean 时 |
否 |
request |
请求范围内有效的实例 | 每次请求 | 否 |
propotype |
会话范围内有效的实例 | 每次会话 | 否 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Sangs Blog!