IoC容器

1.1  IoC概述

  Ioc(Inverse of Control,控制反转)是Spring容器的内核。对于软件来说,即某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定,即由Spring容器借由Bean配置来进行控制。也被称作DI(Dependency Injection,依赖注入),即让调用类对某一接口的实现类的依赖关系由第三方(容器或协调类)注入,可以移除类之间的依赖关系。

1.2 IoC的类型

  从注入方法上看,IoC主要划分为3种类型:构造函数注入、属性注入和接口注入。Spring支持构造函数注入和属性注入。

  1、构造函数注入:

    通过调用类的构造函数,将接口实现类通过构造函数变量传入。

  2、属性注入:

    可以有选择的通过Setter方法完成调用类所需依赖的注入。

------

  Spring就是一个第三方容器,它帮助完成类的初始化和装配工作,通过配置文件或注解描述类和类之间的关系,自动完成类的初始化和依赖注入工作,是使用Java中的反射实现的。

1.3 BeanFactory和ApplicationContext

  Spring通过配置文件描述Bean及Bean之间的依赖关系,利用Java的反射机制实例化Bean并建立Bean之间的依赖关系。Spring的IoC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。

  Bean工厂(BeanFactory)是Spring框架最核心的接口,它提供了高级IoC的配置机制,BeanFacotry是一个类工厂,和传统类工厂不同,传统类工厂只负责构造一个或者几个类的实例;而BeanFacotry是类的通用工厂,它可以创建并管理各种类的对象。Spring称这些被创建和管理的Java对象为Bean。

  应用上下文(ApplicationContext)建立在BeanFactory基础值上,提供了更多面向应用的功能。

  一般称BeanFactory为IoC容器,称ApplicationContext为应用上下文。

  对于两者,可以简单进行划分:BeanFactory是Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者。

1.4 Bean的生命周期

  

1.5 Spring容器高层视图

  Spring启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据注册表实例化Bean,装配好Bean之间的依赖关系。

  Bean的配置信息由:Bean的实现类、Bean的属性信息(如数据源的连接数、用户名、密码等)、Bean的依赖关系(根据依赖关系完成Bean之间的装配)、Bean的行为配置(生命周期等)。

  

1.6 Bean作用域

  在配置文件中定义Bean时,还可以定义Bean的作用域,作用域将对Bean的生命周期和创建方式产生影响。使用scope属性设置

    单例模式:singleton作用域

      一般情况,无状态或者状态不可变的类适合使用单例模式。在传统开发中,由于DAO类持有Connection这个非线程安全的变量,因此往往未采用单例模式。而在Spring环境下,对于所有的DAO类都可使用单例模式,因为Spring利用AOP和LocalThread功能,对非线程安全的变量进行了处理,使这些非线程安全的类变成了线程安全的类。在实际应用中,大部分Bean都能以单实例的方式运行。这也是Spring将Bean的默认作用域定为singleton的原因。

      默认情况下,Spring的ApplicationContext容器在启动时自动实例化所有singleton的Bean并缓存与容器中。好处有两个:1、对Bean提前实例化会及早发现一些潜在的配置问题;2、Bean以缓存的方式保存,当运行时用到时就无须再实例化,提高运行效率。如果不希望在启动时实例化Bean 在Bean配置中添加lazy-init="true"属性控制即可。(如果该Bean被其他需要提前实例化的Bean引用,那么Spring会忽略这个设置)。

    prototype作用域

      该类Bean当每次调用getBean("id")时返回的也是一个新实例,相当于new一个新对象。   

      默认情况下,Spring容器在启动时不实例化该类型的Bean,此外,Spring容器在讲prototype的Bean交给调用者后,就不再管理它的生命周期。

    与Web应用环境有关的Bean作用域

      需要进行额外的配置

   

    Bean的配置方式:

  

  适用场景:

