`
spark_zeng
  • 浏览: 13966 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

转Spring之IOC

阅读更多
IOC:控制反转
    在spring中,new一个对象是由spring引擎控制的(通过spring上下文来new对象
的),这样new一个对象这个动作就不需要你在你的代码中实现那;而是由spring引
擎来实例化对象。说白那,就是你原来实例化一个对象的权利被spring给取代那,由
代码内部(例如:原来是 TEST test=new Test())转移到外部(外部你可以理解成
spring引擎或spring上下文),这就是所谓的控制反转;
 
其实“控制”两字我觉的就是new一个对象的权利动作(可能描述的不是很清楚);
”反转“:原来是由你手动new一个对象,现在是由spring来做这件事情那;
 
  1.  Spring 依赖注入原理学习   
  2.   
  3. 首先我们来看看 Spring 参考文档的 11.2.6. 执行SQL语句 这里有个代码片断:   
  4.   
  5. import javax.sql.DataSource;   
  6. import org.springframework.jdbc.core.JdbcTemplate;   
  7.   
  8. public class ExecuteAStatement {   
  9.   
  10.     private JdbcTemplate jt;   
  11.     private DataSource dataSource;   
  12.   
  13.     public void doExecute() {   
  14.         jt = new JdbcTemplate(dataSource);   
  15.         jt.execute("create table mytable (id integer, name varchar(100))");   
  16.     }   
  17.   
  18.     public void setDataSource(DataSource dataSource) {   
  19.         this.dataSource = dataSource;   
  20.     }   
  21. }   
  22.   
  23. 这个就是普通的 Java 类, 再参考 11.2.4. DataSource接口, 这里的另一个代码片断:   
  24. DriverManagerDataSource dataSource = new DriverManagerDataSource();   
  25. dataSource.setDriverClassName("org.hsqldb.jdbcDriver");   
  26. dataSource.setUrl("jdbc:hsqldb:hsql://localhost:");   
  27. dataSource.setUsername("sa");   
  28. dataSource.setPassword("");   
  29.   
  30. 当然上面的连接方式可以配置成我们课程里面介绍的 MyEclipse Derby 的数据库连接:   
  31. org.apache.derby.jdbc.ClientDriver   
  32. jdbc:derby://localhost:1527/myeclipse;create=true   
  33. app   
  34. app   
  35.   
  36. 我们可以写一个测试类来执行代码:   
  37.   
  38. import org.springframework.jdbc.datasource.DriverManagerDataSource;   
  39.   
  40. public class TestTemplate {   
  41.   public static void main(String[] args) {   
  42.     // 新建一个数据源对象   
  43.     DriverManagerDataSource dataSource = new DriverManagerDataSource();   
  44.     dataSource.setDriverClassName("org.hsqldb.jdbcDriver");   
  45.     dataSource.setUrl("jdbc:hsqldb:hsql://localhost:");   
  46.     dataSource.setUsername("sa");   
  47.     dataSource.setPassword("");   
  48.       
  49.     // 新建一个ExecuteAStatement 对象   
  50.     ExecuteAStatement eas = new ExecuteAStatement();   
  51.     // 给执行表达式的对象关联数据源(也就是常说的注入, 通过 JavaBean 的 setXxx 方法关联起来)   
  52.     eas.setDataSource(dataSource);   
  53.     // 执行功能代码   
  54.     eas.doExecute();   
  55.   }   
  56. }   
  57.   
  58. 这个代码可以跑通, 就是普通的编程方式, 大家可以去看刚才介绍的文档附近的详细说明.   
  59.   
  60. 那么如果用 Spring 来做, 代码会变成这样:   
  61. ExecuteAStatement 类代码保持不变, 多了个 beans.xml:   
  62. <?xml version="1.0" encoding="UTF-8"?>   
  63. <beans   
  64.  xmlns="http://www.springframework.org/schema/beans"  
  65.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  66.  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">   
  67.   
  68.  <bean id="userDAO" class="ExecuteAStatement">   
  69.   <property name="dataSource">   
  70.    <ref bean="myDataSource" />   
  71.   </property>   
  72.  </bean>   
  73.   
  74.  <bean id="myDataSource"  
  75.   class="org.springframework.jdbc.datasource.DriverManagerDataSource">   
  76.   <property name="driverClassName">   
  77.       <value>org.hsqldb.jdbcDriver</value>   
  78.   </property>   
  79.      
  80.   <property name="url">   
  81.       <value>jdbc:hsqldb:hsql://localhost:</value>   
  82.   </property>   
  83.      
  84.   <property name="username">   
  85.       <value>sa</value>   
  86.   </property>   
  87.      
  88.   <property name="password">   
  89.       <value></value>   
  90.   </property>         
  91.  </bean>   
  92.   
  93. </beans>   
  94.   
  95. 测试类:   
  96.   
  97. import org.springframework.context.ApplicationContext;   
  98. import org.springframework.context.support.ClassPathXmlApplicationContext;   
  99.   
  100. public class Test {   
  101.   
  102.  public static void main(String[] args) throws IOException {   
  103.   ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");   
  104.   ExecuteAStatement eas =(ExecuteAStatement)context.getBean("userDAO");   
  105.       // 执行功能代码   
  106.       eas.doExecute();   
  107.  }   
  108. }   
  109.   
  110. 和上面的 TestTemplate 类相比, 就会发现 new DriverManagerDataSource() 这个过程不用我们写了, 运行的时候会发现一切都执行的好好的, 也就是常说的 ExecuteAStatement 的 dataSource 这个属性被注入了.   
  111.   
  112. 那么这个过程到底该如何理解呢? Spring 是一个对象池, 可以简化为一个 Map, 存多个主键和对象的映射. 那么 Spring 运行的过程中, 会根据 beans.xml 一步步进行必要的解析工作:   
  113.   
  114. Map springEngine = new HashMap();   
  115.   
  116. OK, 解析到了   
  117. <bean id="userDAO" class="ExecuteAStatement">, 发现 bean 定义, 那就新建一个实例存到对象池里吧, 主键就是 userDAO, 值就是对象:   
  118. ExecuteAStatement bean1 = new ExecuteAStatement();   
  119. springEngine.put("userDAO", bean1);   
  120.   
  121. 再往下执行, 发现 property 定义:   
  122. <property name="dataSource">   
  123. 到了这里, 就知道应该调用 bean1.setDataSource(DataSource) 方法了. 可以接着执行, 发现   
  124. <ref bean="myDataSource" />, 哦, 这个方法的参数还没有呢, 是个 bean 的引用, 好了, 要调用这个方法, 还是先 new 一个名字为 myDataSource 的 bean2 吧. 就跳到下面寻找 myDataSource 的定义, 找到了:   
  125.  <bean id="myDataSource"  
  126.   class="org.springframework.jdbc.datasource.DriverManagerDataSource">   
  127.   <property name="driverClassName">   
  128.       <value>org.hsqldb.jdbcDriver</value>   
  129.   </property>   
  130.      
  131.   <property name="url">   
  132.       <value>jdbc:hsqldb:hsql://localhost:</value>   
  133.   </property>   
  134.      
  135.   <property name="username">   
  136.       <value>sa</value>   
  137.   </property>   
  138.      
  139.   <property name="password">   
  140.       <value></value>   
  141.   </property>         
  142.  </bean>   
  143. 像以前一样, 先实例化这个类, 然后看到 property 表情就调用对应的 setXxx() 这样的方法, 相当于下面一段代码:   
  144.     // 新建一个数据源对象   
  145.     DriverManagerDataSource bean2 = new DriverManagerDataSource();   
  146.     bean2.setDriverClassName("org.hsqldb.jdbcDriver");   
  147.     bean2.setUrl("jdbc:hsqldb:hsql://localhost:");   
  148.     bean2.setUsername("sa");   
  149.     bean2.setPassword("");   
  150. 不是还有个 bean 的 id 名字为 myDataSource 嘛, 那就把它存到对象池里面:   
  151.   
  152. springEngine.put("myDataSource", bean2);   
  153.   
  154. 好了, 最后就是把他们两个关联起来了, 通过 ref 里指定的 bean id 名来关联起来:   
  155.   
  156. // 省略类型转换的代码   
  157. springEngine.get("userDAO").setDataSource(springEngine.get("myDataSource"));   
  158.   
  159. 最后返回给用户的就是一个对象池(一个 Map)了, 所以别人调用的时候, 就发现 springEngine.get("userDAO") 回来的类的 dataSource 属性已经被实例化过了, 这些都是 Spring 幕后工作的代码, 通过反射机制来实现.   
  160.   
  161. 所以最后写代码调用:   
  162. context.getBean("userDAO") 的时候, 得到的是 ExecuteAStatement, 这时候还有一个 myDataSource, 也可以被调用:   
  163. context.getBean("myDataSource"), 得到的是 DriverManagerDataSource.   
  164.   
  165. 介绍的过程, 仅供参考. 欢迎大家交流更好的原理介绍文章.   
  166.   
  167.   
  168.     
  169.   
  170. 再转一篇别人推荐的通俗易懂的说明, 非实现方面的:   
  171.   
  172. IoC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。  
分享到:
评论
1 楼 spark_zeng 2007-08-02  
    

相关推荐

    springIoc实现原理

    Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由代码自身来完成,而在Spring Ioc中...

    Spring中IoC优点与缺点解析

    Spring 中 IoC 优点与缺点解析 IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 ...

    Spring之IOC示例

    在IT行业中,Spring框架是Java开发领域中一个极为...通过阅读《Spring之IOC示例》这篇博客(博文链接:https://huangminwen.iteye.com/blog/1041298),可以更深入地理解Spring的IOC机制,并学习如何在实际项目中应用。

    Spring-ioc-jar

    Spring IOC,全称为Inversion of Control,中文常被称为“控制反转”,是Spring框架的核心特性之一。这个概念在软件设计中引入了一种新的依赖管理方式,它将对象的创建和管理权交给了容器,使得开发者可以更专注于...

    模拟实现Spring的IOC

    模拟实现__Spring的Ioc 1、Spring主要两个作用:实例化Bean,动态装配Bean。并将所有的bean放到spring容器中,调用时从容器中取。Spring容器就是一个bean的Map:private Map, Object&gt; beans = new HashMap, Object&gt;...

    spring_ioc

    这是spring_ioc部分的内容。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

    Spring源码分析_Spring_IOC

    在探讨Spring框架的核心组件之一——IOC(Inversion of Control,控制反转)容器之前,首先需要理解它在Spring框架中的角色与地位。对于Spring的使用者而言,IOC容器不仅是管理Bean(即应用中的对象实例)生命周期的...

    模拟Spring的IOC

    在Java世界中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IOC)能力,成为企业级应用开发的首选框架之一。理解并模拟Spring的IOC机制对于深入学习Spring...

    Spring的ioc小案例

    本案例主要探讨的是Spring框架的核心特性之一——依赖注入(Dependency Injection,简称DI),通常也被称为IOC(Inversion of Control,控制反转)。通过这个小案例,我们可以深入理解Spring如何实现IoC以及属性注入...

    Spring-IOC笔记

    spring-IOC的一些笔记心得

    springIOC手写框架分析

    springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...

    Spring-IOC实现

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交由Spring容器处理,使得开发者可以更专注于业务逻辑的编写,而不是对象的生命周期管理。下面,我们将深入探讨Spring...

    spring ioc模块手写demo

    spring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demo...

    以注解方式模拟Spring IoC AOP

    依赖注入是Spring框架的核心特性之一,它通过反转对象创建和管理的控制权,使得应用程序组件之间的耦合度降低。在Spring中,通常通过以下三种注解实现IoC: - `@Autowired`:自动装配,Spring会根据类型或名称找到...

    Spring的IoC实现案例

    在本文中,我们将深入探讨如何使用Spring的Inversion of Control(IoC)容器来实现一个具体的案例:控制打印机(Printer)类与不同类型的纸张(Paper)类的交互。Spring的IoC允许我们解耦组件,使代码更加灵活且易于...

    spring ioc

    Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件之间的依赖管理。在本文中,我们将深入探讨 Spring IOC 的概念、工作原理以及如何在实际项目中应用。 首先,理解 IOC ...

    Spring_IOC-v(上)笔记

    IoC 技术是 Spring 框架的核心概念之一,它的主要思想是将对象的创建和管理交给容器来管理,而不是由对象自己来管理。这样可以降低对象之间的耦合度,提高系统的灵活性和可维护性。 在 Spring 中,IoC 通过依赖...

    spring ioc和aop原理流程图(详细)

    Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...

    Spring_IOC详解.pdf

    Spring框架作为Java企业级应用开发的基石,其核心组件之一便是IOC(Inverse of Control)容器。IOC容器负责管理应用程序中的对象及其依赖关系,实现了控制反转,极大地简化了Java应用的开发流程。本文将基于Spring...

Global site tag (gtag.js) - Google Analytics