spring源码分析---IOC(1)
我们都知道spring有2个最重要的概念,IOC(控制反转)和AOP(依赖注入)。今天我就分享一下spring源码的IOC。
IOC的定义:直观的来说,就是由spring来负责控制对象的生命周期和对象间的关系,将对象之间的关系抽象出来,通过spring容器控制对象生成时机,减少对象之间的耦合度。
更通俗一点的说就是,JAVA程序中,当你在代码中需要使用某个类提供的功能时,你首先需要new一个对象,给它传递必要的参数,然后才能使用它提供的功能;有了IOC之后,IOC的容器类似一个中介,所有的对象都会注册到这个中介,当需要用到某个对象的时候就告诉中介(配置bean信息),中介会帮你注入对象。
IOC的体系结构: BeanFactory和BeanDefinition
BeanFactory:类图如下
beanFactory的接口可以分为四层
第一层:BeanFactory是主接口,定义了IOC容器的基本功能规范
第二层:BeanFactory的三个子接口:HierarchicalBeanFactory(分层工厂接口)、AutowireCapableBeanFactory(自动装配工厂接口)和ListableBeanFactory(可将集合列出工厂接口)
第三次:HierarchicalBeanFactory的子接口ConfigurableBeanFactory(复杂可配置工厂)
第四层:ListableBeanFactory,ConfigurableBeanFactory,AutowireCapableBeanFactory的共同接口:ConfigurableBeanFactory
看到这个结构其实我们很容易想到设计模式的----接口隔离模式(不清楚的自行百度吧)
下面我们看下每个接口的源码
BeanFactory
public interface BeanFactory {
//这里是对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,(用来区分是获取BeanFactory工厂本身还是工厂创建的对象) ,如果需要得到工厂本身,需要转义
String FACTORY_BEAN_PREFIX = "&";
//四个不同形式的getBean方法,获取实例
Object getBean(String var1) throws BeansException; <T> T getBean(String var1, Class<T> var2) throws BeansException; <T> T getBean(Class<T> var1) throws BeansException; Object getBean(String var1, Object... var2) throws BeansException; <T> T getBean(Class<T> var1, Object... var2) throws BeansException;
//是否包含bean
boolean containsBean(String var1);
//是否单例模式
boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
//是否多例
boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
//是否匹配类型
boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
//获取bean类型
Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
//获取bean别名
String[] getAliases(String var1);
}
BeanFactory对IOC容器的基本行为作了定义,但是并不关心bean怎样加载的
HierarchicalBeanFactory代码
public interface HierarchicalBeanFactory extends BeanFactory {
BeanFactory getParentBeanFactory(); boolean containsLocalBean(String var1);
}
这个工厂接口定义的Bean都是可以继承的,都是有parent
ListableBeanFactory代码
public interface ListableBeanFactory extends BeanFactory {
boolean containsBeanDefinition(String var1); int getBeanDefinitionCount(); String[] getBeanDefinitionNames(); String[] getBeanNamesForType(Class<?> var1); String[] getBeanNamesForType(Class<?> var1, boolean var2, boolean var3); <T> Map<String, T> getBeansOfType(Class<T> var1) throws BeansException; <T> Map<String, T> getBeansOfType(Class<T> var1, boolean var2, boolean var3) throws BeansException; String[] getBeanNamesForAnnotation(Class<? extends Annotation> var1); Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> var1) throws BeansException; <A extends Annotation> A findAnnotationOnBean(String var1, Class<A> var2) throws NoSuchBeanDefinitionException;
}
这个工厂接口定义的Bean都是可以列表化的,可以批量获取bean的信息
AutowireCapableBeanFactory代码
public interface AutowireCapableBeanFactory extends BeanFactory {
int AUTOWIRE_NO = 0;
int AUTOWIRE_BY_NAME = 1;
int AUTOWIRE_BY_TYPE = 2;
int AUTOWIRE_CONSTRUCTOR = 3;
/** @deprecated */
@Deprecated
int AUTOWIRE_AUTODETECT = 4; <T> T createBean(Class<T> var1) throws BeansException; void autowireBean(Object var1) throws BeansException; Object configureBean(Object var1, String var2) throws BeansException; Object resolveDependency(DependencyDescriptor var1, String var2) throws BeansException; Object createBean(Class<?> var1, int var2, boolean var3) throws BeansException; Object autowire(Class<?> var1, int var2, boolean var3) throws BeansException; void autowireBeanProperties(Object var1, int var2, boolean var3) throws BeansException; void applyBeanPropertyValues(Object var1, String var2) throws BeansException; Object initializeBean(Object var1, String var2) throws BeansException; Object applyBeanPostProcessorsBeforeInitialization(Object var1, String var2) throws BeansException; Object applyBeanPostProcessorsAfterInitialization(Object var1, String var2) throws BeansException; void destroyBean(Object var1); Object resolveDependency(DependencyDescriptor var1, String var2, Set<String> var3, TypeConverter var4) throws BeansException;
}
这个工厂接口定义 Bean 的自动装配规则。也就是非容器注册的Bean托管成容器管理,如tomcat的Filter(属于服务器),可以用这个接口来装配spring的bean
以上四个接口共同定义了 Bean 的集合、Bean 之间的关系、以及 Bean 行为
ConfigurableBeanFactory提供bean的扩配置功能,它的子接口ConfigurableListableBeanFactory,除了ConfigurableBeanFactory的功能之外,它还提供了访问和修改BeanDefinition,预实例化singletons(这连个接口代码太长就不帖出来了)
BeanFactory相关的接口只对IOC容器的最基本行为作了定义,根本不关心你的bean是怎样定义怎样加载的。
根据上面的类图,我们发现默认实现类是DefaultListableBeanFactory,这个类很复杂,下面我们重点分析这个类的源码
未完。。。。
spring源码分析---IOC(1)的更多相关文章
- SPRING源码分析:IOC容器
在Spring中,最基本的IOC容器接口是BeanFactory - 这个接口为具体的IOC容器的实现作了最基本的功能规定 - 不管怎么着,作为IOC容器,这些接口你必须要满足应用程序的最基本要求: ...
- 【spring源码分析】IOC容器初始化(总结)
前言:在经过前面十二篇文章的分析,对bean的加载流程大致梳理清楚了.因为内容过多,因此需要进行一个小总结. 经过前面十二篇文章的漫长分析,终于将xml配置文件中的bean,转换成我们实际所需要的真正 ...
- 【spring源码分析】IOC容器初始化(一)
前言:spring主要就是对bean进行管理,因此IOC容器的初始化过程非常重要,搞清楚其原理不管在实际生产或面试过程中都十分的有用.在[spring源码分析]准备工作中已经搭建好spring的环境, ...
- 【spring源码分析】IOC容器初始化(二)
前言:在[spring源码分析]IOC容器初始化(一)文末中已经提出loadBeanDefinitions(DefaultListableBeanFactory)的重要性,本文将以此为切入点继续分析. ...
- 【spring源码分析】IOC容器初始化(三)
前言:在[spring源码分析]IOC容器初始化(二)中已经得到了XML配置文件的Document实例,下面分析bean的注册过程. XmlBeanDefinitionReader#registerB ...
- 【spring源码分析】IOC容器初始化(四)
前言:在[spring源码分析]IOC容器初始化(三)中已经分析了BeanDefinition注册之前的一些准备工作,下面将进入BeanDefinition注册的核心流程. //DefaultBean ...
- 【spring源码分析】IOC容器初始化(七)
前言:在[spring源码分析]IOC容器初始化(六)中分析了从单例缓存中加载bean对象,由于篇幅原因其核心函数 FactoryBeanRegistrySupport#getObjectFromFa ...
- 【spring源码分析】IOC容器初始化(十)
前言:前文[spring源码分析]IOC容器初始化(九)中分析了AbstractAutowireCapableBeanFactory#createBeanInstance方法中通过工厂方法创建bean ...
- 【spring源码分析】IOC容器初始化——查漏补缺(一)
前言:在[spring源码分析]IOC容器初始化(十一)中提到了初始化bean的三个步骤: 激活Aware方法. 后置处理器应用(before/after). 激活自定义的init方法. 这里我们就来 ...
随机推荐
- NOIP2017 逛公园 题解报告 【最短路 + 拓扑序 + dp】
题目描述 策策同学特别喜欢逛公园.公园可以看成一张NNN个点MMM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,NNN号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花 ...
- 【计算机视觉】SIFT中LoG和DoG比较
<SIFT原理与源码分析>系列文章索引:http://www.cnblogs.com/tianyalu/p/5467813.html 在实际计算时,三种方法计算的金字塔组数noctaves ...
- iOS之富文本(二)
之前做项目时遇到一个问题: 使用UITextView显示一段电影的简介,由于字数比较多,所以字体设置的很小,行间距和段间距也很小,一大段文字挤在一起看起来很别扭,想要把行间距调大,结 ...
- H5禁止手机虚拟键盘弹出
点击输入框弹出自定义弹窗,输入框是input标:但是在移动端,input会默认触发手机的虚拟键盘,如何阻止手机虚拟键盘弹起呢?目前我试过有两个方案,一个是给input添加readonly属性,另一个就 ...
- (转)ios error:unrecognized selector sent to class
转自:http://blog.itpub.net/12231606/viewspace-1081952/ 今天将app统计的.a静态库包含到一个app应用中,调试时报下面的错误: *** Termin ...
- Java设计模式の责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- 【VSCode】Windows下VSCode编译调试c/c++【更新 2018.03.27】
--------– 2018.03.27 更新--------- 便携版已更新,点此获取便携版 已知BUG:中文目录无法正常调试 用于cpptools 0.15.0插件的配置文件更新 新的launch ...
- Dubbo 的应用
--- 用于大规模服务化,通过在消费方获取服务提供方的地址列表,实现负载均衡,减轻服务器压力. 最简单调用图 节点角色说明: l Provider: 暴露服务的服务提供方. l Consumer ...
- java绝对路径和相对路径的理解
日常开发中引用东西经常会遇到路径问题,各种尝试,各种出错,其实只要理解了这两种路径,问题便迎刃而解. 在java中路径有两种表示方法:绝对路径和相对路径. (1) 相对路径:它以不带“\”的目录名表示 ...
- parseInt
本文地址:http://www.cnblogs.com/veinyin/p/7647863.html 先来个简单的 console.log(parseFloat("8")); 嗯, ...