注解下的Spring Ioc.
Spring所提供的两个核心理念,一个是控制反转(Inversion of Control,IoC),另一个是面向切面编程(Aspect Oriented Progarmming,AOP),IoC容器是spring的核心,可以说是Spring是一种基于IoC容器编程的框架(我更喜欢称之为CRUD框架),因为Spring Boot是基于注解的开发Spring IoC,,所以我们使用全注解的方式来理解Spring IoC技术。
在初学java的时候,我们更喜欢用new来创建对象,而在Spring中却不是,它是通过描述来创建对象的。Spring Boot中并不建议你用xml,而是通过注解的描述来生成对象。
一个系统可以生成多个对象,并且对这些对象进行管理,对象之间不是独立,相互之间还存在依赖关系。例如一个班级是由多个学生和老师组成的,那么一个班级就是依赖于学生和老师,老师和学生之间又是相互有关联的。为此Spring还提供了依赖注入的功能,是我们能够通过描述来管理各个对象的关系。
为了描述上述的班级,同学,老师这三个对象的关系,我们需要一个容器。在Spring中把每一个需要管理的对象称之为Spring Bean,而Spring管理这Bean的容器,被我们称之为Spring IoC容器。IoC容器需要具备两个基本功能:
- 通过管理描述Bean,包括发布和获取Bean;
- 通过描述完成Bean之间依赖的关系;
IoC容器简介
Spring IoC容器是一个管理Bean的容器,在Spring的定义中,他需要所有的接口都实现接口BeanFactory,他是一个顶级容器。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.beans.factory;
import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
//多个获取bean的方法
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);
//bean是否单例
boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
//bean是否原型
boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
//bean类型匹配
boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
//获取类型
@Nullable
Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;
//获取别名
String[] getAliases(String var1);
}
在源码中可以看到多个getBean的方法,这些是从IoC容器中获取Bean的重要方法,isSingleton方法判断Bean是否在SpringIoC中为单例,,在默认请看下,Bean都是以单例为存在的,也就是使用getBean返回的对象都是同一个,如果isPrototype返回为true,那么我们使用getBean方法获取Bean的时候,SpringIoC容器就会创建一个新的Bean给调用者。