赞
踩
Spring是一个轻量级的控制反转(Ioc)面向面切编程(AOP)容器的开源框架。降低了开发的难度、低入侵、解耦合、声明事务管理方便集成其他框架、容器
spring的大小和开销都是轻量级的
通过控制反转(Ioc)和依赖注入(DI)将对象的创建和属性赋值工作都交给spring处理,从而达到解耦合的目的
提供了 面向切面编程的功能,可以通过分离应用的业务逻辑与系统服务来进行内聚性的开发
因为包含管理对象的配置和生命周期,所以说是一个容器
将简单的组件配置、组合成为复杂的应用,所以说是框架
spring提供了ioc容器技术,容器会帮你管理依赖对象,就不需要自己创建和管理依赖对象了,更加轻松的实现了程序的解耦和
spring可以方便的集成其他框架,如Mybatis等,方便程序开发
spring提供了事务的支持
spring提供了面向切面编程,
1、解析类得到BeanDefinition
2、如果有多个构造方法,则要推断构造方法
3、确定好构造方法后,进行实例化得到一个对象
4、对对象中的加了@Autowired注解的属性进行属性填充
5、回调Aware方法,比如BeanNameAware,BeanFactoryAware
6、调用BeanPostProcessor的初始化前的方法
7、调用初始化方法
8、调用BeanPostProcessor的初始化后的方法,在这里会进行AOP
9、如果当前创建的bean是单例的则会把bean放入单例池
10、使用bean
11、Spring容器关闭时调用DisposableBean中destory()方法
容器概念、控制反转、依赖注入
实际上就是一个Map,里面存的是各种对象。
在项目启动的时候会从配置文件中读取bean节点,然后根据类的权限定名使用反射创建对象,放到map里。扫描到有(@repository、@service、@controller、@component)注解的类还是通过反射创建对象放到map里面。
这时候map中有各种对象了,接下来在代码中那里需要用到里面的对象的时候就通过依赖注入(DI)(如autowired,可根据id,也可以根据类型注入)
例如对象a依赖与对象b。
在没有使用ioc的时候,是对象a在初始化或者运行到某一点的时候需要使用对象b,就得自己去主动创建一个对象b,然后交给a去使用,这时候对象的创建和使用都得自己手动控制
在引入Ioc之后,a与b就没有直接的联系了,当对象a在运行的时候需要用到b,ioc容器 就主动创建一个对象B注入到对象A需要的地方。
对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”
对象的控制权都交给IOC容器了,他就相当于一个粘合剂将所有的对象粘合在一起使用。对象之间会失去直接联系。
获得依赖的过程配反转了,变成了由IOC的主动注入,依赖注入就是实现这个的方法,就是在IOC容器运行的时候动态的根据依赖关系将创建好的对象注入到需要的对象之中
系统是由很多不同的组件组成的。每个组件负责一块功能。然而在实际开发中,一个组件有时候不仅要实现自己的功能,还要实现一些额外的功能例如日志、事务管理等。这样就会使每个组件的开发变得复杂。
AOP经业务中的这些额外功能业务逻辑(日志、安全、事务等)封装成一个切面。哪个组件中需要用到这写额外增强功能就直接调用就可。每个组件只用完成自己的核心功能就行了。还有就是当这些额外的功能做一些改变的时候就直接修改增强功能的代码其他调用的地方就不需要改动。如果像之前那样耦合在一起的时候,还需要对每一个组件进行更改。
singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。该对象的生命周期是与Spring IOC容器一致的(但在第一次被注入时才会创建)。
prototype:为每一个bean请求提供一个实例。在每次注入时都会创建一个新的对象
request:bean被定义为在每个HTTP请求中创建一个单例对象,也就是说在单个请求中都会复用这一个单例对象。
session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
application:bean被定义为在ServletContext的生命周期中复用一个单例对象。
websocket:bean被定义为在websocket的生命周期中复用一个单例对象
global-session:全局作用域,global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同。
Spring事务底层是基于数据库事务和AOP机制的
⾸先对于使⽤了@Transactional注解的Bean,Spring会创建⼀个代理对象作为Bean
当调⽤代理对象的⽅法时,会先判断该⽅法上是否加了@Transactional注解
如果加了,那么则利⽤事务管理器创建⼀个数据库连接
并且修改数据库连接的autocommit属性为false,禁⽌此连接的⾃动提交,这是实现Spring事务⾮常重要的⼀步
然后执⾏当前⽅法,⽅法中会执⾏sql
执⾏完当前⽅法后,如果没有出现异常就直接提交事务
如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务
Spring事务的隔离级别对应的就是数据库的隔离级别
Spring事务的传播机制是Spring事务⾃⼰实现的,也是Spring事务中最复杂的
Spring事务的传播机制是基于数据库连接来做的,⼀个数据库连接⼀个事务,如果传播机制配置为需要新开⼀个事务,那么实际上就是先建⽴⼀个数据库连接,在此新数据库连接上执⾏sql
spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。
no:默认值,表示没有自动装配,应使用显式 bean 引用进行装配。
byName:它根据 bean 的名称注入对象依赖项。
byType:它根据类型注入对象依赖项。
构造函数:通过构造函数来注入依赖项,需要设置大量的参数。
autodetect:容器首先通过构造函数使用 autowire 装配,如果不能,则通过 byType 自动装配。
声明式事务:声明式事务也有两种实现方式,基于 xml 配置文件的方式和注解方式(在类上添加 @Transaction 注解)。
编码方式:提供编码的形式管理和维护事务。
- @Component 替换bean标签,创建对象
- @Controller action层
- @Service Service层
- @Repoditory Dao层
- @Autowired 属性自动注入(默认会根据属性类型从Spring容器中获取对象并赋值)
- @Qualifier(“bean的id”) 根据bean的id进行注入
- @Scope 默认为单例 可通过@Scope(“prototype”)设置为多例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3VYqdfNr-1629621569630)(image/image.png)]
(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4)DispatcherServlet通过HandlerAdapter处理器适配器调用处理器;
(5)执行处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewReslover视图解析器进行解析;
(9)ViewReslover解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet响应用户。
果 相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMto3eTF-1629621569634)(image/image_1.png)]
1)它是基于组件技术的。全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件.并且和Spring提供的其他基础结构紧密集成
(2)不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)
(3)可以任意使用各种视图技术,而不仅仅局限于JSP
(4) 支持各种请求资源的映射策略
(5)它应是易于扩展的
(1)前端控制器 DispatcherServlet(不需要程序员开发)
作用:接收请求、响应结果 相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
(2)处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的URL来查找Handler
(3)处理器适配器HandlerAdapter
注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
(4)处理器Handler(需要程序员开发)
(5)视图解析器 ViewResolver(不需要程序员开发)
作用:进行视图的解析 根据视图逻辑名解析成真正的视图(view)
(6)视图View(需要程序员开发jsp)
View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)
(1)在返回值前面加"forward:“就可以让结果转发,譬如"forward:user.do?name=method4”
(2)在返回值前面加"redirect:“就可以让返回值重定向,譬如"redirect:http://www.baidu.com”
spring boot 是为 spring 服务的,是用来简化新 spring 应用的初始搭建以及开发过程的。
配置简单
独立运行
自动装配
无代码生成和 xml 配置
提供应用监控
易上手
提升开发效率
@Import + @Configuration + Spring spi
自动配置类由各个starter提供,使用@Configuration + @Bean定义配置类,放到METAINF/spring.factories下
使用Spring spi扫描META-INF/spring.factories下的配置类
使用@Import导入自动配置类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oe8pFI9l-1629621569635)(image/image_2.png)]
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude{DataSourceAutoConfiguration.class})
@ComponentScan:Spring组件扫描。
r
使用spring + springmvc使用,如果需要引入mybatis等框架,需要到xml中定义mybatis需要的bean
starter就是定义一个starter的jar包,写一个@Configuration配置类、将这些bean定义在里面,然后在
starter包的META-INF/spring.factories中写入该配置类,springboot会按照约定来加载该配置类
开发人员只需要将相应的starter包依赖进应用,进行相应的属性配置(使用默认配置时,不需要配
置),就可以直接进行代码开发,使用对应的功能了,比如mybatis-spring-boot–starter,springboot-starter-redis
spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧
妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。
Eureka:服务注册于发现。
Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,
发起请求。
Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。
Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用
的隔离,避免了服务雪崩的问题。
Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。
SpringBoot中常见的注解
合,这三个注解是:
a. @SpringBootConfiguration:这个注解实际就是⼀个@Configuration,表示启动类也是⼀个配
置类
b. @EnableAutoConfiguration:向Spring容器中导⼊了⼀个Selector,⽤来加载ClassPath下
SpringFactories中所定义的⾃动配置类,将这些⾃动加载为配置Bean
c. @ComponentScan:标识扫描路径,因为默认是没有配置实际扫描路径,所以SpringBoot扫描的
路径是启动类所在的当前⽬录
的⽅法进⾏解析,将⽅法的名字做为beanName,并通过执⾏⽅法得到bean对象
spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多
线程的封装处理。
实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上
来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),
那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。