温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

一篇告诉你什么是Spring

发布时间:2020-08-09 11:56:22 来源:ITPUB博客 阅读:178 作者:JavaPub 栏目:编程语言

阅读全文大概需要7分钟

IoC 需要 DI(依赖注入)的支持为什么呢?因为没有 DI 的注入 Spring 创造出的对象都是空值是无法使用的,所以说 IoCDI 多数是同时出现人们眼前的。

IOCInversion of Control 的缩写,多数书籍翻译成“控制反转”。 为了解决对象之间的耦合度过高的问题,软件专家 Michael Mattson 提出了 IOC 理论,用来实现对象之间的 解耦

2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由 IOC 容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现 IOC 的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。

依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指 通过引入 IOC 容器,利用依赖关系注入的方式,实现对象之间的解耦。

背景介绍完了,讲讲我的理解

IoC 就是 依赖倒置原则的一种 设计思路,就 是将原本在程序中自己手动创建对象的控制权,交由 Spring 框架来管理。Spring 框架负责控制对象的 生命周期对象之间的关系。IoC 在其他语言中也有应用,并非 Spirng 特有。 ioc 容器实际上就是个 map(key,value),里面存的是各种对象(在xml里配置的bean节点||repository、service、controller、component)。

Spring IOC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。 IOC 容器负责创建对象,将对象连接在一起,配置这些对象,并从创建中处理这些对象的整个生命周期,直到它们被完全销毁。

在实际项目中一个 Service 类如果有几百甚至上千个类作为它的底层,我们需要实例化这个 Service,你可能要每次都要搞清这个 Service 所有底层类的构造函数,这可能会把人逼疯。如果利用 IOC 的话,你只需要配置好,然后在需要的地方引用就行了,这大大增加了项目的可维护性且降低了开发难度。

推荐阅读:

https://www.zhihu.com/question/23277575/answer/169698662

IoC容器的初始化过程可以分为三步:

  1. Resource 定位(Bean的定义文件定位)、
  2. 将 Resource 定位好的资源载入到 BeanDefinition、
  3. 将 BeanDefiniton 注册到容器中
一篇告诉你什么是Spring

IoC 源码:

https://javadoop.com/post/spring-ioc

AOP(Aspect Oriented Programming 面向切面编程),在程序开发中主要用来解决一些系统层面上的问题,比如 日志收集,事务管理,权限,缓存,对象池管理等。

AOP 可以说是 OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP 引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过 OOP 允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如 安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在 OOP 设计中,它导致了 大量代码的重复,而不利于各个模块的重用

AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来, 便于减少系统的重复代码,降低模块之间的耦合度,并有 利于未来的可操作性和可维护性

Spring AOP就是基于动态代理的,底层实现有俩种方式:一种是 JDK 动态代理(JDK Proxy),另一种是 CGLib(Code Generation Library(基于字节码操作)) 的方式。

如果要被代理的对象是个实现类,那么 Spring 会使用 JDK动态代理来完成操作(Spirng 默认采用JDK动态代理实现机制);如果要被代理的对象不是个实现类那么,Spring 会强制使用 CGLib 来实现动态代理。

一篇告诉你什么是Spring

推荐阅读:https://www.jianshu.com/p/5b9a0d77f95f

当然,也可以使用 AspectJ ,AspectJ 可以做Spring AOP干不了的事情,它是 AOP 编程的完全解决方案。

Spring AOP 属于运行时增强;而 AspectJ 是编译时增强。Spring AOP 只能在运行时织入,AspectJ 运行时织入不可用,支持编译时、编译后和加载时织入。

AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单。

一篇告诉你什么是Spring

线程安全一直是代码编写的重地,我们大多时候在系统开发中不会使用多线程。单例 bean 存在线程安全问题,当多个线程操作同一个对象的时候,这个对象的非静态成员变量会存在线程安全问题。

解决方法:

  1. 在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐的一种方式,这也是常用一种);

2.在Bean对象中尽量避免定义可变的成员变量。

在传统的Java应用中,bean的生命周期很简单,使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了。一旦bean不再被使用,则由Java自动进行垃圾回收。

相比之下,Spring管理Bean的生命周期就复杂多了,正确理解Bean 的生命周期非常重要。一个Bean的构造过程:

一篇告诉你什么是Spring

说到了 Spring ,那一定提一下 Spring MVC,各种讲 SSM 的技术博客大家应该都见了很多。

在我初学时 Java,那时讲的是 “Java Bean(Model) + JSP(View) + Servlet(Controller)” 这种开发模式,这是早期的 JavaWeb MVC。

Spring MVC 是一款很优秀的 MVC 框架。可以让我们的开发更简洁,而且它和 Spring 是无缝集成,是 Spring 的一个子模块,是我们上面提到 Spring 大家族中 Web 模块。

Spring MVC 框架主要由 DispatcherServlet 、处理器映射、处理器(控制器)、视图解析器、视图组成。

Spring MVC 流程图很重要:

一篇告诉你什么是Spring

@Transactional(rollbackFor = Exception.class)注解

@Transactional 注解中如果不配置 rollbackFor 属性,那么事物只会在遇到 RuntimeException 的时候才会回滚,加上 rollbackFor=Exception.class ,可以让事物在遇到非运行时异常时也回滚。

后记

scope 是范围的意思,在绝地求生中 scope 意为瞄准镜,如果你的队友是个老外你就和他说 i want this 4times scope 他就明白了。

下篇结合代码一块讲解

声明:参考来源互联网,有任何争议可以留言。站在前人的肩上,我们才能看的更远。

本教程纯手打,致力于最实用教程,希望多多转发支持,对我真的很重要。 欢迎来我公众号,希望可以结识你,更多原创PDF,微信搜索:JavaPub,回复:【666】,也可以催更。

有任何问题都可以来谈谈 !

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI