Spring核心之(IOC、DI)
IOC(Spring框架核心之一)
IOC,即控制反转,是Spring框架的核心组件之一。通过这种方式,对象的创建、初始化以及销毁等生命周期管理交由Spring容器负责,从而使得开发人员无需直接处理这些细节。
控制反转原则
控制反转是一种面向对象编程的设计原则,旨在降低程序间的耦合度。它主要分为两种类型:依赖注入(Dependency Injection,DI)和依赖查找(Dependency Lookup)。
-
依赖查找:容器提供回调接口和上下文条件给组件,如EJB和Apache Avalon采用此方式。组件需使用容器提供的API来查找资源和协作对象,其控制反转仅体现在回调方法上。
-
依赖注入:在该模式下,组件不再主动定位依赖关系,而是通过JavaBean属性或构造函数接受容器注入的符合依赖关系的对象。设值方法注入是指通过调用set方法注入依赖关系,而构造器注入则是将依赖关系作为构造函数参数传入。
依赖注入的方式
- Setter方式(通过set方法注入)
- 构造方法注入
- 接口注入
IoC是什么
Ioc,即Inversion of Control,意为“控制反转”,它并非具体的技术,而是一种设计思想。在Java开发中,IoC意味着将对象的创建及外部资源获取的控制权从对象内部转移到了专门的IoC容器。理解IoC的关键在于明确以下几点:
-
谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;
而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。 -
为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
IoC能做什么
IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。
IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
IoC与DI
DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现(aop)。
理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:
- 谁依赖于谁:当然是某个容器管理对象依赖于IoC容器;“被注入对象的对象”依赖于“依赖对象”;
- 为什么需要依赖:容器管理对象需要IoC容器来提供对象需要的外部资源;
- 谁注入谁:很明显是IoC容器注入某个对象,也就是注入“依赖对象”;
- 注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。
IoC和DI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。
装配Bean基于注解
注解是一种特殊的类,使用@注解名称
进行标记。在开发中,可以通过使用注解来替代XML配置文件以装配Bean。
注解替换XML配置
- 使用
@Component
取代<bean class="">
@Component("id")
取代<bean id="" class="">
Web开发中的衍生注解(功能与@Component相同)
为了更好地适应不同层次的组件,Spring提供了三个衍生自@Component
的注解:
- @Repository:用于DAO层(数据访问对象层)
- @Service:用于Service层(业务逻辑层)
- @Controller:用于Web层(控制器层)
依赖注入
普通值注入
- 使用
@Value("${propertiesName}")
注入普通值
引用值注入
按照类型注入
- 使用
@Autowired
根据类型自动注入依赖对象
按照名称注入
- 方式1:
@Autowired @Qualifier("名称")
- 方式2:
@Resource(name="名称")
生命周期管理
- 初始化方法:使用
@PostConstruct
标记初始化方法 - 销毁方法:使用
@PreDestroy
标记销毁方法
作用域控制,默认是单例
- 设置多例模式(每次请求都会创建一个新的Bean实例):
@Scope("prototype")
总结以上内容,通过Spring注解可以方便地实现Bean的定义、依赖注入、生命周期管理以及作用域控制等功能,进一步简化了配置和增强了代码可读性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!