一、前言

本文承接上一节:Spring_总结_01_Spring概述

在上一节中,我们了解了Spring的最根本使命、四大原则、六大模块以及Spring的生态。

这一节我们开始了解Spring的第二大原则中的依赖注入,这属于六大模块中的核心容器部分。

二、基本概念

1.什么是依赖注入

(1)我们经常说的控制反转(Inversion of Control —IOC)和依赖注入(Dependency Injection—DI),在Spring 环境下是等同的概念。

(2)控制反转是通过依赖注入实现的。

(3)所谓依赖注入指的是容器负责创建对象和维护对象间的依赖关系。而不是通过对象本身负责自己的创建和解决自己的依赖。

2.依赖注入的本质

创建应用对象之间协作关系(依赖)的行为通常称为装配。这也是依赖注入的本质。

3.依赖注入主要目的

依赖注入的主要目的是解耦。

因为通过装配,对象间的依赖关系不再由对象维护,而是交给容器维护,降低了耦合度。

耦合具有两面性:

(1)紧密耦合的代码难以测试,难以复用,难以理解,并典型地表现出“打地鼠”式的bug特性。

(2)一定程度的耦合又是必须的——完全没有耦合的代码什么也做不了。为了完成有实际意义的功能,不同的类必须以适当的方式进行交互。

总之,耦合是必须的,但应该被小心谨慎地管理(尽量降低耦合度)。

三、Spring容器

1.什么是Spring容器

容器是Spring的核心,是用来容纳所有bean的地方。

Spring 容器负责创建对象,装配对象,配置他们并管理他们的整个生命周期。

2.两种Spring容器

Spring自带了多个容器实现,可以归为两种不同类型:

(1)bean工厂

(由BeanFactory接口定义)

是最简单的容器,提供基本的DI支持。(低级封装,功能一般)

(2)应用上下文

(由ApplicationContext接口定义)

基于BeanFactory构建,并提供应用框架级别的服务。(高度封装,功能强大,推荐使用)

四、使用Spring应用上下文

Spring自带了多种类型的应用上下文。

1 AnnotationConfigApplicationContext 从一个或多个基于Java的配置类中加载Spirng应用上下文
2 AnnotationConfigWebApplicationContext 从一个或多个基于Java的配置类中加载Spring Web应用上下文。
3 ClassPathXmlApplicationContext 从类路径下的一个或多个XMl配置文件中加载上下文定义,把应用上下文的定义文件作为资源
4 FileSystemXmlapplicationContext 从文件系统下的一个或多个XML配置文件中加载上下文定义
5 XmlWebApplicationContext 从Web应用下的一个或多个XMl配置文件中加载上下文定义

1.从Java配置中加载上下文

        //1.从Java配置中加载配置,将Bean装载到应用上下文。
ApplicationContext context=new AnnotationConfigApplicationContext(com.springaction.knights.config.KnightConfig.class);

2.从类路径加载上下文

        //1.从类路径下读取配置文件,将Bean装载到应用上下文。
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

3.从文件系统加载上下文

        //1.从文件系统读取配置文件,将Bean装载到应用上下文。
ApplicationContext context=new FileSystemXmlApplicationContext("D:/applicationContext.xml");

应用上下文准备就绪之后,我们就可以调用上下文的getBean()方法从Spring容器中获取bean.

五、Bean的生命周期

传统Java应用中,使用Java关键字 new 进行bean的实例化,然后bean就可以使用了。一旦该bean不再使用,则由Java自动进行垃圾回收。

理解了Spring bean 的生命周期,就能利用Spring提供的扩展点来自定义bean的创建过程。

在bean准备就绪之前,bean工厂执行了若干启动步骤:

(1)Spring对bean进行实例化

(2)Spring将值和bean的引用注入到bean对应的属性中

(3)如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法

(4)如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入

(5)如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来

(6)如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法

(7)如果bean实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。

(8)如果bean使用init-method声明了初始化方法,则会执行init-method配置的方法,

(9)如果bean实现了BeanPostProcessor接口,Spring将调用他们的postProcessAfterInitialization()方法

