`

Spring学习笔记(二)——Spring Ioc反转控制

阅读更多
Gof曾提出,针对接口编程,而不是实现。
通常情况下,开发者将业务对象抽象为Java接口,然后将各个业务共性的内容实现为抽象类,并继承于Java接口。继而,再依据具体的业务操作类型,实现业务对象,并继承于抽象类。其明显含义是:子类只能添加或者重载操作,而不能隐藏父类的操作。最终,实现了抽象类的具体业务实现类能够响应抽象类继承的接口发送的请求操作。
1.背景
Ioc设计模式,重点关注组件的依赖性、配置以及生命周期。Ioc也适用于简单类,而不只是组件。昵称Dependency Injection(依赖注入)。
Ioc将创建对象实例的任务交给Ioc容器或者框架(注,实现了Ioc设计模式的框架,有时候也称之为Ioc容器),使得应用程序代码只需要直接使用实例,这就是Ioc。
使用Ioc,能提供如下几方面的优势:
1)应用组件不需要在运行时寻找其协作者,更易于开发和编写应用。在许多Ioc容器中,借助于设置方式能够在运行时将组件依赖的其他组件注入进来。
2)由于借助Ioc容器管理组件的依赖关系,更有利于单元测试和集成测试。
3)通常,在借助于Ioc容器管理业务对象的前提下,很少需要使用具体Ioc容器提供的API。这使得集成现有的遗留系统成为可能。
因此,通过使用Ioc能够降低组件之间的耦合度。最终,能够提高类的重用性,更利于测试,而且整个产品或系统更利于集成和配置。

2.Spring Ioc
Spring Ioc容器实现了Ioc设计模式。为实现对Spring Ioc容器的访问,代码可通过如下两个接口实现:
1)BeanFactory:位于org.springframework.beans.factory包中。开发者借助于配置文件(比如,XML或属性文件),能够实现对JavaBean的配置与管理。主要用开发java应用,比如Applet应用。
2)ApplicationContext:位于org.springframework.context包中。ApplicationContext构建在BeanFactory的基础上,即继承于它。除了具有BeanFactory的功能外,还添加了大量功能,比如Spring Ioc集成、(为实现国际化而)处理消息资源、(为应用对象发布和注册通知事件而)添加了事件、声明(非)容器提供的服务等。主要用于J2EE开发,是Spring推荐的接口。

3.BeanFactory
(在spring-beans.jar包中,org.springframework.beans.factory.BeanFactory)
Spring BeanFactory是非常轻量的,它处于Spring框架的核心。可用于Applet应用和单独的Swing/SWT应用中。对于EJB应用而言也同样适用。在整个Spring框架中都存在BeanFactory的概念,即统一使用BeanFactory访问Spring Ioc容器。开发者通过使用BeanFactory能够定义和提供良好的业务对象层,从技术架构角度考虑,这是很合理的。
当应用创建BeanFactory实例时,实际上是完成了JavaBean的实例化、配置以及管理,即BeanFactory在访问和操作Ioc容器的初期充当了Ioc容器的作用。其中,BeanFactory具体使用的Spring配置文件定义了各个JavaBean之间的关系。
Spring提供了org.springframework.beans.factory.BeanFactory接口的若干实现。对于应用需要实例化BeanFactory实例的场合,XmlBeanFactory使用尤为广泛。
Spring配置文件(appcontext.xml)必须遵循spring-beans.dtd定义的内容模型。其中,spring-beans.dtd为javabean命名空间提供了一种简单、一致的定义方式,供BeanFactory配置使用。大部分Spring框架提供的功能都需要使用到它,包括基于BeanFactory的web应用上下文。
为了配置Spring application.xml文件,开发者需要告诉XmlBeanFactory构建器,即appcontext.xml文件。下述应用使用了Spring框架中org.springframework.core.io提供的实用类ClassPathResource:
Resource resource = new ClassPathResource("appcontext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
HelloWorld hw = (HelloWorld) factory.getBean("fileHelloWorld");
还存在两种方式:
其一,基于文件找到appcontext.xml,如下:
InputStream ins = new FileInputStream("src/appcontext.xml");
BeanFactory factory = new XmlBeanFactory(ins);
HelloWorld hw = (HelloWorld) factory.getBean("fileHelloWorld");
其二,基于ApplicationContext实现类找到appcontext.xml文件。如下:
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[]{"appcontext.xml"});
BeanFactory factory = (BeanFactory)appContext;
HelloWorld hw = (HelloWorld) factory.getBean("fileHelloWorld");

多数情况下,并不需要显示的实例化BeanFactory实例,因为Spring框架完成了这部分工作。当J2EE Web应用部署并启动时,Spring ApplicationContext将会自动被实例化。
为了获得appcontext.xml中定义的JavaBean,应用代码只需要调用BeanFactory的getBean方法,并转换为JavaBean所属类型。

3.1)Bean的生命周期
借助Ioc容器,即BeanFactory能实现对javabean的控制反转。Ioc容器定义了Spring配置文件中Javabean应遵循的规则。Ioc控制下的javabean的生命周期存在4个阶段:
a)实例化Javabean;
b)javabean实例的初始化,即通过Ioc注入其依赖性;
c)基于Spring应用对javabean实例的使用;
d)Ioc容器销毁javabean实例。

3.2)Bean创建。
借助于构建器创建javabean最常见,推荐尽量使用无参数构建器创建javabean实例。
Spring配置文件中<ref>提供如下几个方面的属性:
a)bean:在当前Spring XML配置文件中,或者在同一BeanFactory(AapplicationContext)中的其他javaBean中。
b)local:其依赖的JavaBean必须存在于当前Spring XML配置文件中。借助于Spring IDE,在编译期会对依赖的javabean进行验证。
c)用于指定其依赖的父javabean定义。

3.3)初始化JavaBean
3.4)使用javabean
借助于getBean方法,在应用中能够应用到它。
3.5)销毁javaBean

4.ApplicationContext
BeanFactory提供了管理和操作JavaBean的基本功能,而且是通过应用嗲吗显式的实例化BeanFactory来完成的。为加强功能,Spring框架引入了ApplicationContext接口,不需手动创建ApplicationContext实例,以声明方式便可使用它。
    org.springframework.web.context.ContextLoaderListener
或者
    org.springframework.web.context.ContextLoaderServlet 
能够在web应用启动的时候自动实例化ApplicationContext对象。
注意:对于Spring BeanFactory而言,如果用户没有调用getBean方法,则使用到的JavaBean实例不会被创建。因此,在BeanFactory中使用了延迟装载机制,这和BeanFactory的应用场合(内存和其他资源受限)有关系。对于Spring ApplicationContext而言,一旦ContextLoaderListener或ContextLoaderServlet初始化成功,所有的javabean实例将被创建(除非改变AapplicationContext的默认行为,比如显式设置延迟装在行为)
4.1)web应用中创建applicationContext
通过ContextLoaderListener或ContextLoaderServlet能够自动创建ApplicationContext实例。也可以手动创建。
对于实现了servlet2.4规范的web容器,可同时使用ContextLoaderListener和ContextLoaderServlet。web应用启动时,将自动初始化监听器,如ContextLoaderListener
       
<!-- Listener contextConfigLocation -->
        <listener>
                <listener-class>
                        org.springframework.web.context.ContextLoaderListener
                </listener-class>
        </listener>

对于实现规范servlet2.2的web容器,只能使用ContextLoaderServlet
4.2)ApplicationContextAware
在Spring应用中,有时需要将Spring应用中的ApplicationContext实例注入到JavaBean实例中。例如:为了在某Javabean实例中动态获得ApplicationContext创建的某单例JavaBean,但是该单例JavaBean并没有显式的使用(在Spring配置文件中没有显式地给出对单例JavaBean的引用)到它。这种情况下,借助ApplicationContextAware能实现开发要求。如:
org.springframework.context.ApplicationContextAware
其中定义了如下方法:
void setApplicationContext(ApplicationContext applicationContext)
                           throws BeansException
比如在Spring配置中定义了两个JavaBean:bean1和bean2,如果bean2需要使用到bean1,但是bean2的Spring配置中,没有显式的配置对bean1的引用(没有<ref>)。此时,借助ApplicationContextAware,让bean2实现ApplicationContextAware接口,定义私有的applicationContext变量,并提供相应的setter方法。通过调用applicationContext的getBean方法就可以获取需要的bean1。
这同BeanFactoryAware 类似。
4.3)ApplicationContext接口实现
基于ApplicationContext接口,Spring框架提供了若干实现。
a)ClassPathXmlApplicationContext:在web应用中,开发者可以从classpath中,即WEB-INF/classes或WEB-INF/lib的jar中装载Spring配置文件。单元测试中常用到。
b)FileSystemXmlApplicationContext:开发者可以从文件系统中装载Spring配置文件。单元测试常用。
c)XmlWebApplicationContext:供ContextLoaderListener或ContextLoaderServlet内部装载Spring配置文件使用。
分享到:
评论

相关推荐

    学习Spring笔记_IoC(控制反转)简介

    **Spring框架中的IoC(控制反转)概念** 在软件开发中,IoC(Inversion of Control,控制反转)是一种设计模式,它将对象的创建和管理责任从代码中剥离出来,交由一个容器来处理。Spring框架是Java平台上的一个核心...

    我的Pro Spring 学习笔记 之二 控制反转(IoC)和依赖注入(DI), Spring初步

    在本文中,我们将深入探讨Spring框架的核心概念——控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)。这些概念是Spring框架的基础,对于理解和掌握Spring的使用至关重要。 首先,让...

    Spring学习笔记(精华全记录)

    ### Spring学习笔记(精华全记录) #### Spring框架概述 Spring框架源自Rod Johnson的个人项目,最初于2002年末发布。Spring并非一开始就作为一个完整的框架出现,而是从一个项目逐步发展而来。随着项目的成熟,...

    Spring学习笔记&源码

    本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...

    javaSpring学习笔记

    在“Java Spring学习笔记”中,你将找到对Spring框架的全面介绍,包括IoC(控制反转)和DI(依赖注入)原理、AOP(面向切面编程)、Spring MVC、Spring Boot等核心内容。每个主题都结合了理论知识和实际示例,帮助你...

    Spring.NET学习笔记-控制反转

    ### Spring.NET 学习笔记 — 控制反转 #### 一、控制反转(IoC)概念解析 控制反转(Inversion of Control,简称IoC)是一种软件设计思想,它改变了传统对象之间的依赖关系管理方式,从而降低了组件之间的耦合度。在...

    Spring自学笔记-Ioc(控制反转)容器

    ### Spring自学笔记-Ioc(控制反转)容器 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,用于构建企业级应用。它提供了一种轻量级的方式来管理应用程序的各种组件和服务,使得开发者能够更容易地构建...

    Spring 学习笔记五

    《Spring 学习笔记五——深入理解Spring框架》 在软件开发领域,Spring框架是Java企业级应用开发的基石,其强大的功能和易用性使其成为开发者们的首选。本篇学习笔记将深入探讨Spring框架的核心概念和技术,帮助你...

    【狂神说】spring PDF学习总结笔记 Spring5.pdf

    【狂神说】Spring PDF学习总结笔记主要涵盖了Spring框架的核心概念、优点、组成部分以及相关扩展。Spring是一个由Rod Johnson创建的开源框架,旨在简化企业级应用开发的复杂性,它结合了众多现有技术,如SSH(Struct...

    Spring框架学习笔记

    Spring的核心是IOC(Inversion of Control)容器,通过控制反转实现对象之间的解耦,使得代码更加灵活和可测试。 二、依赖注入(DI) 依赖注入是Spring的核心功能之一,它允许开发者在运行时动态地将依赖关系注入到...

    Spring学习笔记.doc

    ### Spring学习笔记知识点详解 #### 一、Spring框架概述 **1.1 什么是Spring** Spring框架是一个开源的轻量级应用框架,主要用于简化企业级应用程序的开发过程。它的核心特性在于提供了一种灵活的方式来组织和...

    spring学习笔记

    ### Spring学习笔记知识点详解 #### 一、Spring框架概述 **Spring** 是一个开源的、分层的企业级应用开发框架,旨在简化Java EE应用程序的开发。它的主要目标是提高开发效率,减少耦合度,并提供一种更为简洁的...

    马士兵老师spring框架学习笔记

    2. **IoC(控制反转)**:Spring的核心特性之一是依赖注入(Dependency Injection,简称DI),它是控制反转的一种实现方式。DI允许我们不直接在类内部创建对象,而是通过配置文件或注解来管理对象及其依赖关系,降低...

    Spring 学习笔记 spring帮助文档

    在本篇Spring学习笔记中,我们将深入探讨Spring的基本概念,包括bean的配置、依赖注入、IOC容器以及Bean的实例化方式。 首先,Spring中的核心概念是bean。Bean是Spring框架中的基本构建块,它们是被管理的对象,...

    spring指南学习笔记

    标题和描述均提到了“spring指南学习笔记”,这意味着文档聚焦于Spring框架的学习心得与关键概念。Spring是一个开源的Java企业级应用框架,以其强大的依赖注入(Dependency Injection, DI)和面向切面编程(Aspect ...

    spring框架学习笔记

    Spring框架是Java应用开发中广泛使用的轻量级框架,它以IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)为核心,提供了丰富的功能,包括但不限于组件管理、AOP(Aspect Oriented ...

Global site tag (gtag.js) - Google Analytics