- 浏览: 707011 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (260)
- web 开发 (44)
- struts (14)
- java (39)
- 我的感受 (2)
- ajax (2)
- spring (22)
- Hibernate (4)
- struts2 (1)
- java 面试题 (1)
- 英语 学习类 (2)
- jdk1.6特性 (1)
- extjs (13)
- oracle (3)
- JQuery (3)
- ┠ 『Spring 3.0』 ┨ (1)
- 『LOG4J』 (2)
- 『常用数据』 (1)
- JavaMail (0)
- 〓『 EJB3.0 』〓 (0)
- HTML5 (5)
- Canvas (0)
- spring2.5 (0)
- HPH 5 (1)
- C# .net (0)
- UML (1)
- REST (2)
- JS_validate (1)
- 项目管理文章 (1)
- 闲聊闲记 (12)
- SQL-SQL (3)
- javascript (18)
- js (4)
- linux (8)
- 电子政务 (1)
- 项目对象模型 (1)
- 系统集成项目管理 (1)
- shell (2)
- mysql (1)
- solr (5)
- cxf;services (2)
- 11 (0)
- 缓存 (1)
- cached (3)
- 单片机通信 (1)
- cached;oscache (1)
- android (15)
- android;蓝牙 (1)
- Lucene (5)
- TTS (1)
- 网络爬虫 (1)
- HtmlCleaner (1)
- iPhone (2)
- 有感而发 (1)
- Python (0)
- jetty (1)
- Redis (1)
- hadoop (1)
- socket (1)
- 色彩顾问 (1)
- javaapns (1)
- bat (1)
- object-c (4)
- ios (4)
- C-学习 (1)
- 搜索 (1)
- c# (1)
最新评论
-
annie211:
Angularjs构建一个CRUD应用可能用到的全部内容包括:数据绑定、基本模板标识符、表单验证、路由、深度链接、组件重用、依赖注入 -
潇寒听竹:
你好,请问您上传的那个APK为什么每次只能识别一次,不能连续识 ...
pocketsphinxAdroid离线语音识别---入门 -
ichenwenjin:
Angularjs构建一个CRUD应用可能用到的全部内容包括:数据绑定、基本模板标识符、表单验证、路由、深度链接、组件重用、依赖注入 -
NN_iaoiao:
问一下 你的这个People 类 是自定义的还是android ...
android 获取电话本中的联系人列表 -
wangzhe_real:
对于刚接触的我是一个很详细的教程,太感谢了
JAX-RS cxf web服务 rest简单增删改查 集成spring webService
IOC,全称(Inverse Of Control),中文意思为:控制反转,Spring框架的核心基于控制反转原理。
什么是控制反转?
控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术。
l 由容器控制程序之间的关系,而不是由代码直接控制
l 由于控制权由代码转向了容器,所以称为反转
对象与对象之间的关系可以简单的理解为对象之间的依赖关系:
依赖关系:在A类需要类B的一个实例来进行某些操作,比如在类A的方法中需要调用类B的方法来完成功能,叫做A类依赖于B类。
一个需要特定的依赖的组件一般会涉及一个依赖对象,在IOC的概念中叫做目标(target)。换句话说,IOC提供了这样的服务,使一个组件能够在它的整个生命周期中访问它的依赖和服务,用这种方法与它的依赖进行交互。总的来说,IOC能够被分解为两种子类型:依赖注入和依赖查找。
(1)依赖查找
比如使用JNDI注册一个数据库连接池的示例中,代码中从注册处获得依赖关系的JNDI查找(JNDI lookups):
initContext = new InitialContext(); //获取数据源 DataSource ds = (DataSource) initContext.lookup("java:comp/env/jdbc/mysql"); |
(2)依赖注入
(Dependency Injection)依赖注入:两个对象之间的依赖关系在程序运行时由外部容器动态的注入依赖行为方式称为依赖注入(DI)。DI是IOC的一种形式。
IoC在应用开发中是一个非常有力的概念。如Martin Flower所述,IoC的一种表现形式就是依赖性注射。依赖性注射用的是好莱坞原则,"不要找我,我会找你的。"。换句来说,你的类不会去查找或是实例化它们所依赖的类。控制恰好是反过来的,某种容器会设置这种依赖关系。使用IoC常常使代码更加简洁,并且为相互依赖的类提供一种很好的方法。
依赖注入的三种实现类型:接口注入、Setter注入和构造器注入。
<1>接口注入(Type1)
public class ClassA { private InterfaceB clzB; public void doSomething() { Ojbect obj =Class.forName(Config.BImplementation).newInstance(); clzB = (InterfaceB)obj; clzB.doIt() } …… } |
上面的代码中,ClassA依赖于InterfaceB的实现,如何获得InterfaceB实现类的实例?传统的方法是在代码中创建InterfaceB实现类的实例,并将起赋予clzB。
而这样一来,ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码,我们根据预先在配置文件中设定的实现类的类名(Config.BImplementation),动态加载实现类,并通过InterfaceB强制转型后为ClassA所用。这就是接口注入的一个最原始的雏形。
而对于一个Type1型IOC容器而言,加载接口实现并创建其实例的工作由容器完成,见如下代码。
public class ClassA { private InterfaceB clzB; public Object doSomething(InterfaceB b) { clzB = b; return clzB.doIt(); } …… } |
在运行期,InterfaceB实例将由容器提供。
Type1型IOC发展较早(有意或无意),在实际中得到了普遍应用,即使在IOC的概念尚未确立时,这样的方法也已经频繁出现在我们的代码中。
下面的代码大家应该非常熟悉:
public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException { …… } } |
这也是一个Type1 型注入,HttpServletRequest和HttpServletResponse实例由Servlet Container在运行期动态注入。
<2>Setter(设值)注入(Type2)
各种类型的依赖注入模式中,设值注入模式在实际开发中得到了最广泛的应用。
public class ClassA { private InterfaceB clzB; public void setClzB(InterfaceB clzB) { this. clzB = clzB; } …… } |
详见Hello World程序
<3>构造器注入(Type3)
依赖关系是通过类构造函数建立的
容器通过调用类的构造方法将其所需的依赖关系注入其中
public class DIByConstructor { private final DataSource dataSource; public DIByConstructor(DataSource ds) { this.dataSource = ds; } …… } |
<4>三种依赖注入方式的比较
接口注入:
接口注入模式因为历史较为悠久,在很多容器中都已经得到应用。但由于其在灵活性、易用性上不如其他两种注入模式,因而在IOC的专题世界内并不被看好。
Setter注入:
l 对于习惯了传统javabean开发的程序员,通过setter方法设定依赖关系更加直观。
l 如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。
l 如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。
构造器注入:
l 在构造期间完成一个完整的、合法的对象。
l 所有依赖关系在构造函数中集中呈现。
l 依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。
l 只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。
总结:
可见,Type3和Type2模式各有千秋,而Spring、PicoContainer都对Type3和Type2类型的依赖注入机制提供了良好支持。这也就为我们提供了更多的选择余地。理论上,以Type3类型为主,辅之以Type2类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于Spring Framework开发的应用而言,Type2使用更加广泛。
发表评论
-
Java 数据验证
2017-05-12 10:27 1101在web开发当前就会遇到一些数据有效性验证的相关代码编 ... -
spring mvc rest 小例子
2012-05-24 15:35 1838http://localhost:8080/mainrest/ ... -
JAX-RS cxf web服务 rest简单增删改查 集成spring webService
2011-09-14 14:35 5759没时间什么也不多说了。所有的话都在代码里。 ... -
aop svn
2010-11-30 08:31 1014aop http://student.csdn.net/sp ... -
spring 2.5 mvc 注解 ajax 实现
2010-03-07 19:30 4261spring 2.5 的mvc 大量的使用了注解,减少了xml ... -
spring 2.5 注释驱动的IOC功能
2010-03-04 04:18 1564spring 注释功相当于 以前在spring的配置文件的b ... -
spring 2.0_MVC+Ibatis web 实例
2010-03-04 01:50 2591这个便子是我在面试之后回来做的, 前段时间不久,我去面 ... -
spring 2.0 配置文 件头
2010-02-28 00:02 129<?xml version="1.0" ... -
Spring Jar包详解
2010-01-28 13:35 1314摘自:http://vc88.iteye.com/ ... -
spring配置事务
2010-01-27 17:38 1979<?xml version="1.0" ... -
SSH(Spring+Struts+Hibernate)综合应用
2009-08-04 23:56 1508(1)Struts与Spring整合 <1> 在 ... -
spring 事务管理
2009-08-04 23:31 1665对于J2EE 应用程序而言,事务的处理一般有两种模式: ... -
在Spring应用中使用Hibernate
2009-08-04 11:56 1039<1>Spring in Hibernate示例 ... -
JDBC操作的Java对象化
2009-08-03 23:41 133org.springframework.jdbc.object ... -
基于Spring的数据访问
2009-08-03 22:52 1083(1)在Spring应用中使用JDBC Spring对JDB ... -
Spring中常用三种通知
2009-08-03 17:14 1247(1)前置通知 接口:org.springframework ... -
Spring的体系结构
2009-08-03 16:42 3855Spring 框架是一个分层架 ... -
Spring bean的封装机制
2009-08-03 16:31 1742Spring 从核心而言,是一个DI 容器,其设计哲学是提供一 ... -
spring 中 Bean继承
2009-08-03 16:29 2036某些情况下,你也许需要定义多个实现了共用接口的相同类型的bea ... -
spring 中自动装配你的Bean
2009-08-03 16:27 1881如果你不喜欢自己将你的程序装配起来,你可以尝试让Spring自 ...
相关推荐
### Spring IOC控制反转详解 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,提供了全面的基础架构支持,让开发者能够轻松地开发出松耦合的应用程序。它通过依赖注入(Dependency Injection, DI)和...
spring IOC控制反转 spring IOC控制反转 spring IOC控制反转
**Spring IOC控制反转详解** 在Java开发中,Spring框架的核心特性之一就是IOC(Inversion of Control,控制反转),它改变了传统程序设计中的对象依赖管理方式,使得开发者可以更专注于业务逻辑,而不是对象的创建...
Spring框架的核心特性之一就是依赖注入(Dependency Injection,简称DI),它通过控制反转(Inversion of Control,简称IOC)实现。这个"helloIoc.zip"压缩包包含的是一组用于演示Spring IOC基本概念和使用的测试...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它改变了传统Java应用程序中对象的创建和管理方式。在传统的程序设计中,我们通常手动创建对象并管理它们之间的依赖关系,而在Spring中,这些...
Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由代码自身来完成,而在Spring Ioc中...
基于annotation注解方式理解SpringIOC控制反转
### Spring框架中的IoC控制反转详解 #### 一、IoC概述 控制反转(Inversion of Control,简称IoC)是一种设计思想,在Spring框架中,它主要用来解决对象依赖问题。传统的面向对象编程中,对象之间的依赖关系由对象...
【Spring框架IoC控制反转】 一、Spring框架是什么 Spring框架是Java开发中的一款轻量级框架,诞生于2003年,旨在简化企业级应用的开发复杂性。Spring的核心理念包括控制反转(IoC)和面向切面编程(AOP)。作为一...
**Spring技术--IOC控制反转** 在Java开发领域,Spring框架以其强大的功能和广泛的应用而闻名。其中,IOC(Inversion of Control,控制反转)是Spring的核心特性之一,它改变了传统对象创建和管理的方式,实现了依赖...
Spring IOC(Inversion of Control,控制反转)是一种软件设计模式,它将对象的创建和管理交给容器,实现了对象之间的解耦合。 SpringIOC是Spring Framework中的核心组件之一,负责管理应用程序中的对象、依赖关系和...
IoC 控制反转 IoC(Inversion of Control)是指在软件设计中,将对象实例的控制权从代码控制剥离到容器控制。这样做的目的是为了降低耦合度,提高系统的灵活性和可维护性。在 Spring 中,我们使用 XML 文件来配置...
Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...
Spring IOC,全称Inversion of Control,即“控制反转”,是Spring框架的核心特性之一。在传统的Java应用程序中,对象的创建和管理通常由开发者自己控制。而在Spring IOC中,这种控制权被反转,对象的创建、初始化、...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性之一,它允许开发者将对象的创建和管理交给Spring容器来处理,从而使代码更加松耦合,更易于测试和维护。下面将详细介绍Spring IOC的基本概念、...
Java中的控制反转(IOC,Inversion of Control)和Spring框架是现代企业级应用开发的核心概念。IOC使得应用程序的组件之间解耦,提高了代码的可测试性和可维护性。本篇文章将详细探讨如何通过反射机制来实现一个简单...
Spring IOC,即Spring控制反转,是Spring框架的核心特性之一。控制反转(Inversion of Control,简称IoC)是一种设计原则,用于减少代码间的耦合,提高系统模块化和代码的重用性。在Spring框架中,IOC具体体现在对...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它极大地简化了Java应用的开发,通过将对象的创建和管理交由Spring容器来处理,开发者可以更专注于业务逻辑。下面,我们将深入探讨Spring IOC...
Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...
**Spring框架中的IoC(控制反转)概念** 在软件开发中,IoC(Inversion of Control,控制反转)是一种设计模式,它将对象的创建和管理责任从代码中剥离出来,交由一个容器来处理。Spring框架是Java平台上的一个核心...