(10)此时,bean已经准备就绪了,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到该上下文被销毁。

(11)容器关闭

(12)如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。

(13)如果bean使用destroy-method声明了销毁方法,该方法也会被调用。

Spring_总结_02_依赖注入的更多相关文章

  1. Spring_依赖注入思想

    Ioc(Inversion of Control) 控制反转,DI(Dependncy Injection)依赖注入,其实是指同一种思想.举例说明: 张三在某公司负责供水问题.有两种形式,第一种老板指 ...

  2. webapi - 使用依赖注入

    本篇将要和大家分享的是webapi中如何使用依赖注入,依赖注入这个东西在接口中常用,实际工作中也用的比较频繁,因此这里分享两种在api中依赖注入的方式Ninject和Unity:由于快过年这段时间打算 ...

  3. ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入

    原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...

  4. 在WPF中使用依赖注入的方式创建视图

    在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...

  5. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  6. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

    再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...

  7. ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法

    在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...

  8. ASP.NET Core中如影随形的”依赖注入”[上]: 从两个不同的ServiceProvider说起

    我们一致在说 ASP.NET Core广泛地使用到了依赖注入,通过前面两个系列的介绍,相信读者朋友已经体会到了这一点.由于前面两章已经涵盖了依赖注入在管道构建过程中以及管道在处理请求过程的应用,但是内 ...

  9. 模拟AngularJS之依赖注入

    一.概述 AngularJS有一经典之处就是依赖注入,对于什么是依赖注入,熟悉spring的同学应该都非常了解了,但,对于前端而言,还是比较新颖的. 依赖注入,简而言之,就是解除硬编码,达到解偶的目的 ...

随机推荐

  1. app开发制作会难吗?app开发好学吗?

    前面我们讲到了app是什么,APP是运行在智能手机的第三方应用程序,可以满足用户的不同需求.那么app开发制作会难吗?这个与产品的复杂度有很大的关系,复杂度包括业务逻辑多不多,业务模块多不多等,对于玩 ...

  2. 深度学习:Keras入门(二)之卷积神经网络(CNN)(转)

    转自http://www.cnblogs.com/lc1217/p/7324935.html 1.卷积与神经元 1.1 什么是卷积? 简单来说,卷积(或内积)就是一种先把对应位置相乘然后再把结果相加的 ...

  3. java中使用axis发布和调用webService及dom4j解析xml字符串

    工作中需要调用webService服务,这里记录一下如何在java中发布和调用webService. 需要的jar包: webService服务端: import javax.jws.WebMetho ...

  4. 动态生成ABAP程序-资料

    参考程序: Tcode ABAPdocu--> BC - ABAP Programming--> The ABAP Programming Language--> Special T ...

  5. LDAP注入

    理解LDAP与LDAP注入 0x01 LDAP简介 查阅了一些网上的资料,读了好久还是觉得理解起来很困难,感觉还是不够干,之后看到的一个博客http://www.chinaunix.net/old_j ...

  6. python有哪些好的学习资料或者博客?

    推荐Full Stack Python 有各种python资源汇总,从基础入门到各种框架web应用开发和部署,再到高级的ORM.Docker都有.以下是Full Stack Python 上总结的一些 ...

  7. iOS KVC 和 KVO 的学习

    KVC  (NSKey Value Coding) :键值编码 KVO (Key Value Observing) :键值监听 前言:我曾经用过 监听 一个音频何时结束 监听视频播放 状态等 用了这种 ...

  8. Windos Server 2008 NFS 服务安装使用

    系统环境:Windos 2008 R2 x64位 安装服务:NFS 文件服务 我的电脑-->右击管理-->功能-->添加功能 选择网络文件系统服务工具 安装服务 添加角色 下一步 选 ...

  9. DNS 域名解析原理

    域名解析过程 1.在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析. 2.如果hosts里没有这个 ...

  10. 一览Swift中的常用关键字

    要学习Swift这门语言,就必须先了解Swift的关键字及对应的解释.这里就列一下在Swift中常用到的关键字. 关键字是类似于标识符的保留字符序列,除非用重音符号(`)将其括起来,否则不能用作标识符 ...