首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java框架 Spring 核心机制

Java框架 Spring 核心机制

原创
作者头像
Java知音
修改于 2018-09-29 08:56:00
修改于 2018-09-29 08:56:00
9090
举报

概念

轻量级的(面向切面AOP)、(IOC控制反转)容器框架。

Spring优点

1.降低组件之间的耦合性

2.专注于自己业务逻辑,统一的行为(日志、安全等)抽象出来统一处理

3.易于单元测试

4.方便事物处理

5.Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部

6 . spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 

7 . spring属于低侵入式设计,代码的污染极低  

8 . 提供了单例模式支持。

Spring七个模块

Spring context

Spring AOP

Spring DAO

Spring ORM

Spring Web

Spring MVC

Spring Core

AOP和IOC

Aop

允许程序通过分离的应用业务逻辑与系统级别服务。程序员只需专注自己的业务逻辑,而不需要管系统级服务。容器中的对象能享有容器中的公共服务(日志、安全)。

原理

通过动态代理做到这一点。用到了代理模式,代理模式是一种静态代理,而动态代理就是利用反射和动态编译将代理模式变成动态的。得知被代理类后通过反射得知他的一切信息,然后动态编译成代理类的class文件(动态组装成代理类,生成java文件,再编译成class文件)。

优点

提供另外一种编程思路,可以把类似的行为抽离出来统一处理。

Ioc

依赖注入(DI)和控制反转(Inversion of Control)是同一个概念。控制权的反转,在程序中对象的控制权转到容器而不是程序员自己控制,促进了松耦合。依赖注入,将相互依赖的对象分离,在Spring配置文件中,描述他们的依赖关系,用到一个对象时注入,而不需要New一个对象。

原理

通过工厂+反射将我们的bean放到容器中,当我们想用某个bean的时候,只需要调用getBean("beanID")方法。

优点

解耦、统一管理bean,缺点占用内存多、构造对象慢

beanFactory与ApplicationContext

二者是父子关系

Spring的IoC容器就是一个实现了BeanFactory接口的可实例化类,它就是 Spring IoC 容器的真面目。ioc使用 BeanFactory 来实例化、配置和管理 Bean。

如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的躯体了,ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。

(1)MessageSource, 提供国际化的消息访问 

(2)资源访问,如URL和文件 

(3)事件传播特性,即支持aop特性

1.ApplicationContext接口继承BeanFactory接口,Spring核心工厂是BeanFactory ,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。

2.ApplicationContext是对BeanFactory扩展,他可以国际化处理、资源访问、事件传播。

Bean的生命周期

给大家推荐一个程序员学习交流群:863621962。群里有分享的视频,还有思维导图

群公告有视频,都是干货的,你可以下载来看。主要分享分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频。

建立

1 . Bean的建立

由BeanFactory读取Bean定义文件,并生成各个实例。

初始化

2 . 依赖注入

3.setBeanName()

4.setBeanFactory()

5.processBeforeInitialization()

初始化之前都会执行这个实例的processBeforeInitialization()方法。

6.afterPropertiesSet()

7.init-method

8.processAfterInitialization()

业务逻辑

9.使用Bean做一些业务逻辑

销毁

10.destroy()

11.destroy-method

Bean的作用域

1. Singleton: 这是默认的作用域,这种范围确保不管接受多少个请求,每个容器中只有一个bean的实例,单例模式有BeanFactory自身维护; 

2. Prototype: 原形范围与单例范围相反,为每一个bean请求提供一个实例; 

3. Request: 在请求bean范围内会为每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收; 

4. Session: 与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效;

Servlet生命周期

1. 初始化阶段 调用init()方法

2. 响应客户请求阶段 调用service()方法

3. 终止阶段 调用destroy()方法

设值注入和构造注入及其区别

设值注入:类中定义setter()方法,在配置文件中注入参数

property name="country" value="China" />  

构造注入:类中声明一个构造方法,并在此方法的参数中定义要注入的对象。

设值注入优点

1. 与传统的JavaBean的写法更相似,程序开发人员更容易理解、接受,依赖关系显得更加直观、自然。

2. 对于复杂的依赖关系,如果采用构造注入,会导致构造器过于臃肿,难以阅读。而设值注入不会

