Spring 中 IoC 容器简介

栏目: Java · 发布时间: 6年前

内容简介:IoC 是一种通过描述来生成或者获取对象的技术,可以说 Spring 是一种基于 IoC 容器编程的框架在一个系统中可以生成各种对象,并且这些对象都需要进行管理。为了描述这些对象关系,我们需要一个容器。在 Spring 中把每一个需要管理的对象称为 Spring Bean ,而管理这些 Bean 的容器就被称为 Spring IoC 容器。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 getBean(String var1, Class var2) throws BeansException;

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

T getBean(Class var1) throws BeansException;

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

ObjectProvider getBeanProvider(Class var1);

ObjectProvider 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 的属性信息输出出来。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2019-02/156794.htm


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Shallows

The Shallows

Nicholas Carr / W. W. Norton & Company / 2011-6-6 / USD 15.95

"Is Google making us stupid?" When Nicholas Carr posed that question, in a celebrated Atlantic Monthly cover story, he tapped into a well of anxiety about how the Internet is changing us. He also crys......一起来看看 《The Shallows》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具