Spring学习记录1——IoC容器的更多相关文章

  1. Spring学习一: Ioc容器

    Spring 容器:      Spring 容器是Spring框架的核心.Spring容器将创建Bean对象实例,把它们联系在一起,配置它们,并管理它们整个生命周期从创建到销毁.Spring 容器通 ...

  2. 我的Spring学习记录(二)

    本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...

  3. 我的Spring学习记录(四)

    虽然Spring管理这我们的Bean很方便,但是,我们需要使用xml配置大量的Bean信息,告诉Spring我们要干嘛,这还是挺烦的,毕竟当我们的Bean随之增多的话,xml的各种配置会让人很头疼. ...

  4. 我的Spring学习记录(五)

    在我的Spring学习记录(四)中使用了注解的方式对前面三篇做了总结.而这次,使用了用户登录及注册来对于本人前面四篇做一个应用案例,希望通过这个来对于我们的Spring的使用有一定的了解. 1. 程序 ...

  5. spring学习(01)之IOC

    spring学习(01)之IOC IOC:控制反转——Spring通过一种称作控制反转(IOC)的技术促进了低耦合.当应用了IOC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创 ...

  6. Spring核心原理之IoC容器初体验(2)

    本文节选自<Spring 5核心原理> 1 IoC与DI基本概念 IoC(Inversion of Control,控制反转)就是把原来代码里需要实现的对象创建.依赖,反转给容器来帮忙实现 ...

  7. Spring系列14:IoC容器的扩展点

    Spring系列14:IoC容器的扩展点 回顾 知识需要成体系地学习,本系列文章前后有关联,建议按照顺序阅读.上一篇我们详细介绍了Spring Bean的生命周期和丰富的扩展点,没有阅读的强烈建议先阅 ...

  8. spring 学习 AOP和IOC

    自11开始接触三大框架,至今已俞5载, 当时风光无限的ssh,现在还在被广泛使用,并有扩大之势的只有spring了 spring主要特性,是广为使用的AOP(面向切面)和IOC(控制反转) 1.其中, ...

  9. Spring 学习记录3 ConversionService

    ConversionService与Environment的关系 通过之前的学习(Spring 学习记录2 Environment),我已经Environment主要是负责解析properties和p ...

随机推荐

  1. Roslyn 使用 Target 替换占位符方式生成 nuget 打包

    本文告诉大家如何编写在编译过程修改打包文件 在项目文件的相同文件夹可以放一个 nuspec 用来告诉 VisualStudio 如何打包 现在尝试创建一个项目 NearjerbetearDeeyito ...

  2. H3C 链路聚合分类

  3. js实现bind

    Function.prototype.bind=function(ctx,...lastArgs){ let self=this return (...laterArgs)=>self.appl ...

  4. ZR9.8普转提

    ZR9.8普转提 A,B 打过的CF原题,不管了 C 确认过眼神,是我不会写的DP, 发现这个题目要求的过程类似与一个所有括号都不一样的括号匹配的过程 但是限制条件非常多,有点无从下手的感觉 我们设\ ...

  5. Cannot destructure property `createHash` of 'undefined' or 'null'(next服务端渲染引入next-less错误).

    next中引入@zeit/next-less因next版本过低(webpack4之前的版本)无法执行next-less内置的mini-css-extract-plugin mini-css-extra ...

  6. (转)hibernate缓存机制详细分析

    在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相 ...

  7. Docker Desktop: Error response from daemon: driver failed programming external connectivity on endpoint xxx 问题

    右击任务栏 Docker 图标 `Restart` 或 `Quit Docker Deskto` 后之前正常的 zookeeper 容器不会自动启动 通过命令 docker start zk1 启动报 ...

  8. 空气质量管理系统ssm(mybatis+spring+springMVC)框架+前后端分离

    1.目录结构: 2.需要注意的地方 2.1在WEB-INFO下新建 2.1.1 springMVC-servlet.xml <?xml version="1.0" encod ...

  9. 通过公网连接阿里云redis,rinetd

    目前云数据库 Redis 需要通过 ECS 的内网进行连接访问.如果您本地需要通过公网访问云数据库 Redis,可以在 ECS Linux 云服务器中安装 rinetd 进行转发实现. 1.在云服务器 ...

  10. $Luogu2512/CH122/AcWing122$糖果传递 模拟

    $Luogu$  $AcWing$ $Description$ 有$n$个小朋友坐成一圈,每人有$a_i$个糖果. 每人只能给左右两人传递糖果. 每人每次传递一个糖果代价为$1$. 求使所有人获得均等 ...