Spring 中 IoC 容器简介

IoC 是一种通过描述来生成或者获取对象的技术,可以说 Spring 是一种基于 IoC 容器编程的框架

在一个系统中可以生成各种对象,并且这些对象都需要进行管理。为了描述这些对象关系,我们需要一个容器。在 Spring 中把每一个需要管理的对象称为 Spring Bean ,而管理这些 Bean 的容器就被称为 Spring IoC 容器。

IoC 容器需要具备两个基本的功能:

  1. 通过描述管理 Bean ,包括发布和获取 Bean
  2. 通过描述完成 Bean 之间的依赖关系

介绍

Spring IoC 容器是一个管理 Bean 的容器,在 Spring 的定义中,它要求所有的 IoC 容器都需要实现接口 BeanFactory,它是一个顶级容器接口。

如下是部分源码:

import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;

public interface BeanFactory {
    //前缀
    String FACTORY_BEAN_PREFIX = "&";
    // 多个 getBean 方法
    Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;

    <T> ObjectProvider<T> getBeanProvider(Class<T> var1);

    <T> ObjectProvider<T> getBeanProvider(ResolvableType var1);

    //是否包含 Bean
    boolean containsBean(String var1);

    //是否是单例
    boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;

    //是否是原型
    boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;

    //是否类型匹配
    boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;

    //获取Bean 类型
    @Nullable
    Class<?> getType(String var1) throws NoSuchBeanDefinitionException;

    //获取Bean别名
    String[] getAliases(String var1);
}

从源码中可以看到多个 getBean 方法,这也是 IoC 容器最重要的方法之一,它的意义就是从 IoC 容器中获取 Bean 。而从多个 getBean 方法中可以看出在 Spring IoC 容器中,允许我们从多种途径获取 Bean,这对后面理解依赖注入(DI)十分重要。

isSingleton 方法则判断 Bean 是否在 Spring IoC 中为单例。这里需要记住的是 在 Spring IoC 容器中,默认情况下,Bean 都是单例存在的,也就是说使用 getBean 方法返回的都是同一个对象。

与 isSingleton 方法相反的是 isPrototype 方法。如果它返回的是 true,那么当我们使用 getBean 方法获取 Bean 的时候, Spring IoC 容器就会创建一个新的 Bean 返回给调用者。

但是 BeanFactory 方法功能还不够强大,因此 Spring 在BeanFactory 基础上,还设计了一个更高级的接口 ApplicationContext 。 在现实中我们使用的大部分 Spring IoC 容器都是 ApplicationContext 接口的实现类。

在 Spring Boot 中,我们主要是通过注解来装配 Bean 到 Spring IoC 容器中,我们主要介绍一个基于注解的 IoC 容器—— AnnotationConfigApplicationContext

示例

下面来看一个简单例子。首先定义一个Java简单对象 User:

public class User {
    private Long id;
    private String userName;
    private String note;

    /**Setter and Getter**/
}

然后再定义一个Java配置文件 AppConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean(name = "user")
    public User initUser(){
        User user = new User();
        user.setId(1L);
        user.setUserName("name");
        user.setNote("note");
        return user;
    }
}

这里需要注意注解 @Configuration 和注解 @Bean

前者代表这是一个 Java 配置文件,Spring 容器会根据它来生成 IoC 容器去装配Bean。

后者代表将 initUser 方法返回的 POJO 装配到 IoC 容器中,而其 属性 name 定义这个Bean 的名称,如果没有配置它,那么则将方法名 initUser 作为Bean的名称并保存到 Spring IoC 容器中。

做好这些 ,就可以使用 AnnotationConfigApplicationContext 来构建自己的 IoC 容器了:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class IoCTest {
    private static Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
    public static void main(String[] args){
        ApplicationContext ctx =
                new AnnotationConfigApplicationContext(AppConfig.class);
        User user = ctx.getBean(User.class);
        logger.info("user' id is " + user.getNote());
    }
}

代码中将 Java 配置文件 AppConfig 传递给 AnnotationConfigApplicationContext 的构造方法,这样它就能读取配置了。 然后将配置中的 Bean 装配到 IoC 容器中,于是就可以使用 getBean 方法获取对应的 POJO ,你可能会看到如下的日志打印:

