`

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(控制反转)简介

    NULL 博文链接:https://ysj5125094.iteye.com/blog/1606928

    javaSpring学习笔记

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

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

    源代码 博文链接:https://danielkwo.iteye.com/blog/40945

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

    在自学Spring Framework 开发参考手册2.5时做的学习笔记,其中在遇到手册上不能理解的地方的时候,在网上找了一些比较好的文档也放在了里面。

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

    控制反转(Inversion of Control,英文缩写为IoC),也叫依赖注入(Dependency Injection)。我个人认为控制反转的意思是依赖对象(控制权)发生转变,由最初的类本身来管理依赖对象转变为IoC框架来管理这些对象,使得...

    Spring学习笔记.zip

    Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control: 反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring ...

    spring_ioc.docx

    web开发技术spring框架控制反转思想IOC学习笔记,并对java的静态代理和动态代理进行了相关叙述

    spring课堂笔记.docx

    核心概念:深入探讨了 Spring 的核心概念,如控制反转(IoC)和面向切面编程(AOP),以及它们如何改善应用程序的设计和结构。 Spring 容器:介绍了 Spring 容器的不同类型,包括 BeanFactory 和 ...

    spring项目开发学习笔记

    依赖注入DI/IoC控制反转:提供松耦合的一种实现技术 AOP面向切面编程:(可以在不修改源代码的前提下,增强权限,日志,事务功能)切面编程将业务逻辑从应用服务中分离 容器(spring):管理dao,service,action,...包含并...

    Spring.NET学习笔记

    Spring.NET学习笔记:资源有源代码程序及文档说明,基础篇、应用篇、扩展集成、企业架构体系实战等;基础篇包括:控制反转,环境搭建,实现简易IOC框架,对象的创建,容器中对象作用域,依赖注入,依赖对象的注入,...

    Spring - 学习笔记

    Spring是一个开源的控制反转(Inversion of Control , Ioc)和面向切面(AOP)的容器框架.它的主要目的是简化企业开发.

    超详细的Spring框架讲解,就这一篇!足矣

    Spring框架概述1、什么是Spring2、Spring框架的优点3、Spring框架体系结构Spring框架——控制反转(IOC)1、IOC介绍2、基于配置的IOC2.1、导入jar包2.2、配置文件2.3、测试3、基于注解的IOC3.0、导包3.1、开启注解...

    Java/JavaEE 学习笔记

    Spring学习笔记...............345 第一章 Spring概述..........................345 第二章 Spring IOC(控制反转)........347 第三章 Spring AOP(面向切面编程)..........351 第四章 Spring中的数据访问.............

    JavaLearnProject:Java 学习笔记测试用例

    Spring IOC 控制反转(类[对象]交由Spring容器管理) restructure 学习代码重构 mybatis-enum MyBtais整合Spring Boot整合,TypeHandler对枚举类(enum)处理 AOP 在这里我们以 吃饭 业务为例,向你演示Spring AOP的...

    J2EE学习笔记(J2ee初学者必备手册)

    Spring学习笔记...............345 第一章 Spring概述..........................345 第二章 Spring IOC(控制反转)........347 第三章 Spring AOP(面向切面编程)..........351 第四章 Spring中的数据访问.............

    java查看sun包源码-learning-spring:Spring框架讲解

    学习笔记 IOC 和 DI 的概述 IOC(Inversion of Controll) 思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源。作为回应,容器适时的返回资源。而应用了IOC之后,则是容器主动的将资源推送...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

Global site tag (gtag.js) - Google Analytics