Spring 框架是一个分层架构,每个模块既可单独存在,又可与其他模块联合实现,其架构如下图所示:
Spring架构图
- Core 核心容器:提供依赖注入和Bean管理功能,主要组件是
BeanFactory
,它使用控制反转模式将应用程序配置和依赖规范与实际的应用代码分开; - Context:框架式的对象访问方法,扩展了
BeanFactory
的概念,增加了对国际化、事件传播,以及验证等的支持,此外还提供了许多企业服务及对模版框架集成的支持; - DAO:该层封装了对数据库的访问,并且处理了其抛出的错误消息,同时还基于AOP模块提供了事务管理;
- ORM:Spring支持多种ORM框架,简化了数据库操作。
- Web:建立于Context模块之上,提供了一个适合于Web应用的上下文。另外,这个模块还提供了一些面向服务支持,也提供了Spring和其它Web框架的集成;
- MVC:是一个全功能的构建 Web 应用程序的 MVC 实现,容纳了大量视图技术,如 JSP、Velocity、POI等;
- AOP:为Spring容器管理的对象提供了对面向切面编程的支持;
控制反转
控制反转(Inversion of Control)是一种设计思想,即由传统的在Bean对象内部直接获取依赖对象改为由容器创建并在Bean需要时注入依赖对象。对于Spring框架来说,就是由Spring容器来负责实例化、配置以及装载Bean对象并控制其生命周期。这样,有利于设计出松散耦合、方便灵活、便于复用的程序。
为了实现控制反转,Spring容器需要通过依赖注入(Dependency Injection)维护Bean之间的依赖关系。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
Bean的元数据配置
Bean以及Bean的那些依赖对象,都是容器使用元数据通过反射生成的。Bean的元数据主要包括实现类、属性信息、依赖关系、行为配置及创建方式,这些配置可以写到XML、Java注解或Java代码中。为了简化配置配置文件,让程序变得简洁并指明组件所在的层次,可以优先使用基于注解的Bean配置。但是对应第三方组件,无法在这些组件里加如注解使之成为Spring容器管理的Bean,这种情况下就需要基于XML或Java类进行配置。此外,配置比较复杂的Bean也可以使用基于Java类的配置。
一、IoC的概念
IoC,Inversion of Control,控制反转。
对象的协作关系由对象自己负责。
依赖注入:对象的协作关系有容器来建立。
二、IoC的类型
(1) 基于特定接口(侵入式方案)
(2) 基于set方法
(3) 基于构造器
属性名称 | 描述 |
---|---|
id | 是一个 Bean 的唯一标识符,Spring 容器对 Bean 的配置和管理都通过该属性完成 |
name | Spring 容器同样可以通过此属性对容器中的 Bean 进行配置和管理,name 属性中可以为 Bean 指定多个名称,每个名称之间用逗号或分号隔开 |
class | 该属性指定了 Bean 的具体实现类,它必须是一个完整的类名,使用类的全限定名 |
scope | 用于设定 Bean 实例的作用域,其属性值有 singleton(单例)、prototype(原型)、request、session 和 global Session。其默认值是 singleton |
constructor-arg | <bean>元素的子元素,可以使用此元素传入构造参数进行实例化。该元素的 index 属性指定构造参数的序号(从 0 开始),type 属性指定构造参数的类型(构造器注入) |
property | <bean>元素的子元素,用于调用 Bean 实例中的 Set 方法完成属性赋值,从而完成依赖注入。该元素的 name 属性指定 Bean 实例中的相应属性名(set方法注入) |
ref | <property> 和 <constructor-arg> 等元素的子元索,该元素中的 bean 属性用于指定对 Bean 工厂中某个 Bean 实例的引用 |
value | <property> 和 <constractor-arg> 等元素的子元素,用于直接指定一个常量值 |
list | 用于封装 List 或数组类型的依赖注入 |
set | 用于封装 Set 类型属性的依赖注入 |
map | 用于封装 Map 类型属性的依赖注入 |
bean生命周期
-
实例化:第 1 步,实例化一个 bean 对象;
-
属性赋值:第 2 步,为 bean 设置相关属性和依赖;
-
初始化:第 3~7 步,步骤较多,其中第 5、6 步为初始化操作,第 3、4 步为在初始化前执行,第 7 步在初始化后执行,该阶段结束,才能被用户使用;
-
销毁:第 8~10步,第8步不是真正意义上的销毁(还没使用呢),而是先在使用前注册了销毁的相关调用接口,为了后面第9、10步真正销毁 bean 时再执行相应的方法。
注解实现IOC
<!--告知spring在创建容器时要扫描的包,配置所需要的标签不是在bean约束中,
而是在一个名称为context的名称空间和约束中-->
<context:component-scan base-
package
=
"com.lujuan"
/>
和基于xml文件的配置类似,我们要学习的注解有一下几种类型(和前面的内容相互照应):
-
用于bean的创建于注册 @Component通用组件,@Controller,@Service, @Repository
被注解的java类当做Bean实例,Bean实例的名称默认是Bean类的首字母小写,其他部分不变。@Service也可以自定义Bean名称,但是必须是唯一的!
-
管理bean的作用范围 @Scope
-
管理bean的生命周期 @PostConstruct和@PreDestroy
-
进行bean对象的依赖注入 @Autowired,@Qualifier 【@Resource {按照名称。java注解}】
(1):相同点 @Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。 (2):不同点
a:提供方 @Autowired是Spring的注解,@Resource是javax.annotation注解,而是来自于JSR-250,J2EE提供,需要JDK1.6及以上。
b :注入方式 @Autowired只按照Type 注入;@Resource默认按Name自动注入,也提供按照Type 注入;
Autowired注解默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合**@Qualifier**注解进行限定,指定注入的bean名称。(例如实现了同一个接口的两个bean)
-
基本类型和String类型的依赖注入@Value
-
对于集合类型的依赖注入不能通过注解的形式完成,需要使用xml的方式完成
二、springMVC
所谓 MVC(Model、View、Controller),其实是一种软件设计范式,通过将 业务逻辑、数据、显示分离的方法来组织代码,最主要的目的是降低视图和业务逻辑代码之间的双向耦合。其中的各部分如下:
- Model(模型):数据模型,用于提供要展示的数据,因此包含数据和行为,现在一般分离为数据访问层(
Dao
)和服务层(Service
)。模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。 - View(视图):负责模型的展示,一般就是呈现给我们用户看的东西。
- Controller(控制器):接收用户请求,然后委托给模型进行处理(状态改变),处理后再将返回的模型数据反馈给视图,然后由视图负责展示,即
Controller
充当Model
和View
之间的信鸽。
Spring MVC 工作流程
- 如上图所示,首先,传入的请求(
request
)被工作在 前端控制器(front Controller
)的DispatcherServlet
接收并拦截; - 然后
DispatcherServlet
从 XML 配置文件中获取 处理器映射器(Handler Mapping
)的条目,处理器根据请求找到对应Handler
, 同时将请求转发给控制器(Controller
); - 接着 控制器(
Controller
)解析返回一个ModelAndeView
对象给DispatcherServlet
; - 最后
DispatcherServlet
根据控制器(Controller
)返回的对象去检查 XML 配置文件中对应的 视图解析器(ViewResolver
)条目,同时调用指定的视图组件,在前端呈现出视图(View
)。
SpringMVC执行流程:
1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。
3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
4.DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
5.执行处理器Handler(Controller,也叫页面控制器)。
6.Handler执行完成返回ModelAndView
7.HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
11.DispatcherServlet响应用户。
三、SpringBoot
① @SpringBootApplication
: Spring Boot
应用标注在某个类上说明这个类是SpringBoot
的主配置类,SpringBoot
就应该运行这个类的main
方法来启动SpringBoot
应用;这是一个组合注解。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
...
}
@SpringBootConfiguration 包含 注解 @Configuration
实际上@SpringBootApplication
是一个"三体"结构,重要的只有三个Annotation:
@Configuration
@EnableAutoConfiguration
@ComponentScan
1、
@Configuration
以前的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 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-lazy-init="true"> <!--bean定义--> </beans>
现在的JavaConfig配置是这样的,效果等同,标注了该注解说明就是一个配置类
@Configuration public class Application{ //bean定义 }
2.@ComponentScan
@ComponentScan的功能其实就是自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。我们可以通过basePackages等属性指定@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现从声明@ComponentScan所在类的package进行扫描,默认情况下是不指定的,所以SpringBoot的启动类最好放在root package下
创建一个配置类,在配置类上添加 @ComponentScan 注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>。spring就会去自动扫描base-package对应的路径或者该路径的子包下面的java文件,如果扫描到文件中带有@Service,@Component,@Repository,@Controller等这些注解的类,则把这些类注册为bean
Spring自动扫描组件或Bean介绍_Fighter168的专栏-CSDN博客
3、@EnableAutoConfiguration
:开启自动配置功能;
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
}
@AutoConfigurationPackage
:自动配置包 是由@Import(AutoConfigurationPackages.Registrar.class)组成
@Import(AutoConfigurationPackages.Registrar.class)
:Spring
的底层注解@Import
,给容器中导入一个组件;导入的组件由AutoConfigurationPackages.Registrar.class
指定。 也就是: 将主配置类(@SpringBootApplication
标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;,所以如果上面的controller
如果不是在主配置类所在的包(或者子包)下,就不能扫描到。
-
@Import(EnableAutoConfigurationImportSelector.class)
: 给容器中导入组件(不在同一个包下面的)EnableAutoConfigurationImportSelector
:导入哪些组件的选择器;将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中;会给容器中导入非常多的自动配置类(xxxAutoConfiguration
);就是给容器中导入这个场景需要的所有组件,并配置好这些组件;
springCloud
- Eureka 服务注册与发现
- Ribbon 客户端负载均衡
- Feign 声明式服务调用
- Hystrix 断路器
- Config 分布式配置
- Zuul 服务网关
-
Spring Cloud Config:配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git 以及 Subversion。
-
Spring Cloud Bus:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与 Spring Cloud Config 联合实现热部署。
-
Eureka:云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
-
Hystrix:熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。
-
Zuul:Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。
-
Archaius:配置管理 API,包含一系列配置管理 API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。
-
Consul:封装了 Consul 操作,Consul 是一个服务发现与配置工具,与 Docker 容器可以无缝集成。
-
Spring Cloud for Cloud Foundry:通过 Oauth2 协议绑定服务到 CloudFoundry,CloudFoundry 是 VMware 推出的开源 PaaS 云平台。
-
Spring Cloud Sleuth:日志收集工具包,封装了 Dapper 和 log-based 追踪以及 Zipkin 和 HTrace 操作,为 Spring Cloud 应用实现了一种分布式追踪解决方案。
-
Spring Cloud Data Flow:大数据操作工具,作为 Spring XD 的替代产品,它是一个混合计算模型,结合了流数据与批量数据的处理方式。
-
Spring Cloud Security:基于 Spring Security 的安全工具包,为你的应用程序添加安全控制。
-
Spring Cloud Zookeeper:操作 Zookeeper 的工具包,用于使用 Zookeeper 方式的服务发现和配置管理。
-
Spring Cloud Stream:数据流操作开发包,封装了与 Redis、Rabbit、Kafka 等发送接收消息。
-
Spring Cloud CLI:基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件。
-
Ribbon:提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。
-
Turbine:Turbine 是聚合服务器发送事件流数据的一个工具,用来监控集群下 Hystrix 的 Metrics 情况。
-
Feign:Feign 是一种声明式、模板化的 HTTP 客户端。
-
Spring Cloud Task:提供云端计划任务管理、任务调度。
-
Spring Cloud Connectors:便于云端应用程序在各种 PaaS 平台连接到后端,如:数据库和消息代理服务。
-
Spring Cloud Cluster:提供 Leadership 选举,如:Zookeeper,Redis,Hazelcast,Consul 等常见状态模式的抽象和实现。
-
Spring Cloud Starters:Spring Boot 式的启动项目,为 Spring Cloud 提供开箱即用的依赖管理。