为什么用Spring的一个原因(转)
当你发现代码经常重复,你会考虑将其写成函数,封装工具;
当你发现多人合作时,代码耦合严重,你会将其模块化。
每个轮子的出现都是因为希望优化生产,提高效率,仅此而已。
正如评论里的朋友所说,spring存在自己的问题,因为复杂度是不会凭空消失的,只是从一个地方转移去另一个地方。
一开始我的认识也不太够,举了个简单的通用例子,这个例子其实是spring依赖注入后带来的好处,而并非只是为了如此。
后面讲了个过程,可以发现,重点在于层层封装,形成模块化,良好代码环境,便于维护。
简单来说,给你一套ssm,ssh的代码,你能立刻知道先看什么,按什么规范写;给你一套无接口风格各异的代码,有可能看半天。
框架这种东西本来就是致力于统一生产形式,也有时效性。
面向接口编程现在也经常被怀疑是否有意义。
感觉有点偏题了,互勉。
// 添加内容
作为几个月前是新手的次新手的我,在之前没有分层解耦的需求下,完全不能接受“让容器(框架)去new对象”这种抽象,因为没有说出其意义。
假如我们要实现一个存款的应用,那么,我们的思维是这么走的:
1.写一个“存款类”,里面有“存款方法”,“存款方法”直接操作数据库实现存款逻辑。
2.你突然发现,操作数据库的方法都是增删查改,为什么不写成一个类,让“存款方法”去调用这个操作数据库的类,减少了不少重复代码。
(分层思想来了,业务逻辑和数据操作分离了)
3.你的朋友知道了你在写这个应用,就跟你提意见,不如我帮你写操作数据库的类,你写存款业务的类,这样不就快了吗?我们约定一个接口,你调用这个接口,我实现这个接口,这样开发就很快了。
(接口思想来了,调用方不必理会具体实现,专注于自己的逻辑)(工厂模式)
4.你在写你的业务逻辑的时候,发现虽然你不用管数据操作逻辑的实现,但是在你的代码了,创建一个对象的语法:
接口 变量名 = new 实现类();
在做了那么多分离工作,还是要写new 实现类();,还是依赖于实现类。你就想,能不能做一个容器,自动帮我将实现类赋给接口呢?(依赖注入思想)
于是,你写出了spring,一开始使用xml配置,在类里面只需要getBean(),接口和实现类和调用类基本分离了(松耦合形成了),后来xml你也懒得写,弄出一批注解,实现类注解一下是组件,调用类声明一个接口,写个@AutoWired,spring容器就帮你完成了将实现类赋给接口的工作,即所谓的spring帮你new了一个对象。
最后你的应用结构如下图:

