首页 > 技术文章 > Spring IOC、DI及Bean

ruhuanxingyun 2019-04-18 13:13 原文

一、基础知识

  1. 概念

    A. IoC(控制反转)思想:是指在程序开发中,实例的创建不再由调用者管理,而是由Spring容器创建,Spring容器会负责控制程序之间的关系,而不是由代码直接控制,因此,控制权由程序代码转移到了Spring容器中,控制权发生了反转;

    B. DI(依赖注入):是指程序员不必创建对象,但必须描述如何创建它们,不需要直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务,由Ioc容器将它们装配在一起;

      依赖:bean对象的创建依赖于容器;注入:bean对象中所有的属性由容器来注入,注入范围含:普通值、引用、数组、List、Map、Set、null、Properties。

  2. 依赖注入方式

    A. 构造器注入:Spring4.X版本以后推荐使用;

    B. setter注入;

    C. p(property)和c(constructor)命名空间注入。

  3. IoC特点

    A. 它将最小化应用程序中的代码量;

    B. 它将使您的应用程序易于测试,因为它不需要单元测试用例中的任何单例或JNDI查找机制;

    C. 它以最小的影响和最少的侵入机制促进松耦合;

    D. 它支持即时的实例化和延迟加载服务。

    注意:IoC是一种设计思想,DI是实现IoC的一种方法

 

二、Spring容器

  1. BeanFactory

    A. 是基础类型的IoC容器,就是一个管理Bean的工厂,它主要负责初始化各种Bean,并调用他们的生命周期的方法;

    B. 常用接口实现类:BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("D://applicationContext.xml"));

    C. 特点:采用懒加载机制,使用语法显示提供资源对象。

  2. ApplicationContext

    A. 是BeanFactory的子接口即应用上下文,它还支持国际化,资源访问和事件传播等;

    B. 常用实现类

      ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);

      ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);

    C. 特点:采用即时加载机制,自己创建和管理资源对象。

 

三、Bean基础

  1. Bean的定义

    A. 它们是构成用户应用程序主干的对象;

    B. 它们由 Spring IoC 容器实例化,配置,装配和管理;

    C. Bean是基于用户提供给容器的配置元数据创建;

  2. Bean的实例化

    A. 构造器;

    B. 静态工厂;

    C. 实例工厂。

  3. Bean的作用域(Scope)

    A. singleton(单例模式):这是Bean默认的作用域,Spring容器只创建一个Bean的实例,Spring在创建第一次后会缓存起来,之后不再创建,适合无会话状态的Bean,比如Service和Dao层;

    B. prototype(原型模式);每次请求该Bean时,都会创建一个新的Bean实例,需要保持会话状态的Bean,如Struts2中Action类;

    C. request:每个request作用域内的请求只创建一个Bean实例;

    D. session:每个session作用域内的请求只创建一个Bean实例;

    E. global Session:这个只在porlet的web应用程序中才有意义,它映射到porlet的global范围的session;如果是普通的就类似session作用;

  4. Bean的生命周期

    A. 根据配置情况调用Bean构建方法或工厂方法实例化Bean;

    B. 利用依赖注入完成Bean中所有属性值的配置注入;

    C. 如果Bean实现了BeanNameAware接口,则调用Bean的setBeanName()方法传入当前Bean的id值;

    D. 如果Bean实现了BeanFactoryAware接口,则调用setBeanFactory()方法传入当前工厂实例的引用;

    E. 如果Bean实现了ApplicationContextAware接口,则调用setApplicationContext()方法传入当前ApplicationContext实例的引用;

    F. 如果BeanPostProcessor和Bean关联,则调用该接口的预初始化方法postProcessBeforeInitialzation()对Bean进行加工操作;

    G. 如果Bean实现了InitializingBean接口,则调用afterPropertiesSet()方法;

    H. 如果在配置文件中通过init-method属性指定了初始化方法,则调用该初始化方法;

    I. 如果BeanPostProcessor和Bean关联,则调用该接口的初始化方法postProcessAfterInitialization();

    J. 如果在<bean>中指定了该Bean的作用范围为scope="singleton",则将该Bean放入Spring IoC的缓存池中,将触发Spring对该Bean的生命周期管理;如果在<bean>中指定了该Bean的作用范围为scope="prototype",则将该Bean交给调用者,调用者管理该Bean的生命周期,Spring不再管理该 Bean;

    K. 如果Bean实现了DisposableBean接口,则调用destory()方法将Spring中的Bean销毁;如果在配置文件中通过destory-method属性指定了Bean的销毁方法,则调用该方法对 Bean 进行销毁。

 

四、Bean的装配

  1. 方式

    A. 在XML中显示的配置,又分为设置(setter)注入和构造注入;

    B. 在Java中显示的配置

    C. 隐式的自动装配。

  2. 使用场景

    A. @Bean或XML配置:适合导入第三方包里面的组件;

    B. 基于Annotation的Bean装配:适合自己写的类;

    C. @Import(自定义类)注解:适合快速给容器中导入一个组件;

  3. 自动装配方式

    A. no:默认设置,表示没有自动装配,应使用显示的Bean引用进行装配;

    B. byName:按Bean的名称进行装配;

    C. byType:按Bean的类型进行装配;

    D. constructor:根据构造方法的参数的数据类型,进行byType模式的自动装配;

    E. autodetect:如果发现默认的构造方法,则用constructor模式,否则用byType模式。

    注解实现自动装配

 

五、Bean的初始化及销毁时自定义方法

  1. 初始化方式

    A. 使用注解@PostConstruct;

    B. 实现InitializingBean接口,并重写其afterPropertiesSet();

    C. 在注解@bean上指定初始化的方法;

    D. 加载顺序为:构造器>A>B>C;

  2. 销毁方式

    A. 使用注解@PreDestroy;

    B. 实现DisposableBean接口,并重写其destroy();

    C. 在注解@bean上指定销毁的方法;

    D. 加载顺序为:构造器>A>B>C;

 

推荐阅读