Spring Ioc 概述

什么是 Spring Ioc

Ioc: Inversion of Control, 控制反转, 它还有一个别名 DI (Dependency Injection), 依赖注入。 那么到底该怎么理解 Ioc 和 DI 呢?

  1. Ioc
    所谓 IoC,由第三方来负责控制对象的生命周期和对象间的关系。

  2. DI
    IoC 的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。

Spring 是通过容器来实现 Ioc 的,即 Ioc 容器。通过 Ioc 容器加载外部的资源,完成对象的创建及创建对象所需要的依赖的注入。

Spring Ioc 容器

Spring 容器是 Spring 框架的核心,容器创建对象并且把它们连接在一起,并管理它们的生命周期。说白了就是之前的 Java 应用程序中的对象是程序员 new 出来的,现在不用我们 new 了,交给 Spring 容器去管理了。

  • Spring 框架简要介绍
    Spring Framework 是整个 Spring 家族中最基础的框架。


    images

从图中可以看到,Spring Framework 的核心组件(Core Container)包括:

  1. spring-core
    模块提供了框架的基本组成部分,包括 IoC 和依赖注入功能。
  2. spring-beans
    模块提供 BeanFactory,工厂模式的微妙实现,它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦。
  3. spring-context
    模块建立在由 core和 beans 模块的基础上建立起来的,它以一种类似于 JNDI 注册的方式访问对象。Context 模块继承自 Bean 模块,并且添加了国际化(比如,使用资源束)、事件传播、资源加载和透明地创建上下文(比如,通过 Servelet 容器)等功能。Context 模块也支持 Java EE 的功能,比如 EJB、JMX 和远程调用等。ApplicationContext 接口是 Context 模块的焦点。spring-context-support 提供了对第三方集成到 Spring 上下文的支持,比如缓存(EhCache, Guava, JCache)、邮件(JavaMail)、调度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等。
  4. spring-expression
    模块提供了强大的表达式语言,用于在运行时查询和操作对象图。它是 JSP2.1 规范中定义的统一表达式语言的扩展,支持 set 和 get 属性值、属性赋值、方法调用、访问数组集合及索引的内容、逻辑算术运算、命名变量、通过名字从 Spring IoC 容器检索对象,还支持列表的投影、选择以及聚合等。

Spring Ioc 容器主要通过这些核心组件提供对外的服务, Spring Framework 主要提供了两类容器:

  1. Spring BeanFactory 容器
    最简单的容器,给 DI 提供了基本的支持。其用 org.springframework.beans.factory.BeanFactory 接口来定义,通常情况下应用中不直接使用 BeanFactory。
  2. Spring ApplicationContext 容器
    在 Spring BeanFactory 容器的基础上,添加了更多企业特定的功能,是对 BeanFactory 的扩展。其用 org.springframework.context.ApplicationContext 接口来定义。应用中常被使用到的 Ioc 容器。
  • Spring 中的一些基本概念
    1. Bean
      Spring Ioc 容器管理的对象称之为 Bean。

    2. BeanDefinition
      用来抽象 Bean 的元数据信息,Spring Ioc 容器通过读取配置文件或者读取类的注解信息在 Ioc 容器初始化的过程中,创建 Bean 对应的 BeanDefinition。

Spring Ioc 代码实现
  • 依赖包
    Spring Ioc 的最小化依赖为: spring-context
compile group: 'org.springframework', name: 'spring-context', version: '5.1.17.RELEASE'

spring-context 包需要依赖:spring-core、spring-beans、spring-expression、spring-aop 等包, 因此只需要引入该包便能满足使用 Spring Ioc 的要求。

  • 代码实现
    Spring Ioc 容器创建所需要的配置信息来源主要有两种:xml配置文件和注解。Spring 2.0 开始陆续引入了一些注解来简化 xml 文件的配置(如:2.0版本的 @Repository,2.5版本 @Component、@Service、@Constroller、@Resource、@Autowired、@Qualifier 等), 但ApplicationContext 容器初始化类还都是面向 xml 配置文件的。 Spring 3.0 以后引入了 AnnotationConfigApplicationContext 和 AnnotationConfigWebApplicationContext 允许直接通过注解作为容器配置信息来源。

    1. xml 方式
    public static void main(String[] args) {
        // 读取配置文件,创建 Ioc 容器 ApplicationContext
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ioc/application-ioc.xml");
    }
    
    
    
        
        
    
    
    1. 注解方式
    @ComponentScan("com.note.spring.ioc.annotation")
    @Configuration
    public class BeanConfig {
    
        public BeanConfig() {
            // spring 容器初始化时,会调用配置类的无参构造函数
            System.out.println("start bean registry");
        }
        
        @Bean
        public IocService iocService() {
            return new IocServiceImpl();
        }
    }
    
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);
    }
    

你可能感兴趣的:(Spring Ioc 概述)