链接:https://www.zhihu.com/question/27053548/answer/85060703

当你发现代码经常重复,你会考虑将其写成函数,封装工具;
当你发现多人合作时,代码耦合严重,你会将其模块化。
每个轮子的出现都是因为希望优化生产,提高效率,仅此而已。
正如评论里的朋友所说,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的一个原因(转)的更多相关文章

  1. Spring是一个分层的Java

    Spring简介 Spring是一个分层的Java SE/EE应用一站式的轻量级开源框架.Spring核心是IOC和AOP. Spring优点 -方便解耦,简化开发,通过Spring提供的IoC容器, ...

  2. Spring第一个helloWorld

    Spring 简介: 轻量级:Spring是非侵入性的-基于Spring开发的应用中的对象可以不依赖于Spring的API 依赖注入(DI—dependdency injection.IOC) 面向切 ...

  3. QNJR-GROUP/EasyTransaction: 依赖于Spring的一个柔性事务实现,包含 TCC事务,补偿事务,基于消息的最终一致性事务,基于消息的最大努力交付事务交付QNJR-GROUP/EasyTransaction: 依赖于Spring的一个柔性事务实现,包含 TCC事务,补偿事务,基于消息的最终一致性事务,基于消息的最大努力交付事务交付

    QNJR-GROUP/EasyTransaction: 依赖于Spring的一个柔性事务实现,包含 TCC事务,补偿事务,基于消息的最终一致性事务,基于消息的最大努力交付事务交付 大规模SOA系统的分 ...

  4. spring只是一个框架

    想跟着 spring in action 4 系统的研究下spring,结果发现忘了怎么建一个spring项目. 关键是,不知道该建一个什么项目,Java项目?Maven项目(Java项目?Web项目 ...

  5. SQLServer 可更新订阅数据冲突的一个原因

    原文:SQLServer 可更新订阅数据冲突的一个原因 可更新订阅为什么有冲突? 可更新订阅中,当升级增加一个字段时,通常在发布服务器的发布数据库中增加,对表增加字段后,发布自动同步到订阅数据库中(复 ...

  6. spring注解注入失败一个原因

    所有的注解看起来都没有任何问题,最后是由于web-xml配置问题. 由于缺少监听器org.springframework.web.context.ContextLoaderListener, 导致无法 ...

  7. spring security 一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中 配置的Bean,充分利用了Spring ...

  8. spring 理解Spring AOP 一个简单的约定游戏

    应该说AOP原理是Spring技术中最难理解的一个部分,而这个约定游戏也许会给你很多的帮助,通过这个约定游戏,就可以理解Spring AOP的含义和实现方法,也能帮助读者更好地运用Spring AOP ...

  9. Spring事务失效原因分析解决

    文章目录 1.方法内部调用 2.修饰符 3.非运行时异常 4.try-catch捕获异常 5.多线程调用 6.同时使用@Transactional和@Async 7.错误使用事务传播行为 8.使用的数 ...

  10. php开发公众号 token验证失败 其中一个原因

    断断续续,弄了好几天,索性一狠心花了三个小时,总算找出问题了. "token验证失败" 可能原因有很多种,其他网友已经几乎穷尽了,但是我所遇到的在网络上没有看到,所以这里记录下. ...

随机推荐

  1. useEffect的那些坑,你知道多少

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 14px; o ...

  2. B1014 福尔摩斯的约会 && A1061 Dating

    描述 大侦探福尔摩斯接到一张奇怪的字条: 我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm 大侦探很快就明白了, ...

  3. 新纪元:"老"新人

    博客园注册很久了,但从未发布过内容.终于开通博客,记录自己,也支持博客园! 另外,这次苹果秋季发布会真的好无聊!︎

  4. 【译】微软与 Anthropic 合作为 MCP 创建官方 C# SDK

    微软正在与 Anthropic 合作,为模型上下文协议(MCP)创建一个官方的 C# SDK.MCP 已经在人工智能社区得到了迅速的应用,这次合作旨在增强人工智能模型与 C#应用程序的集成. 该 SD ...

  5. linux下动态壁纸(ubuntu20.04测试)

    linux下实现动态壁纸(ubuntu20.04测试) github地址: https://github.com/dependon/fantascene-dynamic-wallpaper bilib ...

  6. 【非对称加密】详解及Java实现

    非对称加密详解及Java实现 一.非对称加密概述 非对称加密(Asymmetric Cryptography),也称为公钥加密,是一种使用一对密钥(公钥和私钥)进行加密和解密的加密方法.它与对称加密的 ...

  7. k8s在线修改alertmanager.yaml

    简单说明 有些情况下,我们可以进入集群查看某些secret的配置,这里如果想修改secret的配置时,没有secrets的源文件,可以采取如下的方案. 例如我们需要修改alertmanager.yam ...

  8. AI 运维诊断全攻略,深入浅出 OceanBase 系列直播重磅来袭!

    社区的 #数据库 与 #AI 爱好者们 当 SQL 遇见 AI 的系列直播即将开启! 今晚 19:30,聚焦#AI 时代的运维与诊断,带你共享 #大模型辅助数据库运维 的一线实战经验,探索 #Ocea ...

  9. Java源码分析系列笔记-6.ReentrantLock

    目录 1. 是什么 1.1. synchronized vs ReentranLock 2. 实现原理 2.1. uml图 3. 公平锁 3.1. 如何使用 3.2. 原理分析 3.2.1. 构造方法 ...

  10. Elastic学习之旅 (12) .NET 6应用集成ES - 下

    大家好,我是Edison. 上一篇:.NET集成ES进行CRUD 写在开头 在.NET应用中集成ES一般涉及两个方面: (1)将ES当存储用,类似于MongoDB,做文档的增删查改,这一类操作偏CRU ...