……
16:15:22.404 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'appConfig'
16:15:22.410 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'user'
16:15:22.453 [main] INFO  - user' id is note

显然,配置在配置文件中的名称为 user 的 Bean 已经被装配到了 IoC 容器中,并且可以通过 getBean 方法获取对应的 Bean ,并将 Bean 的属性信息输出出来。

原文地址:https://www.cnblogs.com/AmosH/p/10348683.html

时间: 2024-08-09 09:21:51

Spring 中 IoC 容器简介的相关文章

Spring中Ioc容器的注入方式

1 通过setter方法注入 bean类: package com.test; public class UserServiceImplement implements IUserService { private IUserDao user; public IUserDao getUser() { return user; } public void setUser(IUserDao user) { this.user = user; } public void saveUser() { us

Spring中IOC容器对数组,集合的相关bean的装配

<bean id="department" class="com.pojo.Department"> <property name="name" value="人事部"></property> <!-- 数组 --> <property name="empName"> <list> <value>张三</value&g

spring在IoC容器中装配Bean详解

1.Spring配置概述 1.1.概述 Spring容器从xml配置.java注解.spring注解中读取bean配置信息,形成bean定义注册表: 根据bean定义注册表实例化bean: 将bean实例放入bean缓存池: 应用程序使用bean. 1.2.基于xml的配置 (1)xml文件概述 xmlns------默认命名空间 xmlns:xsi-------标准命名空间,用于指定自定义命名空间的schema文件 xmlns:xxx="aaaaa"-------自定义命名空间,xx

Spring框架IOC容器和AOP解析

主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置  一.Spring开源框架的简介  Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开

Spring的IOC容器—scope作用域

Scope 简介: Scope用来声明容器中的对象的存货时间.即容器在对象在进入其相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象. Sprign容器最初提供了两种bean的scope类型:singletoon和prototype.自Spring2.0之后,引入了另外三种scope类型,即request.session和global session类型.这三种类型只能再web中使用. 1.Singleton 代表在Spring的IOC容器

Spring 核心技术 IoC容器(一)

IoC 容器 IoC容器和Bean简介 这章包括了Spring框架对于IoC规则的实现.Ioc也同DI(依赖注入).而对象是通过构造函数,工厂方法,或者一些Set方法来定义对象之间的依赖的.容器在创建这些Bean对象的时候同时就会注入这些依赖.这个过程是根本上的反转了,不再由Bean本身来控制实例化和定位依赖,而是通过服务定位来控制这个过程,也是IoC(控制反转)的由来. org.springframework.beans和org.springframework.context包是Spring框

Spring之IOC容器加载初始化的方式

引言 我们知道IOC容器时Spring的核心,可是如果我们要依赖IOC容器对我们的Bean进行管理,那么我们就需要告诉IOC容易他需要管理哪些Bean而且这些Bean有什么要求,这些工作就是通过通过配置文件告诉Spring 的IOC容器.在我们的完成这些配置文件以后,如果IOC容易要实现对这些Bean的管理,除了资源的定位还有一个很重要的一步就是完成IOC加载初始化,也就是配置文件的载入过程.完成IOC容器加载初始化的方式只要有三种,第一种就是通过File文件加载,第二种是通过Classpath

Spring核心技术IoC容器(八)

本文针对自动装载的一些注解进行描述. 基于注解的容器配置 @Required注解 @Required注解需要应用到Bean的属性的setter方法上面,如下面的例子: public class SimpleMovieLister { private MovieFinder movieFinder; @Required public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } //

Spring的IOC容器—依赖注入

前面一篇博客大致讲了一下Spring的IOC容器的原理,IOC即控制反转主要是依靠依赖注入的方式来实现的.依赖注入是指所依赖的对象不是由自己new出来的,而是用别的方式像打针似的注入进来. 其实说白了不管是控制反转还是依赖注入都说明了Spring采用动态.灵活的方式来管理各种对象. Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理.有以下几种注入方式: 1. Setter 注入 因为对于javaBean来说,我们可以通过setter和getter方法