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的配置方式:

  

  适用场景:

最新文章

  1. 冒烟测试 smoking test
  2. 几个js函数
  3. JAVA 8 Lambda表达式-Lambda Expressions
  4. 使用sql server profilter跟踪sql
  5. Angular指令1
  6. C++ 学习的网站
  7. java中的IO整理
  8. javascript 作用域例子
  9. ipython与python的区别
  10. discuz! X3.2 自定义后台门户模块模板里的标签
  11. BAE初试
  12. named let 递归和闭包的利器
  13. PS 色调——颜色运算
  14. 修改VScode行号区的背景颜色
  15. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第三集之磁盘分区】
  16. iOS基础知识之属性及属性关键字
  17. 2018.08.10 atcoder No Need(线性dp)
  18. YouCompleteMe自动补全的安装配置与使用
  19. SSH&SFTP服务分离+家目录锁定
  20. redis使用及配置之缓存详解

热门文章

  1. UPC 2019年第二阶段我要变强个人训练赛第十六场
  2. CF1214
  3. 2018 CCPC 吉林站 H Lovers
  4. ArcGIS-PictureMarkerSymbol-向地图添加图片标记
  5. web应用中web.xml文件的解释
  6. deep Q learning小笔记
  7. ELK学习实验011:Logstash工作原理
  8. 中小型企业级 IPS 部署
  9. 洛谷$P1935$ [国家集训队]圈地计划 网络流
  10. JVM系列(三):java的垃圾回收机制