Spring学习记录1——IoC容器
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容器的更多相关文章
- Spring学习一: Ioc容器
Spring 容器: Spring 容器是Spring框架的核心.Spring容器将创建Bean对象实例,把它们联系在一起,配置它们,并管理它们整个生命周期从创建到销毁.Spring 容器通 ...
- 我的Spring学习记录(二)
本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...
- 我的Spring学习记录(四)
虽然Spring管理这我们的Bean很方便,但是,我们需要使用xml配置大量的Bean信息,告诉Spring我们要干嘛,这还是挺烦的,毕竟当我们的Bean随之增多的话,xml的各种配置会让人很头疼. ...
- 我的Spring学习记录(五)
在我的Spring学习记录(四)中使用了注解的方式对前面三篇做了总结.而这次,使用了用户登录及注册来对于本人前面四篇做一个应用案例,希望通过这个来对于我们的Spring的使用有一定的了解. 1. 程序 ...
- spring学习(01)之IOC
spring学习(01)之IOC IOC:控制反转——Spring通过一种称作控制反转(IOC)的技术促进了低耦合.当应用了IOC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创 ...
- Spring核心原理之IoC容器初体验(2)
本文节选自<Spring 5核心原理> 1 IoC与DI基本概念 IoC(Inversion of Control,控制反转)就是把原来代码里需要实现的对象创建.依赖,反转给容器来帮忙实现 ...
- Spring系列14:IoC容器的扩展点
Spring系列14:IoC容器的扩展点 回顾 知识需要成体系地学习,本系列文章前后有关联,建议按照顺序阅读.上一篇我们详细介绍了Spring Bean的生命周期和丰富的扩展点,没有阅读的强烈建议先阅 ...
- spring 学习 AOP和IOC
自11开始接触三大框架,至今已俞5载, 当时风光无限的ssh,现在还在被广泛使用,并有扩大之势的只有spring了 spring主要特性,是广为使用的AOP(面向切面)和IOC(控制反转) 1.其中, ...
- Spring 学习记录3 ConversionService
ConversionService与Environment的关系 通过之前的学习(Spring 学习记录2 Environment),我已经Environment主要是负责解析properties和p ...
随机推荐
- webpack学习(一)项目中安装webpack
如何在项目中安装webpack,webpack-cli? 前提:电脑安装了 node和npm包管理工具 1 创建项目文件夹或者在已有的项目中打开终端 输入相关命令: npm init 因为已经安装好 ...
- Scrap简介
原文:https://blog.csdn.net/ssw_1990/article/details/51254227 提到Python与网络爬虫,可能会想到urllib,urllib2,Beautif ...
- spring security自定义指南
序 本文主要研究一下几种自定义spring security的方式 主要方式 自定义UserDetailsService 自定义passwordEncoder 自定义filter 自定义Authent ...
- win10 uwp 使用 Azure DevOps 自动构建
通过 Azure DevOps 可以做到自动构建程序,覆盖计划.创建.编程.测试.部署.发布.托管.共享等各个环节,适用于大多数的语言.平台. 本文继续使用图床为例告诉大家如何使用 Azure Dev ...
- 2019-9-2-win10-uwp-列表模板选择器
title author date CreateTime categories win10 uwp 列表模板选择器 lindexi 2019-09-02 12:57:38 +0800 2018-2-1 ...
- Java 5,6,7,8,9,10,11新特性吐血总结
作者:拔剑少年 简书地址:https://www.jianshu.com/u/dad4d9675892 博客地址:https://it18monkey.github.io 转载请注明出处 java5 ...
- 第3本:Visual Studio程序员箴言
第3本:Visual Studio程序员箴言 Visual Studio 2010是我经常使用的程序开发工具,也知道VS中有大量的快捷键可以帮助提高效率,可惜就是不愿意记忆,最近在学vim的时候快速把 ...
- 解决 npm run dev b报错 “'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件。”
摘自:https://www.cnblogs.com/laraLee/p/9174383.html 前提: 电脑已经安装了nodeJS和npm, 项目是直接下载的zip包. 在项目目录下运行“npm ...
- 彻底弄懂slice和splice的区别
总觉得数组和字符串中的一些方法的使用很难记,可能是日常都是在学理论,缺少实际应用.不多说了,继续学习吧! 一句话先提前概括: slice(start,end) 从哪到哪开始删 splice(strt, ...
- codeforces 86D,Powerful array 莫队
传送门:https://codeforces.com/contest/86/problem/D 题意: 给你n个数,m次询问,每次询问问你在区间l,r内每个数字出现的次数的平方于当前这个数的乘积的和 ...