本章节主要是学习Spring官网的1.1、1.2和1.3节内容,有兴趣的同学可以跟着官网一起学习。
文章目录
1、Spring容器和IOC
1.1、Spring容器是什么?
在官网1.2节中对Spring容器的描述如下:
The
org.springframework.context.ApplicationContext
interface represents the Spring IoC container and is responsible for instantiating, configuring, and assembling the beans.
这段话的意思主要是:
- Spring容器是
org.springframework.context.ApplicationContext
接口的一个实例化对象 - Spring容器主要负责实例化、配置和装配Spring的Bean对象。
1.2、Spring Bean是什么?
在官网中对Spring Bean描述如下:
A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container. Otherwise, a bean is simply one of many objects in your applicationSpring Bean定义的大致意思如下:
- Spring Bean必须是由Spring容器实例化、装配和以其他方式管理的对象。
- 通俗的理解就是,JAVA对象经由Spring容器实例化、装配就可以变成一个Spring Bean,否则只能是一个普通的JAVA对象。
1.3、IOC是什么?
在官网1.1节中对IOC有详细的描述,大概意思如下:
IOC(控制反转)也称为依赖注入,IOC容器负责Spring Bean的创建、装配、生命周期的管理以及Bean与Bean之间的关系。在这整个过程当中,IOC容器完成了一个完整Bean的实例化,包括其依赖的Bean的实例化,那么这个依赖的Bean实例化是由IOC容器完成,而不是由开发人员去实例化的,这个过程就是IOC(控制反转)了,就是将依赖的的Bean的实例化的交由IOC容器管理和注入。
2、Spring容器如何实例化一个Bean
Spring官网给出了一个Spring容器工作图:
从上面的图片中可以看出,Spring容器通过POJO对象和配置的元数据信息可以产生一个充分配置的可以使用的系统。
这里所说的POJO对象就是JAVA对象,配置原数据信息就是开发人员自己配置的一些Bean的信息,比如Bean是单例还是原型?是按类型加载Bean还是按名称加载Bean等等…,目前可以用xml或者注解的方式配置元数据信息。
2.1、Bean的实例化
Spring官网提供了三种实例化Bean方式,分别如下:
- 构造方法实例化Bean
- 静态工厂方法实例化Bean
- 实例工厂方法实例化Bean
俗话说,不是手撸的代码是得不到它的真传的,所以现在把官网所给的Demo撸一遍,跟着Spring源码看一看每一种Bean实例化过程的内在世界。
2.2、构造方法实例化Bean
2.2.1、Demo搭建
Demo结构如图所示:
- TestInstantiationBean类的main方法内容如上图所示,这个类是入口。
- MyServiceBean.xml的内容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myServiceBean" class="com.spring.spring.MyServiceBean"/>
</beans>
- MyServiceBean类的内容如下:
public class MyServiceBean {
public MyServiceBean() {
}
}
2.2.2、源码分析
用Debug方式启动main方法,进入到getBean()方法,在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
方法处打一个断点,跟着源码看一下构造方法实例化Bean的具体实现,该方法的具体内容如下,省略和这次分析无关的代码,只分析相关的代码:
/**
* 创建实例对象的函数
**/
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
// 调用无参构造方法实例化对象