一、思想理解

Spring
能有效地组织J2EE应用各层的对象。不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的
管理下有机地协调、运行。Spring将各层的对象以松耦合的方式组织在一起,Action对象无须关心Service对象的具体实现,Service对
象无须关心持久层对象的具体实现,各层对象的调用完全面向接口。当系统需要重构时,代码的改写量将大大减少。

上面所说的一切都得宜于Spring的核心机制,依赖注入。依赖注入让bean与bean之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起。

  依赖注入(Dependency Injection)和控制反转(Inversion of
Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在
传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者
实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。
  简而言之:所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转;所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。

不管是依赖注入,还是控制反转,都说明Spring采用动态、灵活的方式来管理各种对象。对象与对象之间的具体实现互相透明。

关于IOC的学习可以参看帮助文档:spring-3.2.0.M2\docs\reference\html目录下index.html的相关章节

二、IOC的相关操作
 A、IOC之Bean的实例化方式(只是实例化,并没有初始化)
   
1)使用类无参构造器实例化
<bean id="orderService"
class="cn.itcast.OrderServiceBean"/>
   
2)使用静态工厂方法实例化
<bean id="personService"
class="cn.itcast.service.OrderFactory"
factory-method="createOrder"/>

public class OrderFactory {
    public
static OrderServiceBean createOrder(){
   
    return new
OrderServiceBean();
    }
   3)通过非静态工厂方法实例化:
<bean id="personServiceFactory"
class="cn.itcast.service.OrderFactory"/>

<bean id="personService"
factory-bean="personServiceFactory"
factory-method="createOrder"/>

public class OrderFactory {
    public
OrderServiceBean createOrder(){
   
    return new
OrderServiceBean();
    }
}
-------------------------------------------------------------

B、IOC之Bean属性的依赖注入(DI)方式 
(即Bean的初始化)

  1)setter方法注入
   Course类中存在如下setter方法:
   public void setId(Intenger
id)
   { this.id = id;}
 
   <bean
id="course" class="com.etc.vo.Course">
   
   
<property name="id">
   
   
   
<value>1</value>

</property>
  </bean>
   2)构造方法注入
   public Course (Interge id ,
String title,Double price)
   {this.id = id; this.title =
title; this.price = price;}
   
   <bean
id="course4" class="com.etc.vo.Course">
   
   
<constructor-arg index="0">
   
   
   
<value>4</value>

</constructor-arg>
   
   
<constructor-arg index="1">
   
   
   
<value>Java</value>

</constructor-arg>
   
   
<constructor-arg index="2">
   
   
   
<value>1000</value>

</constructor-arg>
   
</bean>

###############:上面两种方式也可以写成下面的形式:

   <bean
id="orderService"
class="cn.itcast.service.OrderServiceBean">
   
<constructor-arg index="0"
value=“xxx”/>//构造器注入
   
<property name=“name”
value=“zhao/>//属性setter方法注入

   
</bean>

3)设置注入(使用属性文件的)
   
在项目开发中,有时候要从一些配置文件中(properties)读取一些配置信息,如数据库的连接信息。在Spring程序中可以从不同的
properties中读取有用的信息。这里要用到
org.springframeword.beans.factory.config.PropertyPlaceholderConfigurer类,它是BeanFactoryPostProcessor的实现类.

下面例子:
项目结构:

connet.properties:

driver=mysql
username=yuan
password=test

test.properties:

1 age=12
2 height=13
3 weight=14

Connect.java装载着两个properties的信息:下面

public class Connect {
    private
String driver;
    private
String username;
    private
String password;
    int
age;
    int
height;
    int
weight;
       
//省略getter,setter

}

beans.xml:

<?xml version="1.0"
encoding="UTF-8"?>
 <beans
xmlns="http://www.springframework.org/schema/beans"
    
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
    
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean id="propertyConfigurer"
        
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

  
<property
name="locations">
            
<list>
                
<value>connect.properties</value>

<value>test.properties</value>

</list>
        
</property>

    
</bean>

<bean id="connect"
class="com.sunflower.yuan.Connect">
        
<property name="driver">
            
<value>${driver}</value>

</property>

<property name="username">
            
<value>${username}</value>

</property>

<property name="password">
            
<value>${password}</value>

</property>

<property name="age">
            
<value>${age}</value>

</property>

<property name="height">
            
<value>${height}</value>

</property>

<property name="weight">
            
<value>${weight}</value>

</property>
    
</bean>
 
 </beans>

-------------------------------------------------------------

C、IOC之针对Bean不同类型属性的不同注入的配置方式(基于B的依赖注入)

 1)属性类型为8中基本数据类型以及其对应的包装类和String
 
<bean id="orderService" 
class="cn.itcast.service.OrderServiceBean">
   
<constructor-arg index="0"
value=“xxx”/>//构造器注入
   
<property name=“name”
value=“zhao/>//属性setter方法注入

  
</bean>
 2)属性为其他Bean类型
  public class Order
  {private Int id; private Customer
cust;....}

<bean id="custom" 
class="cn.itcast.service.CustomBean">
   
<property name=“name”
value="zhao"/>//属性setter方法注入

 </bean>

<bean id="order" class="cn.itcast.service.OrderBean">
<property
name=“id” value=1
/>

<property
name=“
cust”>

<ref
bean="custom">

</property>
</bean>

 3)属性为null
 
<property name="name">
    
<null></null>

</property>
 或者:

<property
name="name">
    
</null>
 
</property>
 而不能如下配置(此时该属性不为null,而是空字符串):
 
<property name="name">
    
<value></value>

</property>

  4)属性为集合类型 
  

  public class OrderServiceBean {
    private
Set<String> sets = new
HashSet<String>();
    private
List<String> lists = new
ArrayList<String>();
    private
Properties properties = new Properties();
    private
Map<String, String> maps = new
HashMap<String, String>();
       
....//这里省略属性的getter和setter方法
}
 
<bean id="order"
class="cn.itcast.service.OrderServiceBean">
   
<property name="lists">
         
<list>
   
<value>pkbest</value>

</list>
     
</property>   
   
     
<property name="sets">
        
<set>
           
<value>pkbest</value>

</set>
     
</property>   
   
    
<property name="maps">
       
<map>
           
<entry key=“pkbest"
value="28"/>
      
</map>

    
</property>   
   
    
<property name="properties">
       
<props>
   
<prop
key=“pk">best</prop>

</props>
     
</property>
</bean>

  5)关于使用的注解(Annotation
)方式为属性提供的依赖注入,请看下篇博文
-------------------------------------------------------------

D、Bean的作用域(基于B的依赖注入)
  Bean的作用域共有5种:
  
single(单例)
:默认作用域,只在Spring容器加载时创建唯一的bean实例,因此当多次使用getBean方法返回实例,获得的都是同一个唯一实例。如果想对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=“true“,如下:

<beans
default-lazy-init="true“
...>
 
prototype(原型)
:每次使用该Bean都会创建新的实例,我们使用spring管理struts2的action时,所有action的Bean的作用域应该是此类型

  request:表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP
request内有效
  session:
表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP
session内有效
  global
session
.不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet
web应用的各种不同的portlet所共享。
以上3种均基于web的Spring ApplicationContext情形下有效

例如:<bean id=“...”
class=“...” 
scope=“prototype”/>

-------------------------------------------------------------
E、 Bean的初始化方法和销毁方法

   <bean id="xxx"
class=“biz.OrderServiceBean" init-method="init"
destroy-method="close"
/>

public void init() {
     
System.out.println(“已经初始化了”);
  }
  public void close() {
     
System.out.println(“被销毁了”);
  }

总结:IOC和DI的技术基础是基于反射技术和JavaBean的自省技术(自省技术的核心是反射技术)

Spring学习3—控制反转(IOC)Spring依赖注入(DI)和控制反转(IOC)的更多相关文章

  1. 控制反转IOC与依赖注入DI【转】

    转自:http://my.oschina.net/1pei/blog/492601 一直对控制反转.依赖注入不太明白,看到这篇文章感觉有点懂了,介绍的很详细. 1. IoC理论的背景我们都知道,在采用 ...

  2. 控制反转IOC与依赖注入DI - 理论篇

    学无止境,精益求精 十年河东十年河西,莫欺少年穷 昨天是五一小长假归来上班的第一天,身体疲劳,毫无工作热情.于是就看看新闻,喝喝茶,荒废了一天 也就在昨天,康美同事张晶童鞋让我学习下IOC的理论及实现 ...

  3. 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。

    轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战   ...

  4. iOS控制反转(IoC)与依赖注入(DI)的实现

    背景 最近接触了一段时间的SpringMVC,对其控制反转(IoC)和依赖注入(DI)印象深刻,此后便一直在思考如何使用OC语言较好的实现这两个功能.Java语言自带的注解特性为IoC和DI带来了极大 ...

  5. PHP依赖注入(DI)和控制反转(IoC)详解

    这篇文章主要介绍了PHP依赖注入(DI)和控制反转(IoC)的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程 ...

  6. 控制反转IOC与依赖注入DI

    理解 IOC  http://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html IOC 相关实例      的http:// ...

  7. 控制反转(Ioc)和依赖注入(DI)

    控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基 ...

  8. 依赖注入(DI)和控制反转(IOC)

    依赖注入(DI)和控制反转(IOC) 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只 ...

  9. 20181123_控制反转(IOC)和依赖注入(DI)

    一.   控制反转和依赖注入: 控制反转的前提, 是依赖倒置原则, 系统架构时,高层模块不应该依赖于低层模块,二者通过抽象来依赖 (依赖抽象,而不是细节) 如果要想做到控制反转(IOC), 就必须要使 ...

  10. Spring框架学习笔记(1)——控制反转IOC与依赖注入DI

    Spring框架的主要作用,就是提供了一个容器,使用该容器就可以创建并管理对象.比如说Dao类等,又或者是具有多依赖关系的类(Student类中包含有Teacher类的成员变量) Spring有两个核 ...

随机推荐

  1. css3d

    立方体:http://sandbox.runjs.cn/show/1h6zvghj 原理分析:(左负右正) x:与屏幕水平:(在屏幕上) y:与屏幕水平方向垂直(在屏幕上) z:垂直于屏幕(在屏幕外) ...

  2. 如何将list转为json?

  3. 16SpringMvc_在业务控制方法中写入User,Admin多个模型收集参数——引出问题

    上面文章时普通的业务那个方法中收集一个实体类,这篇文章想收集两个实体类. 文本要做的是:在person.jsp页面上,有两个表单.分别是普通用户和管理员用户的表单(普通用户的表单和管理员用户的表单里面 ...

  4. swift 判断输入的字符串是否为数字

    // 判断输入的字符串是否为数字,不含其它字符 func isPurnInt(string: String) -> Bool { let scan: Scanner = Scanner(stri ...

  5. XML CDATA的作用

    操作XML文件时,如果允许用户输入内容,例如∶"< ".">"."/".""等,当生成XML时,会破坏了XM ...

  6. linux内核分析 第4章读书笔记

    第四章 进程调度 一.抢占与非抢占 1.非抢占式进程调度 进程会一直执行直到自己主动停止运行 2.抢占式进程调度 Linux/Unix使用的是抢占式的方式,强制的挂起进程的动作就叫做抢占. 二.进程优 ...

  7. Linux基础入门(20135207 王国伊)

    实验一  Linux系统简介 一.实验心得 首个实验是简单介绍了Linux系统的简介,了解Linux系统的历史和发展.使我受益匪浅 实验二  基本概念及操作 一.学习目标 1.实验楼环境介绍 2.常用 ...

  8. 连贯接口(fluent interface)的Java实现及应用。

    几年前在单元测试时使用mockito和junit(使用hamcrest提供的比较方法)的时候,就用到过这样类似的语法: mockito: when(mock.someMethod("some ...

  9. 关于 iOS 10 中 ATS / HTTPS /2017 问题

    本文于 2016 年 11 月 28 日按照 Apple 最新的文档和 Xcode 8 中的表现进行了部分更新. WWDC 15 提出的 ATS (App Transport Security) 是 ...

  10. ASP.NET 系列:RBAC权限设计

    权限系统的组成通常包括RBAC模型.权限验证.权限管理以及界面访问控制.现有的一些权限系统分析通常存在以下问题: (1)没有权限的设计思路 认为所有系统都可以使用一套基于Table设计的权限系统.事实 ...