博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring源码分析之IOC容器(一)
阅读量:6215 次
发布时间:2019-06-21

本文共 5598 字,大约阅读时间需要 18 分钟。

  Spring作为当今风靡世界的Web领域的第一框架,作为一名Java开发程序员是一定要掌握的,除了需要掌握基本的使用之外,更需要掌握其实现原理,因为我们往往在开发的过程中,会出现各种各样的异常问题。而且这样的问题去百度有时候往往也找不到特别有效的解决方法,因为问题的原因非常多而百度的又不准确,这个时候怎么办呢?在熟练掌握Spring代码的情况下,我们可以根据提示的异常信息,去跟到源代码的地方,可以准确的定位到异常的所在,这就犹如debug调试自己的业务逻辑一样轻松了,所以Spring的源代码非常值得一读。还有另外一个好处就是,Spring的构建非常的复杂,但同时它的设计也是非常的灵性的,不仅对我们自身的软件设计能力会有很大的提高,感受到软件设计的魅力所在。其实我本来是想等我把Spring的代码完全读透之后再写下这些博文,但是感觉写博客就相当于对自己的一个总结,可能边分析边学下来比较好,下面,就让我来一点一点分析Spring的源码。

  Spring家族的构成非常的庞大,网上有很多图,我也随手拎了一张过来,如下图所示:

 

  通过这张图,我们可以看到处于最下面的是Beans、Core、Context和SpEl四个模块,SpEl是Spring的一个表达式,并没有那么重要,所以我们暂时就不去分析这个了。重点讲一讲其他的三个模块。我借用淘宝大神许令波在《深入分析Web技术内幕》一书中的比喻,Beans相当于Java的对象,而Java对象封装了数据,一个IOC容器中往往会有很多的Bean,我们在这里可以将Bean比喻成演员。Context就相当于容器,给演员,也就是Bean提供了一个舞台,那么最后演员有了,舞台也有了,每个演员不可能只会自己演自己的,也不可能没有道具和服装,所以这个时候Core组件排上用场了,按照这么说的话,Core组件可以维护每个Bean之间的关系,也就相当于这些演员在舞台上要演出的“道具”和“服装”等等。如果这个比喻你还不能理解的话,可以再打一个比喻。三国演义中,每个主公都有自己的武将,可以把武将就看作一个Bean,主公作为一城之主,当敌人来犯的时候必须调配武将,给他们分配兵马,而且打仗的时候需要各个武将之间的配合方能取胜,这个时候我们就可以把主公当作一个容器,主公分发的兵马,粮草器械等等是Core组件,这个用来维持每个武将之间的关系。这三者之间的关系大概就是这样了,只要理解了其实很多情景都可以用IOC来解释了。今天我们就主要说说IIOC三大组件之一的Bean组件。

  首先我们要知道Bean组件是怎么设计的,有哪些类和接口定义了这些功能,画出UML图来表示这些结构和组成。Bean组件位于Spring的org.springframework.beans包下面,如图所示:

这个包其实解决了三件事情:Bean的定义、Bean的创建和Bean的解析。而我们在使用Spring框架的时候要做的就是完成Bean的创建,也就是编写配置文件。Spring的Bean组件的实现完全上是一个工厂模式,位于最顶层的是一个名叫BeanFactory的接口,IOC功能的Bean组件的类结构如下图所示:

最终的实现类是DefaultListableBeanFactory,它实现了所有的接口和类。最顶层的类是BeanFactory,从字面的意思可以理解为bean工厂,是bean组成的最基本的类。它有三个子接口:ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory三个接口。这三个接口的功能肯定是不一样的,分别将代码贴出来。

ListableBeanFactory:这个接口的Bean工厂表示里面的bean元素是可列表的