三、在某些属性可选的情况下,多参数的构造器更加笨重。

构造注入优点

1. 构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。

2. 对于依赖关系无须变化的Bean,构造注入更有用处。

建议:采用设值注入为主,构造注入为辅的注入策略。对于依赖关系无需变化的注入,尽量采用构造注入;而其它的依赖关系的注入,则考虑设值注入。

Spring实例化bean的三种方法

1.通过构造函数

2.通过静态工厂方法

factory-method="静态方法"/>

3.通过实例工厂方法

    factory-method="createClientServiceInstance"/>

Bean的参数有id、class、factory-bean、factory-method等

Spring事物管理简单介绍

包括声明式事务和编程式事务,编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活,最大的好处是大大减少了代码量。编程式不常用,接下来介绍声明式事务管理。

声明式事务管理建立在AOP之上的,动态代理实现其机制(不改变源码,对原有的功能动态扩展)。声明式事务管理使业务代码不受污染,这正是spring倡导的非侵入式的开发方式。声明式事物处理也有五种不同的配置方式,单常用的是基于 @Transactional注解的声明式事务管理。此时在DAO上需加上@Transactional注解,在需要事务处理的类或方法上都可以加。

Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。

TransactionDefinition接口定义了四种事物属性是我们需要知道的

事物传播行为

在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。

TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。

TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。

TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。

TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

事物隔离级别

TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。

TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读,不可重复读和幻读,因此很少使用该隔离级别。比如PostgreSQL实际上并没有此级别。

TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。

TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读。

TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

事务超时

所谓事务超时,就是指一个事务所准许实行的最长时辰,假定跨越该时辰限制但事务还没有完成,则自动回滚事务。

事务只读属性

只读事务用于客户代码只读但不修改数据的情形,只读事务用于特定情景下的优化,比如使用Hibernate的时候

SpringMVC流程

给大家推荐一个程序员学习交流群:863621962。群里有分享的视频,还有思维导图

群公告有视频,都是干货的,你可以下载来看。主要分享分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频。

用户发送请求至前端控制器DispatcherServlet

DispatcherServlet收到请求调用HandlerMapping处理器映射器。

处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

DispatcherServlet选择合适的HandlerAdapter处理器适配器调用处理器

执行处理器(Controller,也叫后端控制器)。

Controller执行完成返回ModelAndView

HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet

DispatcherServlet将ModelAndView传给ViewReslover视图解析器

 ViewReslover解析后返回具体View

DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。

DispatcherServlet响应用户

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
Centos7.9版本安装collectd并开启写入rrd文件功能
Collectd是一款开源的系统统计守护进程,用于收集、处理和存储各种系统性能指标。它可以在多个操作系统上运行,并且支持许多不同类型的插件来收集各种数据。
刘大猫
2025/02/06
1060
自建ceph yum源
新手小白教程之如何在内网环境构建yum源 准备好一台新安装好的CentOS7 机器,不要安装任何软件包。
用户1260683
2019/11/06
2.5K0
Linux 本地yum源配置 (详简篇)
Linux 本地 YUM 源是指在本地服务器上创建的 YUM 源。本地 YUM 源可以用于以下目的:
神秘泣男子
2024/06/03
5.6K0
Linux 本地yum源配置 (详简篇)
CentOS本地源
冷影玺
2023/10/11
4340
ORACLE 19C RPM单机完整安装过程
ORACLE_HOME目录位于:/opt/oracle/product/19c/dbhome_1
Lucifer三思而后行
2021/08/17
1.2K0
根据命令来搜索软件包
使用一个名的时候发现命令未安装,但是又不知道命令的安装包什么,可以使用如下命令。 yum provides “/*/vim” [root@linux-01 ~]# vim 1.txt -bash: vim: 未找到命令 [root@linux-01 ~]# yum provides "/*/vim" 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.163.com * extras: m
嘻哈记
2022/01/11
8200
学习笔记0525----NFS文件共享和FTP服务器
用两台机器做实验,一台作为服务端(linux-001 192.168.141.128),一台作为客户端(linux-02 192.168.141.129)
嘻哈记
2020/11/24
3.2K0
Centos 7.9 安装Docker
1、检查当前的系统的内核版本 [root@SHMPL105100062 ~]# uname -r 3.10.0-1160.el7.x86_64 2、使用root权限更新yum包 [root@SHMPL105100062 ~]# yum -y update 已加载插件:fastestmirror Determining fastest mirrors * base: mirrors.neusoft.edu.cn * extras: mirrors.neusoft.edu.cn * updates:
xdd
2022/07/12
3.6K0
CentOS平台下的Docker安装与启动
1、参考 https://www.docker.com/docker-windows https://yq.aliyun.com/ziliao/60630 1、安装docker (1)搜索docker [root@node3 ~]# yum search docker Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras
程裕强
2022/05/06
5350
CentOS 使用 yum 方式安装 Nginx toc
你可以通过访问服务器的 IP 地址来验证 Nginx 是否正在运行。打开浏览器并输入:
訾博ZiBo
2025/01/05
1380
在Centos7 系统中使用supermin制作CentOS6 的Docker镜像
supermin 在Centos7 里面安装默认只能够构建Centos7 版本的基础镜像,如果想进行构建Centos6基础镜像需要对Linux系统进行稍微做一下修改,主要体现在yum的源方面。
拓荒者
2019/03/11
1.5K0
Flume监控之Ganglia安装与简单实践
写在前面: 博主是一名大数据的初学者,昵称来源于《爱丽丝梦游仙境》中的Alice和自己的昵称。作为一名互联网小白,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于起步阶段的萌新。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!个人小站:http://alices.ibilibili.xyz/ , 博客主页:https://alice.blog.csdn.net/ 尽管当前水平可能不及各位大佬,但我还是希望自己能够做得更好,因为一天的生活就是一生的缩影。
大数据梦想家
2021/01/27
7460
Flume监控之Ganglia安装与简单实践
Docker安装配置教程[通俗易懂]
之前docker很久就写了笔记了。后面因为家里有事,耽搁了一年。 现在把这部分笔记重新上传一下。大家看看。
全栈程序员站长
2022/11/07
1.5K0
Docker安装配置教程[通俗易懂]
每天学一个 Linux 命令(83):yum
yum 可以自动执行系统更新,包括依赖关系分析和基于“存储库”元数据的过时处理。它还可以执行新软件包的安装,旧软件包的删除以及对已安装或可用软件包以及其他命令/服务的查询。yum 命令类似于 apt-get 和 smart 等其他高级软件包管理器。
民工哥
2021/04/21
8030
RPM与YUM管理包程序
ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。
小柒吃地瓜
2020/04/23
2.8K0
记一次惨痛的教训—yum、rpm 原
因为系统配置硬件监控需要,在自己创建一个rpm包的时候系统没有rpmbuild工具,于是使用yum安装相关的包,但是安装过程中发现一些依赖包之间存在版本冲突,总是安装失败,于是手欠"rpm -e --nodeps -force libxml2-2.9.1-5.el7_1.2.i686"强制删除了该包,于是开始了一系列问题: 系统环境: centos7
阿dai学长
2019/04/03
1.9K0
yum 下载全量依赖 rpm 包及离线安装(终极解决方案)
通常生产环境由于安全原因都无法访问互联网。此时就需要进行离线安装,主要有两种方式:源码编译、rpm包安装。源码编译耗费时间长且缺乏编译环境,所以一般都选择使用离线 rpm 包安装。
叨叨软件测试
2020/04/14
25.5K0
Docker入门学习及其安装
1、Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上面,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。
别先生
2019/07/08
7220
centos上使用命令行搭建gitlab
这次我们安装最新的,即:13.4.1这个版本(yum install -y gitlab-ce.x86_64):
超级小可爱
2024/08/07
1620
centos上使用命令行搭建gitlab
7.7 yum下载rpm包
安装扩展源epe目录概要 yum install -y epel-release //安装扩展源 yum list |grep epel //过滤出epel包 yum下载rpm包目录概要 yum install -y 包名 --downloadonly //仅仅下载,而不安装 ls /var/cache/yum/x86_64/7/ //rpm包下载的位置 yum install -y 包名 --dow
运维小白
2018/02/06
3.9K0
相关推荐
Centos7.9版本安装collectd并开启写入rrd文件功能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档