如何理解 Spring 的核心?

如何理解 Spring 的核心?

来自知乎的提问,今天来聊聊Spring

什么是Spring?

每个人学习JavaWeb开发都绝对饶不开一个词“Spring”,到底什么是Spring?

说实话,“什么是Spring?”这个愚蠢而低级问题缠绕了我至少有2-3年了。我曾一度纳闷,这玩意我也没看他干啥啊,为什么说它强大呢?

其实,在我个人的理解里,Spring并不是什么新技术,就是单纯的对于几个主要的设计模式的典型呈现而已。

其最主要也是被提到最多的特性“Aop(面向切面)”,“IoC(控制反转)”,其实就是 “工厂”,“单例”,“动态代理”等设计模式的最佳实践,以及对于“面向接口编程”等开发原则的体现。

Spring到底做了什么

从设计模式聊聊Spring

首先说明一下,这里特定指的是Spring的核心暂且不谈SpringBoot以及SpringCloud全家桶。

你需要了解的第一件事就是,Spring的每个特性其实是一环扣一环的。这里让我们跟着Spring用到的设计模式一步一步顺藤摸瓜,来理清Spring的全貌。如果你还不了解这些主要的设计模式,也不用急,你可以留个心,以后学到设计模式再回来看这篇文章,收获会更多。

动态代理模式

首先是“动态代理”模式,我们知道,Spring在日常使用中,最多的应该就是依赖注入。熟悉的@Autowired或@Resource注解。现在提个小问题,注入的对象是原始Class创建的对象,还是代理对象呢?没错,是代理对象。

工厂模式

Spring会根据你所需要注入的Interface或Class,从Spring的Bean工厂中获取一个符合条件的对象。当然,这里符合条件的只能有一个,如果有多个符合条件的实现的话默认设置下会报错的。

单例模式

由于每次生成代理对象都是需要性能开销的,所以默认情况下,Spring生成的对象是单例的。

再聊回Spring的IoC和AOP

IoC

IoC其实核心就是把依赖管理的事情交给Spring来做,开发人员不需要过度关心依赖关系。其实现的核心就是Spring的Bean工厂,由于对象交由Spring创建和管理了,所以可以进行依赖注入,也就不需要关心依赖关系了。

AOP

Aop可以多聊两句。在你自己new对象的情况下,如果想为所有对象的某个方法前后去打印什么场景是比较困难的。不过基于Spring的动态代理就不同了,因为对象是动态生成的代理对象,你可以在“切点”前后做任何事。这就是AOP。

补充几句

Spring用的久了其实会发现,很多特性几乎都是基于AOP的实现。简单举两个列子:

Spring事务管理

为什么你能通过一个 @Transactional 注解就实现事务的自动提交呢?其实无非就是把 @Transactional 注解下的方法当作切点,在切点前开启事务,切点后提交,就这么简单。怎么样,是不是觉得你自己也能写一个出来了?

SpringCache

这是众所周知的Spring的缓存框架,其实现是怎样呢?也一样是通过注解找到切点,根据函数名和参数来作为缓存的key。把对应的函数作为切点,切点前根据函数名+参数拼装的key去找缓存,如果找到就直接返回,如果没找到就执行真正的函数体并将函数的返回对象置入缓存中。是不是也没有那么神奇?

总结

大概总结一下吧,个人理解:Spring的核心就是——设计模式。其一切实现都是为设计模式做支撑罢了。

甚至说的再广一点,Java的语言特性之一就是对于编程原则有着高度支持。以至于只要是讲设计模式的书,基本上都是以Java或者C#作为说明语言。

想要搞明白Spring,如果你能搞明白设计模式,那你将看的更明白。

感谢

感谢能阅读到这里的你!

希望本文对你可以有帮助,存在的漏洞以及待完善的地方也欢迎指出!

期待你的点赞,收藏,以及关注!你的支持,是我继续更新的最大动力!

最后,也欢迎你关注我的公众号【猿树洞】,将不定期为大家带来问题解答以及心得分享。(嗯。。。。。非常不定期。。。)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y4lPsey1-1667435730553)(https://pth-1252643971.file.myqcloud.com/typora/yuanshudong_qr_code.jpg)]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值