Spring的工作原理(一)简介
Spring的工作原理
有时候面试的时候,面试官:会用Spring么?答:会,我们公司就用的Spring。面试官:Spring怎么进行控制反转的?切面怎么实现的?切面回用于哪一些场景?用到了哪一些设计模式?答:我知道怎么配,这个没研究过呀。面试官:...
知其然的人很多,但知其所以然,才能得心应手。让我们来研究一下Spring的原理:
一、Spring能用来做什么的?
简单来说:
第一,IOC控制反转。Spring就是一个容器,用来封装JavaBean的。
第二,AOP切面。切面利用动态代理实现面向切面编程。
二、解释一下这两个功能
2.1 图解一下IOC-网上搜刮
原来我们都是这么干的:
现在利用Spring的IOC可以这么来干:
Spring就是一个容器,用来封装JavaBean的。原来JavaBean都是自己new出来的,现在都交给Spring来进行管理。为什么需要交给Spring来管理,有什么好处么?这是因为随着业务量的增加,类也越来越多,代码之间的关联性也就是耦合性也越来越强,依赖和引用越来越多,维护起来就会相当困难。而Spring就可以充当这个中间人,你不需要关心其他对象是怎么创建的,只需要关心你自己的业务逻辑代码就可以了。你要对象,我就可以给你。这里就有了一个Spring的核心机制:IOC(Inversion of control)控制反转,就是用来干这个的。
2.2 图解一下AOP-网上搜刮
原来我们都是这么干的:
现在我们都是这么干的:
通过Spring来统一管理JavaBean可以说大大的解耦。同样,它还有另外一个功能,就是AOP(Aspect-OrientedProgramming)面向切面编程。简单来说:就是原来的业务在进行之前或者之后,都需要进行一些公共方法的调用或者处理,而这些代码都属于非业务层面的,比如:日志,性能监控,事务。将这些重复性的非业务逻辑代码抽取出来,使用动态代理技术将这些重复性代码织入到目标对象方法中,实现和原来一样的功能。这就是面向切面编程。
三、Spring预备知识
3.1 Spring体系结构
Spring框架提供了大约20个模块,可以根据应用程序要求来使用。
第一部分:核心容器:spring-core,spring-beans,spring-context,spring-context-support和spring-expression。
- Spring-core模块:提供了框架的基本组成部分,包括控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)功能。
- Spring-beans模块:提供了BeanFactory,是工厂模式的一个经典实现,Spring将管理对象称为Bean。
- Spring-context模块:建立在Core和Beans模块的基础之上,提供一个框架式的对象访问方式,是访问定义和配置的任何对象的媒介。ApplicationContext接口是Context模块的焦点。
- Spring-context-support模块:支持整合第三方库到Spring应用程序上下文,特别是用于高速缓存(EhCache、JCache)和任务调度(CommonJ、Quartz)的支持。
- Spring-expression模块:提供了强大的表达式语言去支持运行时查询和操作对象图。这是对JSP2.1规范中规定的统一表达式语言(Unified EL)的扩展。该语言支持设置和获取属性值、属性分配、方法调用、访问数组、集合和索引器的内容、逻辑和算术运算、变量命名以及从Spring的IOC容器中以名称检索对象。它还支持列表投影、选择以及常用的列表聚合。
第二部分:数据访问/集成
数据访问/集成层由JDBC、ORM、OXM、JMS和事务模块组成
- Spring-jdbc模块:提供了一个JDBC的抽象层,消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析。
- Spring-orm模块:为流行的对象关系映射(Object-Relational Mapping)API提供集成层,包括JPA和Hibernate。使用Spring-orm模块可以将这些O/R映射框架与Spring提供的所有其他功能结合使用,例如声明式事务管理功能。
- Spring-oxm模块:提供了一个支持对象/XML映射的抽象层实现,例如JAXB、Castor、JiBX和XStream。
- Spring-jms模块(Java Messaging Service):指Java消息传递服务,包含用于生产和使用消息的功能。自Spring4.1以后,提供了与Spring-messaging模块的集成。
- Spring-tx模块(事务模块):支持用于实现特殊接口和所有POJO(普通Java对象)类的编程和声明式事务管理。
第三部分:web层
Web层由Spring-web、Spring-webmvc、Spring-websocket和Portlet模块组成。
- Spring-web模块:提供了基本的Web开发集成功能,例如多文件上传功能、使用Servlet监听器初始化一个IOC容器以及Web应用上下文。
- Spring-webmvc模块:也称为Web-Servlet模块,包含用于web应用程序的Spring MVC和REST Web Services实现。Spring MVC框架提供了领域模型代码和Web表单之间的清晰分离,并与Spring Framework的所有其他功能集成。
- Spring-websocket模块:Spring4.0以后新增的模块,它提供了WebSocket和SocketJS的实现。
- Portlet模块:类似于Servlet模块的功能,提供了Portlet环境下的MVC实现。
四、Spring Hello World实例
让我们编写一个HelloWorld案例,进入Spring的开始....
4.1 新建一个Maven工程--目录结构如下
4.2 引入Spring相关Jar包--pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.mcb.spring</groupId><artifactId>Spring-HelloWorld</artifactId><version>1.0-SNAPSHOT</version><properties><!--版本控制--><spring-version>5.1.5.RELEASE</spring-version></properties><dependencies><!--Spring相关Jar包--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring-version}</version></dependency><!--测试类Jar包--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>
</project>
4.3 编写Bean类
package com.mcb.spring.vo;
public class HelloWorld {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void sayHello(){System.out.println(name+"说: Hello World");}
}
4.4 建立Beans.xml,将Bean类统一放在该文件中,供Spring进行管理。
<?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.xsd"><bean id="hello" class="com.mcb.spring.vo.HelloWorld"><property name="name" value="Sum"/></bean>
</beans>
4.5 编写测试类TestSpring.java
import com.mcb.spring.vo.HelloWorld;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestSpring {@Testpublic void sayHello(){ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");HelloWorld hello = (HelloWorld)context.getBean("hello");hello.sayHello();}
}
4.6 打印结果
4.7 总结
这其实就是一个IOC控制反转的过程,将自己的类(HelloWorld.java)交个Spring进行管理,需要生成自己的对象的时候,就去Spring里面获取一个。对应代码:
HelloWorld hello = (HelloWorld)context.getBean("hello");
这就达到了控制反转的目的。
接下来会详细的介绍关于IOC和Aop等方面的知识!
欢迎订阅关注公众号(JAVA和人工智能)
获取更多免费书籍、资源、文章
Spring的工作原理(一)简介相关推荐
- Spring MVC工作原理
转载自 Spring MVC工作原理 Spring MVC框架介绍 Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring M ...
- 春天到了,讲讲Spring的工作原理
一.春天到了,讲讲Spring的工作原理 在致力于优质IT知识出版分享的异步社区,有这么一本书--两版累计销售了近10w本,它可是完完全全靠着自己过硬的内容实力打出的这片天! 第二版已出版4年,基于S ...
- spring的工作原理介绍
作为一名Java Coder,无时无刻都在用Spring这个框架,可我们对他的了解有多少呢.下面我自己整理了一些思路,有问题还请大佬多多指教. Spring的工作原理就是让一个对象的创建不用new就可 ...
- Spring Mvc工作原理图解
Spring Mvc工作原理图解 先来一张图: 目前还是有些疑惑,因为是初学 思考了大半天,整理了初步的一些工作原理: 如图上所述: 1.用户(打开网站,输入网址url)发送请求. 2.用户的请求会通 ...
- Struts1、Struts2、Hibernate、Spring框架工作原理介绍
Struts1工作原理 Struts1工作原理图 1 .初始化: struts 框架的总控制器 ActionServlet 是一个 Servlet ,它在 web.xml 中配置成自动启动的 Serv ...
- AR增强现实技术特点、工作原理等简介
一.AR简介 AR(Agumented Reality 增强现实)体验的基本需求是如果在用户所处的真实世界空间与可视化建模的虚拟空间之间创建对应关系,当应用程序显示虚拟内容与实时摄像头图像,用户会感受 ...
- spring的工作原理
一. IoC(Inversion of control): 控制反转 1.IoC: 概念:控制权由对象本身转向容器:由容器根据配置文件去创建实例并创建各个实例之间的依赖关系 核心:bean工厂:在 ...
- Spring MVC工作原理 及注解说明
转载自 http://blog.csdn.net/shuyeshangdemayi/article/details/50259493 SpringMVC框架介绍 1) Spring MVC属于Spr ...
- spring的工作原理总结
1.spring原理 内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建.调用对象,Spring就是在运 ...
最新文章
- 一行命令实现录屏,支持热键和鼠标操作,区域、帧率、格式任你选择
- Retrofit 2.0:有史以来最大的改进
- 1105 Spiral Matrix (25 分)【难度: 一般 / 知识点: 模拟】
- 视觉激光融合——VLOAM / LIMO算法解析
- kaggle 训练自己的cycleGan
- php 设计模式 - 单例
- python常用函数中文_【python】python常用函数
- 1.1 字符串的旋转+1.2 字符串的包含
- php制作学生卡片,PHP基础案例一:展示学生资料卡
- Vue路由history模式踩坑记录:nginx配置解决404问题
- 动态规划——最长公共子序列(洛谷P1439)
- 我的docker随笔23:修改容器时区和添加中文支持
- 用 Python 硬核从头实现一个神经网络
- js 获取浏览器高度、浏览器宽度
- 选项卡切换 内容也跟着变 微信小程序
- IDEA返回上一步和下一步快捷键无效:Ctrl+Alt+左箭头 Ctrl+Alt+右箭头
- python matplotlib pColor 网格线 消除
- 穷举法(枚举法)实例解析
- 获取Google Advertising ID作为唯一识别码
- 【C语言】变量被重复定义
热门文章
- 凡是函数中未指定存储类型_函数中未指定存储类别的局部变量,其隐含的存储类别为()...
- “usermod:UID‘0‘already exists”
- 50.Linux 线程三 同步
- SpringBoot读取Word文档
- word图文混排复制到CKEditor图片不显示
- Lua源码分析 - 虚拟机篇 - 语义解析之Opcode生成(17)
- 隔离电源与非隔离电源的选择及优缺点分析
- 2016中国IT用户满意度总体保持平稳
- 2021-2027全球与中国单点润滑器市场现状及未来发展趋势
- element-ui表格组件分页后完整导出到excel的方法