IOC

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
技术描述
Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式的new一个B的对象。
采用依赖注入技术之后,A的代码只需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。而具体获取的方法、对象被获取时的状态由配置文件(如XML)来指定。
实现方法
实现控制反转主要有两种方式:依赖注入和依赖查找。两者的区别在于,前者是被动的接收对象,在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来判断将不同的对象注入到不同的属性中,而后者是主动索取响应名称的对象,获得依赖对象的时间也可以在代码中自由控制。
依赖注入有如下实现方式:
基于接口。实现特定接口以供外部容器注入所依赖类型的对象。
基于 set 方法。实现特定属性的public set方法,来让外部容器调用传入所依赖类型的对象。
基于构造函数。实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。
基于注解。基于Java的注解功能,在私有变量前加“@Autowired”等注解,不需要显式的定义以上三种代码,便可以让外部容器传入对应的对象。该方案相当于定义了public的set方法,但是因为没有真正的set方法,从而不会为了实现依赖注入导致暴露了不该暴露的接口(因为set方法只想让容器访问来注入而并不希望其他依赖此类的对象访问)。
Android学习进阶和IoC
1.成为Android高手一般分为六个阶段:

        第一阶段:熟练掌握Java SE,尤其是对其内部类、线程、并发、网络编程等需要深入研究;熟练掌握基于HTTP协议的编程,清楚POST和GET等请求方式流程和细节;能够进行基本的Java Web编程,如果能够使用Java EE则更好;   

       第二阶段:精通Android的核心API的使用,例如四大组件所涉及的API、Context等,精通核心界面的编程,例如ListView的编程;到达这个阶段已经能够做大部分基本的应用开发了;

      第三阶段:精通应用框架的原理,尤其是对IoC的理解及其在Android应用框架中的应用,精通基本的23种设计模式在Android中的应用;      

      第四阶段:精通JNI,熟练Android类库中C/C++组件开发;并能够使用JNI机制把现有的C/C++组件移植成为应用框架的核心组件;具备修改和编写自己的应用框架的能力;   

      第五阶段:做出自己的Android系统,无论是底层还是上层都能够了如指掌;能够根据实际需要设计和实现比较大Android系统,例如带领比较大的团队做出自己的Android手机产品等;

        第六阶段:势。一切的思考均进入“势”的思考,一切都是思路问题,判断和预测Android的形势,引领市场,通往自由的天堂。
2. Android之IoC (Inversion of Control)
1)概念
        一种设计思想。使调用者和被调用者解耦和分离,便于更改和代码重用,便于移植。
        许多应用都是由多个类通过彼此合作来实现业务逻辑,每个对象之间都相互依赖,这将导致代码高度耦合并且难以测试、难以修改难以重用。     IoC很好的解决了该问题,它将实现组件间关系从程序内部提到外部容器来管理。也就是说由容器在运行期将组件间的某种依赖关系动态的注入组件中。控制程序间关系的实现交给了外部容器来完成。
2)案例
为了实现调用者和被调用者解耦,分离,一般是通过工厂模式实现的,下面将通过比较工厂模式和Ioc模式不同,加深理解Ioc模式。
假设有两个类B 和 C:B作为调用者,C是被调用者。一般的做法是:
public class B{
   private C comp=new C(); 
  ......
}
工厂模式实现如下:
public class B{
  private C comp; 
  private final static MyFactory myFactory = MyFactory.getInstance();
  public B(){
    this.comp = myFactory.createInstanceOfC();
  }
   public void someMethod(){
    this.comp.sayHello();
  } 
}
使用Ioc依赖性注射实现Picocontainer如下:
public class B{
  private C comp; 
  public B(C comp){
    this.comp = comp;
   }
   public void someMethod(){
    this.comp.sayHello();
   }
}
//外部容器实现,控制程序间的关系。CImp类为C接口/类的一个具体实现。
public class client{
   public static void main( String[] args ) {
    DefaultPicoContainer container = new DefaultPicoContainer();
    container.registerComponentImplementation(CImp.class); //向B类实现注射C类具体实现
    container.registerComponentImplementation(B.class);
    B b = (B) container.getComponentInstance(B.class);
    b.someMethod();
   }
}
3)工厂模式和Ioc不同的特点和区别:
  如上,主要区别体现在B类的代码,如果使用Ioc,在B类代码中将不需要嵌入任何工厂模式等的代码,因为这些工厂模式其实还是与C有些间接的联系,这样,使用Ioc彻底解耦了B和C之间的联系。
  使用Ioc带来的代价是:需要在客户端或其它某处进行B和C之间联系的组装。
  所以,Ioc并没有消除B和C之间这样的联系,只是转移了这种联系。

  总之,使用Ioc模式,可以不管将来具体实现,完全在一个抽象层次进行描述和技术架构。

http://blog.youkuaiyun.com/blog_wang/article/details/38468547   //注解绑定UI

http://blog.youkuaiyun.com/lindir/article/details/7843109

http://blog.youkuaiyun.com/zhaokaiqiang1992/article/details/37929071

http://www.cnblogs.com/devinzhang/p/3862942.html      //依赖注入和控制反转

### 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 | | **适用范围大小** | 整体规模较大,通常覆盖整个企业级解决方案 | 相较之下更为聚焦局部区域内的视图更新需求 | 尽管两者所处的技术背景存在一定差异,但从本质上讲都是围绕着降低耦合度这条主线展开探索实践的结果。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值