1 package org.springframework.beans.factory; 2  3 import java.lang.annotation.Annotation; 4 import java.util.Map; 5  6 import org.springframework.beans.BeansException; 7  8 public interface ListableBeanFactory extends BeanFactory { 9       10       boolean containsBeanDefinition(String beanName);11     12       int getBeanDefinitionCount();13       14       String[] getBeanDefinitionNames();15      16       String[] getBeanNamesForType(Class
type);17     18 String[] getBeanNamesForType(Class
type, boolean includeNonSingletons, boolean allowEagerInit);19 20
Map
getBeansOfType(Class
type) throws BeansException;21 22
Map
getBeansOfType(Class
type, boolean includeNonSingletons, boolean allowEagerInit)23 throws BeansException;24 25 Map
getBeansWithAnnotation(Class
annotationType)26 throws BeansException;27 28
A findAnnotationOnBean(String beanName, Class
annotationType);29 }

HierarchicalBeanFactory:这个接口的Bean表示这些Bean是有继承关系的。

1 package org.springframework.beans.factory; 2  3  4 public interface HierarchicalBeanFactory extends BeanFactory { 5      6      7     BeanFactory getParentBeanFactory(); 8  9     boolean containsLocalBean(String name);10 11 }

AutowireCapableBeanFactory:表示Bean是可以自动装配的。

1 package org.springframework.beans.factory.config; 2  3 import java.util.Set; 4  5 import org.springframework.beans.BeansException; 6 import org.springframework.beans.TypeConverter; 7 import org.springframework.beans.factory.BeanFactory; 8  9 public interface AutowireCapableBeanFactory extends BeanFactory {10 11     int AUTOWIRE_NO = 0;12 13     int AUTOWIRE_BY_NAME = 1;14 15     int AUTOWIRE_BY_TYPE = 2;16 17     int AUTOWIRE_CONSTRUCTOR = 3;18 19     @Deprecated20     int AUTOWIRE_AUTODETECT = 4;21 22 23     //-------------------------------------------------------------------------24     // Typical methods for creating and populating external bean instances25     //-------------------------------------------------------------------------26 27     
T createBean(Class
beanClass) throws BeansException;28 29 void autowireBean(Object existingBean) throws BeansException;30 31 Object configureBean(Object existingBean, String beanName) throws BeansException;32 33 Object resolveDependency(DependencyDescriptor descriptor, String beanName) throws BeansException;34 35 36 //-------------------------------------------------------------------------37 // Specialized methods for fine-grained control over the bean lifecycle38 //-------------------------------------------------------------------------39 40 Object createBean(Class beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;41 42 Object autowire(Class beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;43 44 void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)45 throws BeansException;46 47 void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;48 49 Object initializeBean(Object existingBean, String beanName) throws BeansException;50 51 Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)52 throws BeansException;53 54 Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)55 throws BeansException;56 57 Object resolveDependency(DependencyDescriptor descriptor, String beanName,58 Set
autowiredBeanNames, TypeConverter typeConverter) throws BeansException;59 60 }

这四个接口共同定义了Bena的集合,Bean之间的关系和Bean的行为。

 

Bean的定义

Bean的定义主要由BeanDefinition描述,类的结构图如下:

Bean的解析

Bean解析的过程非常的复杂,功能被分得很细,因为这里需要被扩展的地方很多,必须保证有足够的灵活性,以应对可能的变化。Bean的解析主要就是对Spring配置文件的解析,这个解析过程如图所示:

以上就包括了Spring IOC中的Bean组件的一些基本的定义和类的结构,请大家参考。

转载于:https://www.cnblogs.com/yujiwei/p/7242464.html

你可能感兴趣的文章
用代理抓取微信文章
查看>>
category的概念
查看>>
php生成N个不重复的随机数实例
查看>>
生物结构变异分析软件meerkat 0.189使用笔记(一)
查看>>
Java中成员变量的隐藏和方法的重写
查看>>
Java 对简单字符的编码
查看>>
设置访问URL不要项目名二级目录
查看>>
使用 Redis 实现 Session 共享
查看>>
Idea改项目名
查看>>
设计模式-享元模式(13)
查看>>
WPF入门教程系列六——布局介绍与Canvas
查看>>
Io流的概述
查看>>
奇葩概念
查看>>
【剑道】 他人技法心得整理
查看>>
MYSQL分页存储过程及事务处理
查看>>
一小时入门PHP
查看>>
【设计模式系列】结构型模式之Flyweight 模式
查看>>
js还能做的那些事
查看>>
SGU 107 数学题
查看>>
我学Delphi心得与笔记-------多线程实例
查看>>