IOC

本文深入讲解了IOC(控制反转)和DI(依赖注入)的概念及其在软件开发中的应用。介绍了如何通过构造函数注入、属性注入及接口注入等方式来实现依赖管理,并探讨了IOC容器的作用与配置方法。

概念:

1、复杂系统分解成互相合作的对象,接着“第三方”解耦各层间的依赖关系,由IOC(Inversion of Control)容器【即Dependency Injection依赖注入】负责对象的创建和维护,容器在运行时动态将依赖对象注入到组件中;


2、即是某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定;

让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖。


3、把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言的的反射编程,根据配置文件中给出的类名生成相应的对象。

类型:

构造函数注入

sprig支持

通过调用类的构造函数,将接口实现类通过构造函数变量传入

被注入对象在其构造方法中声明依赖对象的参数,IoC检查被注入对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象,IoC负责被注入对象的构造或生命周期

pulic class IClass{
  private One o;
  private Two t;
  public iClass(One o,Two t){
     this.o=o;
     this.t=t;
  }
}

属性注入

spring支持

通过Setter方法完成调用类所需依赖的注入,使用时调用、更加灵活方便;

 public class A  
{  
     private B b;  
     private C c;  
  
 public void setb(B b) {  
	this.b = b;  
 }  
 
 public void setc(C c) {  
	this.c = c;  
 }  
} 
通过调用set方法为A对象注入所依赖的对象
public class DMove {  

   public void direct(){
   
       B b = new bOne();  
       A a = new A();  
  
       //①调用属性Setter方法注入  
       a.setb(b);   
       a.*();  
   }  
   
} 

接口注入

将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的注入方法

通过接口注入需要额外声明一个接口,增加了类的数目,而且它的效果和属性注入并无本质区别,因此我们不提倡采用这种方式

通过容器完成依赖关系的注入

通过配置文件或注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入的工作。(反射)


控制反转:

当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方,而不是A主动去创建、维护B


http://www.cnblogs.com/ttrjba/p/3511935.html

http://blog.youkuaiyun.com/xz0125pr/article/details/49129659

http://stamen.iteye.com/blog/1489223/   通俗易懂的文章又一篇

http://blog.youkuaiyun.com/xiaoxing1521025/article/details/8846022

### IOC (Inversion of Control) 的概念及其在前端和后端开发中的功能与实现方式 #### 1. ### 控制反转(IoC)的基本概念 控制反转是一种设计原则,其核心理念在于将对象的创建和管理职责从应用程序本身转移到外部容器中。这意味着,在传统的编程模型中,程序员需要手动通过 `new` 关键字或其他方式显式地创建依赖的对象;而在 IoC 中,这一过程被“反转”,即不再由程序主动创建对象,而是交由框架或容器来管理和提供所需的依赖项[^1]。 具体而言,IoC 的目标是减少组件之间的耦合度,使系统的各个部分更加模块化、可测试性和灵活性更高。常见的实现形式包括依赖注入(Dependency Injection, DI),其中容器会自动将所需的服务或资源注入到相应的组件中。 --- #### 2. ### 后端开发中的 IoC 实现与功能 在后端开发中,尤其是基于 Java 的 Spring 框架生态中,IoC 是一项非常重要的核心技术。Spring 提供了一个名为 Inversion of Control Container(简称 IoC 容器)的基础设施,用于集中管理应用中的 Bean 对象生命周期及它们之间的关系。 - **Bean 的注册与管理**:通过注解如 `@Component`, `@Service`, 或者 XML 配置文件等方式,可以将类声明为 Spring 容器中的 Bean。一旦注册成功,该类的实例便会被托管至 IoC 容器内,并按照预先设定的方式初始化[^2]。 - **依赖注入机制**:借助于构造函数注入、Setter 方法注入等形式,开发者无需关心如何获取其他服务的具体实现细节,只需定义接口即可让 Spring 自动完成装配工作。例如下面这段代码展示了如何利用 `@Autowired` 注解简化 Controller 类与其他 Service 层之间关联性的建立: ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users/{id}") public ResponseEntity<User> getUserById(@PathVariable Long id){ User user = userService.findUserById(id); return ResponseEntity.ok(user); } } ``` 此外,Spring Boot 进一步增强了对 IoC 支持的能力,使得配置变得更加简洁明了。例如可以通过自定义方法返回值作为 Bean 添加进上下文中去[^2]: ```java @Configuration public class AppConfig { @Bean(name="customSAXReader") public SAXReader createSAXReaderInstance(){ return new SAXReader(); } } ``` 以上例子表明,即使是在复杂的业务场景下,我们依然能够轻松维护好各层次间的松散联系状态,而这正是得益于 IoC 所带来便利之处。 --- #### 3. ### 前端开发中的 IoC 应用与发展趋势 虽然 IoC 最初更多应用于服务器端软件工程领域,但近年来随着前端技术栈日益成熟壮大,类似的思想也开始渗透进来。特别是在 AngularJS/Angular 等现代化 MV* 架构框架里得到了充分体现: - **Angular 的 Dependency Injector System**:类似于 Spring 的做法,Angular 内部构建了一套强大的依赖注入系统,允许开发者以声明式的语法描述组件所需要的数据源和服务实例。如下所示的是一个典型的服务提供商定义片段: ```typescript import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class DataService { constructor() {} fetchData(): string[] { return ['Data Item 1', 'Data Item 2']; } } ``` 随后可以在任意 Component 中无缝接入上述 service: ```typescript import { Component, OnInit } from '@angular/core'; import { DataService } from './data.service'; @Component({ selector: 'app-root', templateUrl: './app.component.html', }) export class AppComponent implements OnInit{ items!:string[]; constructor(private dataService:DataService){} ngOnInit():void{ this.items=this.dataService.fetchData(); } } ``` 由此可见,无论是哪种平台环境下,只要涉及到多个相互作用单元协同工作的场合,都可以考虑引入 IoC 来提升项目的扩展性与易维护性水平[^1]。 --- #### 4. ### 总结比较 | 特性 | 后端 (Spring/SpringBoot) | 前端 (Angular/Vue.js/React) | |--------------------|------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| | **主要用途** | 处理业务逻辑、持久化存储、事务管理等 | UI 渲染、事件绑定、路由导航等功能 | | **实现工具** | 使用 Java 编程语言编写,依托 Spring Framework 提供的强大功能集合 | TypeScript / JavaScript 开发环境下的多种库框架 | | **依赖注入方式** | 显式标注 (@Component,@Repository), 或隐含推断 | 利用装饰器模式 (@Injectable),或是 React Context API | | **适用范围大小** | 整体规模较大,通常覆盖整个企业级解决方案 | 相较之下更为聚焦局部区域内的视图更新需求 | 尽管两者所处的技术背景存在一定差异,但从本质上讲都是围绕着降低耦合度这条主线展开探索实践的结果。 --- ###
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值