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

  

 

  适用场景:

 

 

 

 

posted @ 2020-01-11 21:37  ELAIRS  阅读(192)  评论(0编辑  收藏  举报