比起刚开始一个类里面参杂着各式各样的代码,现在看一个个部件似的,何等舒服!
注:spring不止是DI,还有AOP,MVC等等,依赖注入只是它的一个功能。
// 旧答案
举个例子,比如你写
Apple apple = new Apple();
People people = new People();
people.eat(apple);
然后有一天,客户说不想吃Apple了
给我改成吃Orange,然后你打开源文件
Orange orange = new Orange();
People people = new People();
people.eat(orange);
再重新编译
再一天,客户又觉得不好,要Peach了
Peach peach = new Peach();
People people = new People();
people.eat(peach);
再重新编译
………
然后你在客户的需求下崩溃了
倘若您用spring
Fruit fruit = (Fruit)beanFactory.getBean("fruit");
People people = (People)beanFactory.getBean("people");
people.eat(fruit);
这样使用了接口Fruit,你只需要在xml文件配置,更换fruit的bean,无需改变源代码。对于people也如此。
会发现,我们在这种设计下会少维护了很多代码,达到这样的效果的原因是因为,Fruit和People没有参杂在一起,没有谁调用了谁等等,实际上就是没有耦合,他们的关系由接口代替表示了。
为什么用Spring的一个原因(转)的更多相关文章
- Spring是一个分层的Java
Spring简介 Spring是一个分层的Java SE/EE应用一站式的轻量级开源框架.Spring核心是IOC和AOP. Spring优点 -方便解耦,简化开发,通过Spring提供的IoC容器, ...
- Spring第一个helloWorld
Spring 简介: 轻量级:Spring是非侵入性的-基于Spring开发的应用中的对象可以不依赖于Spring的API 依赖注入(DI—dependdency injection.IOC) 面向切 ...
- QNJR-GROUP/EasyTransaction: 依赖于Spring的一个柔性事务实现,包含 TCC事务,补偿事务,基于消息的最终一致性事务,基于消息的最大努力交付事务交付QNJR-GROUP/EasyTransaction: 依赖于Spring的一个柔性事务实现,包含 TCC事务,补偿事务,基于消息的最终一致性事务,基于消息的最大努力交付事务交付
QNJR-GROUP/EasyTransaction: 依赖于Spring的一个柔性事务实现,包含 TCC事务,补偿事务,基于消息的最终一致性事务,基于消息的最大努力交付事务交付 大规模SOA系统的分 ...
- spring只是一个框架
想跟着 spring in action 4 系统的研究下spring,结果发现忘了怎么建一个spring项目. 关键是,不知道该建一个什么项目,Java项目?Maven项目(Java项目?Web项目 ...
- SQLServer 可更新订阅数据冲突的一个原因
原文:SQLServer 可更新订阅数据冲突的一个原因 可更新订阅为什么有冲突? 可更新订阅中,当升级增加一个字段时,通常在发布服务器的发布数据库中增加,对表增加字段后,发布自动同步到订阅数据库中(复 ...
- spring注解注入失败一个原因
所有的注解看起来都没有任何问题,最后是由于web-xml配置问题. 由于缺少监听器org.springframework.web.context.ContextLoaderListener, 导致无法 ...
- spring security 一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中 配置的Bean,充分利用了Spring ...
- spring 理解Spring AOP 一个简单的约定游戏
应该说AOP原理是Spring技术中最难理解的一个部分,而这个约定游戏也许会给你很多的帮助,通过这个约定游戏,就可以理解Spring AOP的含义和实现方法,也能帮助读者更好地运用Spring AOP ...
- Spring事务失效原因分析解决
文章目录 1.方法内部调用 2.修饰符 3.非运行时异常 4.try-catch捕获异常 5.多线程调用 6.同时使用@Transactional和@Async 7.错误使用事务传播行为 8.使用的数 ...
- php开发公众号 token验证失败 其中一个原因
断断续续,弄了好几天,索性一狠心花了三个小时,总算找出问题了. "token验证失败" 可能原因有很多种,其他网友已经几乎穷尽了,但是我所遇到的在网络上没有看到,所以这里记录下. ...
随机推荐
- 问题描述:libGL.so.1: cannot open shared object file: No such file or directory
问题截图: 在实验室服务器上跑代码,报如上错误 解决方案: sudo apt update sudo apt install libgl1-mesa-glx 因遇见多次该错误,特此记录下 (据说该问题 ...
- Disruptor—1.原理和使用简介
大纲 1.Disruptor简介 2.Disruptor和BlockingQueue的压测对比 3.Disruptor的编程模型 4.Disruptor的数据结构与生产消费模型 5.RingBuffe ...
- E - Stamp
题目链接 : E - Stamp (atcoder.jp) 题意:给定长为n的s串,m的t串,和一个长度为n的x串,问你能否操作任意次数的操作, 每次操作都可以使x中长度为m的存在串变为t,最后使得变 ...
- C#/.NET/.NET Core技术前沿周刊 | 第 39 期(2025年5.19-5.25)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- odoo接口
@http.route('/zimo_lunch/select/<string:db_name>', type='http', auth='none')def trash_demo(sel ...
- Linux grep 匹配多个关键字
Linux grep 命令非常常用,经常用于匹配文本字符.基本语法如下: grep 'keyword'fileName.txt 如上所示,Linux grep 命令用于查找文件里符合指定条件的 ...
- 【2020.11.19提高组模拟】二次剩余two 题解
[2020.11.19提高组模拟]二次剩余two 题解 题目描述 有\(n\)个二次函数,每个二次函数可以用两个值\(m,k\)描述: \[f(x)=(x-m)^2+k \] 现在有\(q\)次操作: ...
- Linux常用命令介绍-系统管理
find命令 - 根据路径和条件搜索指定文件 ind命令的功能是根据给定的路径和条件查找相关文件或目录,其参数灵活方便,且支持正则表达式,结合管道符后能够实现更加复杂的功能,是Linux系统运维人员必 ...
- Kubernetes控制器-Job和CronJob
Job 和 CronJob Deployment, StatefuleSet以及DaemonSet这三个控制器主要编排的对象都是"在线业务",比如我们举例常用的Nginx,MySQ ...
- IFREAD's Web 的出版说明
关于lijnf.top的发布说明 一名高中生开发的个人Web IFREAD's Web 前言 由于主播是高中生,所以肯定不可能每天都用来开发网站,主播计划每隔1-2个月进行一次较大的更新,不定期对小功 ...