首先假设有一个需求,类Business需要调用类Dependency的方法f()
1).按照日常的做法,得到下面的代码:
//**类Dependency**
public class Dependency {
public void f() {};
}
//**类Business**
public class Business {
Dependency d;
public Business() {
d = new Dependency();
}
public void doSomething() {
d.f();
}
}
2).对上述实现做出如下修改:
首先,将Business里的Dependency实例的获得该为setter方式,其次,将Dependency类改为某个接口的实现。故可以得到下面新的代码:
//**接口IDependency**
public interface IDependency {
void f();
}
//**类Dependency**
//此处为接口IDependency的实现
public class Dependency implements IDependency{
public void f() {};
}
//**类Business**
public class Business {
IDependency d;
public Business() {}
public void doSomething() {
d.f();
}
public void setDependency(IDependency d) {
this.d = d;
}
}
在新的代码中,首先Business的变量d可以接收任何IDependency的实例,另外,Dependency的实例不是通过Business来获得,而是通过setter(也可以用构造器)来由外部传给它。这似乎跟我们往常的代码没什么不同,但这已经是一个良好的设计。关键就是Dependency的实例如何从外部注入给Business呢?
这就要通过xml来实现了。
创建一个SpringFirst.xml,进行简单的配置:
<beans>
<bean id = "dependency" class = "aopfirst.business.Dependency" />
<bean id = "business" class = "aopfirst.business.Business">
<property name = "dependency">
<ref bean = "dependency" />
</property>
</bean>
</beans>
单有了这个xml文件还不够,还需要一个测试类来加载该xml文件,spring提供了现成的API,在加载上面的xml的时候,就进行了如下工作:实例化Dependency类,实例化Business类,并将Dependency的实例作为参数赋给了Business实例的
setDependency()方法。下面是该测试程序:
public class StartServer {
public static void main(String [] args) {
ClassPathResource cr = new ClassPathResource("SpringFirst.xml");
BeanFactory factory = new XmlBeanFactory(cr);
Business b = (Business)factory.getBean("business");
b.doSth();
}
}
上面的程序加载了xml以后,获得id为"business"的bean,即Business类的实例,并调用了其doSth()方法。由此可见,Business的依赖类Dependency是通过xml来注入的,而且Business是通过接口IDependency来接收Dependency实例。因此,当我们又有新的IDependency的实现时,只需要修改xml文件即可,测试程序只需要根据xml里的id值来获得需要的参数。
总结上面的例子,对控制反转和依赖注入已经能理解了。依赖类(Dependency)是通过外部(xml)来注入的,而不是由使用它的类(Business)来自己制造,这就是依赖的注入。另一方面,Business对类Dependency的依赖转移到对接口IDependency的依赖,控制权由类转移到了接口,即由"实现"转移到"抽象"中。这就是控制反转。
分享到:
相关推荐
### Spring IOC控制反转详解 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,提供了全面的基础架构支持,让开发者能够轻松地开发出松耦合的应用程序。它通过依赖注入(Dependency Injection, DI)和...
本文文档中有 控制反转 DI依赖注入,希望可以给大家在技术上有一点的帮助
spring IOC控制反转 spring IOC控制反转 spring IOC控制反转
**Spring技术--IOC控制反转** 在Java开发领域,Spring框架以其强大的功能和广泛的应用而闻名。其中,IOC(Inversion of Control,控制反转)是Spring的核心特性之一,它改变了传统对象创建和管理的方式,实现了依赖...
### IOC控制反转在代码中的体现 #### 一、IOC(Inversion of Control)概念解析 IOC,即控制反转,是一种设计思想,在Java开发领域中,它主要被用来消除程序之间的依赖性,使得类的设计更加灵活。传统的编程模式下...
IOC控制反转代码,bilibili配套文件 IOC(Inversion of Control,控制反转)是 Spring 框架的核心机制之一,它是一个用于创建和管理对象的容器。控制反转是将对象的创建进行反转,常规情况下,对象都是开发者手动...
### IOC控制反转学习文档 #### 一、控制反转(IOC)概述 控制反转(Inversion of Control,简称IOC),是Spring框架的核心概念之一。它通过管理对象间的依赖关系,实现了对象的解耦,使得代码更加灵活且易于维护。在...
【Spring框架IoC控制反转】 一、Spring框架是什么 Spring框架是Java开发中的一款轻量级框架,诞生于2003年,旨在简化企业级应用的开发复杂性。Spring的核心理念包括控制反转(IoC)和面向切面编程(AOP)。作为一...
### Spring框架中的IoC控制反转详解 #### 一、IoC概述 控制反转(Inversion of Control,简称IoC)是一种设计思想,在Spring框架中,它主要用来解决对象依赖问题。传统的面向对象编程中,对象之间的依赖关系由对象...
**Spring IOC控制反转详解** 在Java开发中,Spring框架的核心特性之一就是IOC(Inversion of Control,控制反转),它改变了传统程序设计中的对象依赖管理方式,使得开发者可以更专注于业务逻辑,而不是对象的创建...
基础与环境搭建 Bean使用详解 IOC控制反转 AOP切面编程 事务管理机制 MVC开发模式
"IoC(控制反转)"是软件设计模式中的一个重要概念,它在现代软件开发,特别是.NET框架下的C#编程中占据了核心地位。控制反转的主要思想是将对象之间的依赖关系从代码内部转移到外部容器,从而使代码更加灵活、可...
【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 ) https://hanshuliang.blog.csdn.net/article/details/120404805 博客源码快照
【IOC 控制反转】Android 布局依赖注入 ( 布局依赖注入步骤 | 布局依赖注入代码示例 ) https://hanshuliang.blog.csdn.net/article/details/120402953 博客源码快照
Spring框架的核心特性之一就是依赖注入(Dependency Injection,简称DI),它通过控制反转(Inversion of Control,简称IOC)实现。这个"helloIoc.zip"压缩包包含的是一组用于演示Spring IOC基本概念和使用的测试...
IOC(Inversion of Control,控制反转)是一种设计原则,它改变了传统程序设计中对象之间的依赖关系。在没有IOC的情况下,一个对象通常会自行创建或查找它需要协作的对象,这导致了对象间的紧密耦合。然而,IOC通过...
控制反转(IOC,Inversion of Control)是一种设计模式,它在软件工程中被广泛应用,特别是在Java开发中。IoC的核心思想是将对象的创建和管理权交给一个外部容器,而不是让对象自行创建和管理依赖。这有助于降低耦合...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它改变了传统Java应用程序中对象的创建和管理方式。在传统的程序设计中,我们通常手动创建对象并管理它们之间的依赖关系,而在Spring中,这些...
在本案例中,我们将探讨如何使用Autofac来实现数据库操作的控制反转。 首先,了解Autofac的基本概念。Autofac是一个轻量级的DI库,它允许开发者在运行时动态地组合应用程序组件。通过注册服务(接口或抽象类)和...
在软件开发领域,IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是两种重要的设计模式,特别是在Java和Spring框架中被广泛使用。这些概念有助于提高代码的可测试性、可维护性和模块...