96SEO 2026-02-20 10:42 7
此文目的是用通俗易懂的语言讲清楚什么是依赖注入与反转控制在看了大量的博客文章后归纳总结便于后续巩固我相信大多数人像我一样刚开始学习Spring框架的时候仅仅是在学习技术记住如何做而非为何如此做。

因此本文结合生活例子与项目实际问题入手讲清楚Spring入门的两个概念。
其中第二篇章管中窥豹需要具备Spring基础知识你不用非常理解但至少你知道怎么写依赖注入。
话说有一天蟹老板想开个餐馆可是开什么店好呢他列出了几个选择牛排店、蟹肉煲店、炸鸡店火锅店他非常纠结。
于是海绵宝宝告诉他你可以春天卖牛排、夏天卖蟹肉堡、秋天换卖炸鸡冬天卖火锅。
于是蟹老板接纳了海绵宝宝的意见。
春天到了蟹老板叫海绵宝宝开发了一套店内点餐系统于是海绵宝宝定义了如下代码
并且从海底世界招聘到了张三厨师长张三厨师长很擅长做牛排尤其是黑椒牛排一绝他也喜欢唱歌因此海绵宝宝写下了如下代码
{System.out.println(name正在做黑椒牛排...);}Overridepublic
{System.out.println(name唱着伤不起...);}
ZhangChef(张三,26);System.out.println(我们的厨师长是zhang.name,今年高龄zhang.age);zhang.cook();
这三个月过的很快蟹老板也赚了很多钱海绵宝宝更是成为了本店的CTO大家其乐融融一片安好。
可是明天就到了夏天餐厅更换业务开始经营蟹肉煲于是张三厨师长被毕业了李四厨师长正好擅长蟹肉煲我们的厨师长现在换成了李四。
晚上十点钟海绵宝宝正在加班加点改代码他需要把整个系统的厨师长换成李四这是他换好的第一个文件
{System.out.println(name正在做蟹肉煲...);}Overridepublic
{System.out.println(name唱着撒浪嘿呦...);}
}然后他需要把整个系统所有方法的zhangChef换成LisiChef海绵宝宝工作了一夜第二天依旧没有改完直到改了半个月后才把整个系统的Chef换完于是海绵宝宝丢了CTO的职位成为了普通打工仔程序员。
海绵宝宝很不甘心他辞去了工作专心研究这个问题如何解决。
他发现Chef
了这不是废话吗餐厅当然依赖与厨师了一瞬间他灵机一动说这种依赖关系是不可避免的这样做是过度耦合的我需要给他们解耦Chef
的控制权并不应该由餐厅掌控而应该是需要的时候由第三方空降于是他把Chef
不具备实例化他的能力而是由第三方实例化好后直接赋值给Chef变量于是他改写成如下代码
;#System.out.println(我们的厨师长是chef.name,今年高龄chef.age);chef.cook();
如上面代码所示第三方力量直接空投怎么实现呢海绵宝宝思考了一夜他想到了注射器能不能像打针一样把已经实例化好的Chef直接注射到
呢经过漫长的研究海绵宝宝研发了一款框架这种框架就是用来解决此问题因为这是今年春天开始经历的困难于是他把该框架命名成Spring。
的功能实现需要借助于类B那么就称类B是类A的依赖如果在类A的内部去实例化类B
那么两者之间会出现较高的耦合一旦类B出现了问题类A也需要进行改造如果这样的情况较多每个
类之间都有很多依赖那么就会出现牵一发而动全身的情况程序会极难维护并且很容易出现问题。
要解决这个问题就要把A类对B类的控制权抽离出来交给一个第三方去做把控制权反转给第三方就称
Control。
控制反转是一种思想是能够解决问题的一种可能的结果
Injection就是其最典型的实现方法。
由第三方我们称作IOC容器来控制依赖把他通过构造函数
newClassPathXmlApplicationContext(applicationContext.xml);Chef
applicationContext.getBean(chef);
这一步还不是依赖注入只是使用Spring的API实例化对象。
因为有setChef
方法我们可以配置Spring容器调用set方法进行注入如下才是依赖注入Spring会自动调用setChef方法给chef设置实例对象因此不需要上面那一句“chef
classcom.myjava.Restaurantproperty
如果A类需要使用B类那么我们称为B是A的依赖我们需要Spring容器第三方将依赖B的示例注射给A。
因此需要在Spring核心配置文件中声明控制权将指定全限定名称的类的控制权创建权交给Spring管理意味着我们可以通过Spring的getBean()实例化。
如果类
后期需要升级维护我们只需要更改其中的代码或者指定其他的类全限定名称(class名称)。
classcom.myjava.dao.impl.UserDaoImpl/
classcom.myjava.service.impl.UserServiceImpl
在UserServiceImpl中添加setUserDao方法
classcom.myjava.dao.impl.UserDaoImpl/
classcom.myjava.service.impl.UserServiceImplproperty
依赖注入是反转控制的一种实现方法我个人认为依赖外置比依赖注入更好理解当然我可能理解的不太深刻有错误。
因为原来的程序是直接在A里面实例化B如果B变了那将导致很多业务代码需要改这种依赖关系又是无法消除的只能减弱这种依赖。
那么可以考虑将依赖写到配置文件中需要的时候注入即可这里将依赖写到配置文件可以说是依赖外置但是Spring在运行时是实例化对象然后通过Set或者构造方法将其注入到A类中因此这是一个相对的说法。
从A类角度出发是外置从Spring角度是注入。
以上内容参考了知乎胡小国博主的文章感谢以上内容有错误希望指正
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback