Spring Ioc知识整理

Ioc知识整理(一):

IoC (Inversion of Control) 控制反转。

1.bean的别名

我们每个bean元素都有一个id属性,用于唯一标识实例化的一个类,其实name属性也可用来标识一个类,我们还可以通过</alias>元素来给一个bean起一个别名:

    <bean name="doSpring" class="com.xiaoluo.spring.DoSpring">
    </bean>    

    <alias name="doSpring" alias="do"/>

前提是已经实例化了一个bean,name属性="doSpring",这样在getBean时不但可以用doSpring,也可以用do来代替。

2.集合的合并

从Spring 2.0开始,就可以使用集合的合并,我们可以定义parent-style和child-style的<list/><map/><set/><props/>元素,子集合的值从其父集合继承和覆盖而来;也就是说,父子集合元素合并后的值就是子集合中的最终结果,而且子集合中的元素值将覆盖父集全中对应的值:

    <bean id="parent" class="com.xiaoluo.spring2.Parent" abstract="true">
        <property name="parentProperties">
            <props>
                <prop key="administrator">[email protected]</prop>
                <prop key="support">[email protected]</prop>
            </props>
        </property>
    </bean>    

    <bean id="child" parent="parent">
        <property name="parentProperties">
            <props merge="true">
                <prop key="sales">[email protected]</prop>
                <prop key="support">[email protected]</prop>
            </props>
        </property>
    </bean>        

当在child里想要使用集合合并时,merge属性设置成true,则当child bean被容器实际解析及实例化时,其 adminEmails将与父集合的adminEmails属性进行合并。注意到这里子bean的Properties集合将从父<props/>继承所有属性元素。同时子bean的support值将覆盖父集合的相应值。结果如下:

{[email protected], [email protected], [email protected]}

如果不设置merge="true",则child bean在被容器实例化时,就不会合并父集合的属性,而只会得到自己集合的内容,结果如下:

{[email protected], [email protected]}

3.自动装配模式(autowire mode):

直接上spring官方文档截图:

当然自动装配也存在着一下优缺点,大家可以根据实际需要选择是否使用自动装配:

优点:

  • 自动装配能显著减少配置的数量。不过,采用bean模板也可以达到同样的目的。
  • 自动装配可以使配置与java代码同步更新。例如,如果你需要给一个java类增加一个依赖,那么该依赖将被自动实现而不需要修改配置。因此强烈推荐在开发过程中采用自动装配,而在系统趋于稳定的时候改为显式装配的方式。

缺点:

  • 尽管自动装配比显式装配更神奇,但是,正如上面所提到的,Spring会尽量避免在装配不明确的时候进行猜测,因为装配不明确可能出现难以预料的结果,而且Spring所管理的对象之间的关联关系也不再能清晰的进行文档化。
  • 对于那些根据Spring配置文件生成文档的工具来说,自动装配将会使这些工具没法生成依赖信息。

如果在自动装配时想将某个bean排除在自动装配之外,只需要将该bean的autowire-candidate属性设置成false即可,这样在自动装配时会忽略掉该bean。

4.依赖检查

模式 说明

none 没有依赖检查,如果bean的属性没有值得话可以不设置

simple 对于原始类型及集合(除协作者外的一切东西)执行依赖检查

object 仅对协作者执行依赖检查

all 对协作者,原始类型及集合执行依赖检查

5.bean作用域:

singleton:顾名思义,类似于单例模式,但是请注意:Spring的singleton bean概念与“四人帮”(GoF)模式一书中定义的Singleton模式是完全不同的。经典的GoF Singleton模式中所谓的对象范围是指在每一个ClassLoader指定class创建的实例有且仅有一个。把Spring的singleton作用域描述成一个container对应一个bean实例最为贴切。对于无状态的类(只包含方法而没有成员变量),为其生成bean时通常将其scope定义为singleton,singleton是bean作用域的缺省作用域,这样多个对象在引用时都共享这一份对象。

<bean id="personServiceTarget" class="com.xiaoluo.service.impl.PersonServiceImpl" scope="singleton" />

prototype:Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。

<bean id="savePersonAction" class="com.xiaoluo.action.person.SavePersonAction" scope="prototype" />

注意:在web应用中,对于action或者servlet的bean,其bean作用域一定要定义成prototype或者是request(spring3我将bean定义成request不成功不知道为什么,所以建议统一定义成prototype)!

request:针对每次HTTP请求,Spring容器会根据loginAction bean定义创建一个全新的LoginAction bean实例, 且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态, 而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。 当处理请求结束,request作用域的bean实例将被销毁。

<bean id="loginAction" class="com.xiaoluo.action.LoginAction" scope="request" />

6.bean生命周期:

Spring提供了几个标志接口(marker interface),这些接口用来改变容器中bean的行为;它们包括InitializingBeanDisposableBean。实现这两个接口的bean在初始化和析构时容器会调用前者的afterPropertiesSet()方法,以及后者的destroy()方法。

1)初始化回调:

实现org.springframework.beans.factory.InitializingBean接口允许容器在设置好bean的所有必要属性后,执行初始化事宜。InitializingBean接口仅指定了一个方法:

void afterPropertiesSet() throws Exception;

通常,要避免使用InitializingBean接口并且不鼓励使用该接口,因为这样会将代码和Spring耦合起来,有一个可选的方案是,可以在Bean定义中指定一个普通的初始化方法,然后在XML配置文件中通过指定init-method属性来完成。如下面的定义所示:

<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init" />

public class ExampleBean {

    public void init() {
        // do some initialization work
    }
}

效果和下面一模一样:

<bean id="exampleInitBean" class="examples.AnotherExampleBean" />

public class AnotherExampleBean implements InitializingBean {

    public void afterPropertiesSet() {
        // do some initialization work
    }
}

这里建议使用第一种方式,这样不会将代码和Spring耦合在一起。

2)折构回调:

如同初始化回调,折构回调也定义了一个标志接口,实现org.springframework.beans.factory.DisposableBean接口的bean允许在容器销毁该bean的时候获得一次回调。DisposableBean接口也只规定了一个方法:

void destroy() throws Exception;

通常,要避免使用DisposableBean标志接口而且不鼓励使用该接口,因为这样会将代码与Spring耦合在一起,有一个可选的方案是,在bean定义中指定一个普通的析构方法,然后在XML配置文件中通过指定destroy-method属性来完成。如下面的定义所示:

<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup" />

public class ExampleBean {

    public void cleanup() {
        // do some destruction work (like releasing pooled connections)
    }
}

效果和下面代码一样:

<bean id="exampleInitBean" class="examples.AnotherExampleBean" />

public class AnotherExampleBean implements DisposableBean {

    public void destroy() {
        // do some destruction work (like releasing pooled connections)
    }
}

Spring Ioc知识整理

时间: 2024-10-05 20:46:59

Spring Ioc知识整理的相关文章

Spring学习篇:AOP知识整理

AOP知识整理 AOP(Aspect-Oriented Programming):面向切面的编程.OOP(Object-Oriented Programming)面向对象的编程.对于OOP我们已经再熟悉不过了,对于AOP,可能我们会觉得是一种新特性,其实AOP是对OOP的一种补充,OOP面向的是纵向编程,继承.封装.多态是其三大特性,而AOP是面向横向的编程. 面向切面编程(AOP)通过提供另外一种思考程序结构的途经来弥补面向对象编程(OOP)的不足.在OOP中模块化的关键单元是类(classe

Spring?IOC设计原理解析:本文乃学习整理参考而来

Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. IoC容器的初始化 1. XmlBeanFactory(屌丝IOC)的整个流程 2. FileSystemXmlApplicationContext 的IOC容器流程 1.高富帅IOC解剖 2. 设置资源加载器和资源定位 3.AbstractApplicationContext的refresh函数载入

Spring IOC整理

示例展示 Spring的一大特点是利用配置的xml文件实现依赖注入. 所谓依赖注入是指把一个业务对象注入另一个业务对象,从而达到对象间的松耦合.(注意是业务对象哦!)依赖注入讲的通俗一点,就是让一个对象的创建不用new了,可以自动的生产.这其实是利用java里的反射,反射就是在运行时动态的去创建.调用对象. 下面我们来举个例子(具体代码参见右侧源码,只适合菜鸟看) 示例场景 场景:现在有个磁盘输出的业务,客户端需要通过2个业务对象进行输出. 一个是通过Floppy(软盘),另一个是通过USB接口

J2EE知识整理(二)

就在前不久,一个资深JAVA经理兼HR跟我说,做Java web的,一定要会Spring,不止是会用,还要深入进去,看看它的实现原理,以及是怎么编写的,对此我表示鸭梨很大,内部结构,原理啥都只能先放着一遍,先来看看Spring是怎么做的. IOC?DI?这是个咩啊! 关于控制反转或者说依赖注入到底是个什么意思,这里就不多加说明了,Spring in Action专业度爆脖主的距离怕有该书作者到脖主的地理位置那么远,还是直接来看看是怎么做的吧 public class DbInfoServlet

Spring -- IOC/DI 基础概念的理解

Spring -- IOC/DI 基础概念 思维导图: ------------------------------------------------------- IoC/DI 的基本概念 IoC是什么 ? IoC -- Inversion of control, 控制反转   在Java开发中,IoC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则. 理解IoC的关键是明

Spring:源码解读Spring IOC原理

Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. IoC容器的初始化 1. XmlBeanFactory(屌丝IOC)的整个流程 2. FileSystemXmlApplicationContext 的IOC容器流程 1.高富帅IOC解剖 2. 设置资源加载器和资源定位 3.AbstractApplicationContext的refresh函数载入

【SSH系列】深入浅出spring IOC中三种依赖注入方式

spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控制什么?依赖注入和控制反转是一样的概念吗?接触新的知识,小编的脑袋中全是大大的问号,不过没有关系,今天这篇博文,小编主要来简单的介绍一下在spring IOC中依赖注入的方法. 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性.我们可以从以下几个方面理解: a.参与者都

菜鸟学习spring IOC有感

 一.spring IOC思想引入 事实上对于刚開始学习的人来说,在学习IOC的时候确实有点困难,主要是掌握其思想方面存在一丢丢的障碍,可是假设可以跨过这个障碍,则可以高速掌握当中的思想了.单从字面上来讲,事实上IOC(反向控制)指的就是控制方向发生了变化.我们常常会遇到这句话:"实现必须依赖抽象,而不是抽象依赖实现."尽管这句话表达了反向控制的概念,可是对于刚開始学习的人来讲,确实不是非常好理解.接下来我们就通过一些实例去理解这些内容的含义. 首先我们创建两个类,一个用于连接数据

[Spring框架]Spring IOC的原理及详解。

这里感谢 CSDN 的原博客:http://blog.csdn.net/m13666368773/article/details/7802126 看后  受益匪浅,这里再重温一遍Spring IOC 1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针.分针和秒针顺时针旋转,从而在表盘上产生