1.总所周知,spring ioc功能实现的顶层接口就是BeanFactory。如下面类结构图

这张更加全面:

还有更加变态的

2.BeanFactory为最顶层接口,定义了最核心的需要实现的接口

package org.springframework.beans.factory;

public interface BeanFactory {

    /**
* 用来引用一个实例,或把它和工厂产生的Bean区分开,就是说,如果一个FactoryBean的名字为a,那么,&a会得到那个Factory
*/
String FACTORY_BEAN_PREFIX = "&"; /*
* 四个不同形式的getBean方法,获取实例
*/
Object getBean(String name) throws BeansException; <T> T getBean(String name, Class<T> requiredType) throws BeansException; <T> T getBean(Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args) throws BeansException; boolean containsBean(String name); // 是否存在 boolean isSingleton(String name) throws NoSuchBeanDefinitionException;// 是否为单实例 boolean isPrototype(String name) throws NoSuchBeanDefinitionException;// 是否为原型(多实例) boolean isTypeMatch(String name, Class<?> targetType)
throws NoSuchBeanDefinitionException;// 名称、类型是否匹配 Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 获取类型 String[] getAliases(String name);// 根据实例的名字获取实例的别名 }

3.分层的Bean工厂:HierarchicalBeanFactory,定义工厂之间的层级关系

public interface HierarchicalBeanFactory extends BeanFactory {

    BeanFactory getParentBeanFactory();    //  返回本Bean工厂的父工厂

    boolean containsLocalBean(String name);    //  本地工厂是否包含这个Bean,忽略其他所有父工厂

}

4.可将Bean逐一列出的工厂——ListableBeanFactory

public interface ListableBeanFactory extends BeanFactory {

    boolean containsBeanDefinition(String beanName); // 对于给定的名字是否含有BeanDefinition

    int getBeanDefinitionCount(); // 返回工厂的BeanDefinition总数

    String[] getBeanDefinitionNames(); // 返回工厂中所有Bean的名字

    String[] getBeanNamesForType(Class<?> type); // 返回对于指定类型Bean(包括子类)的所有名字

    /*
* 返回指定类型的名字 includeNonSingletons为false表示只取单例Bean,true则不是
* allowEagerInit为true表示立刻加载,false表示延迟加载。 注意:FactoryBeans都是立刻加载的。
*/
String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons,
boolean allowEagerInit); <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException; // 根据类型(包括子类)返回指定Bean名和Bean的Map <T> Map<String, T> getBeansOfType(Class<T> type,
boolean includeNonSingletons, boolean allowEagerInit)
throws BeansException; Map<String, Object> getBeansWithAnnotation(
Class<? extends Annotation> annotationType) throws BeansException; // 根据注解类型,查找所有有这个注解的Bean名和Bean的Map <A extends Annotation> A findAnnotationOnBean(String beanName,
Class<A> annotationType);// 根据指定Bean名和注解类型查找指定的Bean }

5.自动装配的Bean工厂——AutowireCapableBeanFactory

public interface AutowireCapableBeanFactory extends BeanFactory {

    int AUTOWIRE_NO = 0;   //  这个常量表明工厂没有自动装配的Bean

    int AUTOWIRE_BY_NAME = 1;  //表明根据名称自动装配

    int AUTOWIRE_BY_TYPE = 2;  //表明根据类型自动装配

    int AUTOWIRE_CONSTRUCTOR = 3;  //表明根据构造方法快速装配

    @Deprecated
int AUTOWIRE_AUTODETECT = 4; //表明通过Bean的class的内部来自动装配(有没翻译错...)Spring3.0被弃用。 <T> T createBean(Class<T> beanClass) throws BeansException; // 根据指定Class创建一个全新的Bean实例 void autowireBean(Object existingBean) throws BeansException; // 给定对象,根据注释、后处理器等,进行自动装配 /*
* 根据Bean名的BeanDefinition装配这个未加工的Object,执行回调和各种后处理器。
*/
Object configureBean(Object existingBean, String beanName) throws BeansException; /*
* 分解Bean在工厂中定义的这个指定的依赖descriptor
*/
Object resolveDependency(DependencyDescriptor descriptor, String beanName) throws BeansException; /*
* 根据给定的类型和指定的装配策略,创建一个新的Bean实例
*/
Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; /*
* 与上面类似,不过稍有不同。
*/
Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; /*
* 根据名称或类型自动装配
*/
void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
throws BeansException; /*
* 也是自动装配
*/
void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException; /*
* 初始化一个Bean...
*/
Object initializeBean(Object existingBean, String beanName) throws BeansException; /*
* 初始化之前执行BeanPostProcessors
*/
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException;
/*
* 初始化之后执行BeanPostProcessors
*/
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException; /*
* 分解指定的依赖
*/
Object resolveDependency(DependencyDescriptor descriptor, String beanName,
Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException; }

6.复杂的配置Bean工厂——ConfigurableBeanFactory

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {

    String SCOPE_SINGLETON = "singleton";  //  单例

    String SCOPE_PROTOTYPE = "prototype";  //  原型

    /*
* 搭配HierarchicalBeanFactory接口的getParentBeanFactory方法
*/
void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException; /*
* 设置、返回工厂的类加载器
*/
void setBeanClassLoader(ClassLoader beanClassLoader); ClassLoader getBeanClassLoader(); /*
* 设置、返回一个临时的类加载器
*/
void setTempClassLoader(ClassLoader tempClassLoader); ClassLoader getTempClassLoader(); /*
* 设置、是否缓存元数据,如果false,那么每次请求实例,都会从类加载器重新加载(热加载) */
void setCacheBeanMetadata(boolean cacheBeanMetadata); boolean isCacheBeanMetadata();//是否缓存元数据 /*
* Bean表达式分解器
*/
void setBeanExpressionResolver(BeanExpressionResolver resolver); BeanExpressionResolver getBeanExpressionResolver(); /*
* 设置、返回一个转换服务
*/
void setConversionService(ConversionService conversionService); ConversionService getConversionService(); /*
* 设置属性编辑登记员...
*/
void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar); /*
* 注册常用属性编辑器
*/
void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass); /*
* 用工厂中注册的通用的编辑器初始化指定的属性编辑注册器
*/
void copyRegisteredEditorsTo(PropertyEditorRegistry registry); /*
* 设置、得到一个类型转换器
*/
void setTypeConverter(TypeConverter typeConverter); TypeConverter getTypeConverter(); /*
* 增加一个嵌入式的StringValueResolver
*/
void addEmbeddedValueResolver(StringValueResolver valueResolver); String resolveEmbeddedValue(String value);//分解指定的嵌入式的值 void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);//设置一个Bean后处理器 int getBeanPostProcessorCount();//返回Bean后处理器的数量 void registerScope(String scopeName, Scope scope);//注册范围 String[] getRegisteredScopeNames();//返回注册的范围名 Scope getRegisteredScope(String scopeName);//返回指定的范围 AccessControlContext getAccessControlContext();//返回本工厂的一个安全访问上下文 void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);//从其他的工厂复制相关的所有配置 /*
* 给指定的Bean注册别名
*/
void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException; void resolveAliases(StringValueResolver valueResolver);//根据指定的StringValueResolver移除所有的别名 /*
* 返回指定Bean合并后的Bean定义
*/
BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;//判断指定Bean是否为一个工厂Bean void setCurrentlyInCreation(String beanName, boolean inCreation);//设置一个Bean是否正在创建 boolean isCurrentlyInCreation(String beanName);//返回指定Bean是否已经成功创建 void registerDependentBean(String beanName, String dependentBeanName);//注册一个依赖于指定bean的Bean String[] getDependentBeans(String beanName);//返回依赖于指定Bean的所欲Bean名 String[] getDependenciesForBean(String beanName);//返回指定Bean依赖的所有Bean名 void destroyBean(String beanName, Object beanInstance);//销毁指定的Bean void destroyScopedBean(String beanName);//销毁指定的范围Bean void destroySingletons(); //销毁所有的单例类 }

在具体介绍之前,先看一下接口SingletonBeanRegistry的源码:

public interface SingletonBeanRegistry {

    void registerSingleton(String beanName, Object singletonObject); //在容器内注册一个单例类  

    Object getSingleton(String beanName);//返回给定名称对应的单例类

    boolean containsSingleton(String beanName);//给定名称是否对应单例类

    String[] getSingletonNames();//返回容器内所有单例类的名字

    int getSingletonCount();//返回容器内注册的单例类数量

}

SingletonBeanRegistry这个接口非常简单,5个方法,实现了单例类注册的功能。

ConfigurableBeanFactory同时继承了HierarchicalBeanFactory 和 SingletonBeanRegistry 这两个接口,即同时继承了分层和单例类注册的功能。

7.BeanFactory的集大成者:ConfigurableListableBeanFactory

public interface ConfigurableListableBeanFactory
extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory { void ignoreDependencyType(Class<?> type);//忽略自动装配的依赖类型 void ignoreDependencyInterface(Class<?> ifc);//忽略自动装配的接口
/*
* 注册一个可分解的依赖
*/
void registerResolvableDependency(Class<?> dependencyType, Object autowiredValue);
/*
* 判断指定的Bean是否有资格作为自动装配的候选者
*/
boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException;
/*
* 返回注册的Bean定义
*/
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; void freezeConfiguration();//暂时冻结所有的Bean配置 boolean isConfigurationFrozen();//判断本工厂配置是否被冻结 void preInstantiateSingletons() throws BeansException;//使所有的非延迟加载的单例类都实例化。 }

8.额外的接口:BeanDefinitionRegistry

这个接口基本用来操作定义在工厂内部的BeanDefinition的。我们先来看一下这个接口的父接口:

public interface AliasRegistry {

    void registerAlias(String name, String alias);//对指定的名称注册别名

    void removeAlias(String alias);//从当前容器移除指定别名

    boolean isAlias(String beanName);//判断指定名称是否为别名

    String[] getAliases(String name);//返回指定名称的所有别名

}

可以看到这4个方法都非常简单,都是用来操作别名的。

再来看一下BeanDefinitionRegistry的源码:

public interface BeanDefinitionRegistry extends AliasRegistry {

    void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;//给定bean名称,注册一个新的bean定义
/*
* 根据指定Bean名移除对应的Bean定义
*/
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
/*
* 根据指定bean名得到对应的Bean定义
*/
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
/*
* 查找,指定的Bean名是否包含Bean定义
*/
boolean containsBeanDefinition(String beanName); String[] getBeanDefinitionNames();//返回本容器内所有注册的Bean定义名称 int getBeanDefinitionCount();//返回本容器内注册的Bean定义数目 boolean isBeanNameInUse(String beanName);//指定Bean名是否被注册过。 }

容器之beanfactory抽丝剥茧系列一的更多相关文章

  1. spring揭密学习笔记(3)-spring ioc容器:Spring的IoC容器之BeanFactory

    1. Spring的IoC容器和IoC Service Provider的关系 Spring的IoC容器和IoC Service Provider所提供的服务之间存在一定的交集,二者的关系如图4-1所 ...

  2. spring揭秘读书笔记----spring的ioc容器之BeanFactory

    spring的ioc容器是一种特殊的Ioc Service Provider(ioc服务提供者),如果把普通的ioc容器认为是工厂模式(其实很相似),那spring的ioc容器只是让这个工厂的功能更强 ...

  3. [知识点]C++中STL容器之vector

    零.STL目录 1.容器之map 2.容器之vector 3.容器之set 一.前言 关于STL和STL容器的概念参见STL系列第一篇——map(见上).今天介绍第二个成员——vector. 二.用途 ...

  4. Java并发编程:并发容器之CopyOnWriteArrayList(转载)

    Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...

  5. Java并发编程:并发容器之ConcurrentHashMap(转载)

    Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...

  6. Java并发编程:并发容器之ConcurrentHashMap

    转载: Java并发编程:并发容器之ConcurrentHashMap JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的 ...

  7. Java并发编程:并发容器之CopyOnWriteArrayList

    转载: Java并发编程:并发容器之CopyOnWriteArrayList Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个 ...

  8. Java 容器之Hashset 详解

    Java 容器之Hashset 详解.http://blog.csdn.net/nvd11/article/details/27716511

  9. 【转】Java并发编程:并发容器之CopyOnWriteArrayList

    Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改, ...

  10. 【转】Java并发编程:并发容器之ConcurrentHashMap

    JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...

随机推荐

  1. IDEA常用的快捷键(win版)

    IDEA常用的快捷键ctrl+shift+alt:多行操作psvm:生成main()方法:fori:生成for循环:Ctrl+Alt+v:自动补齐返回值类型ctrl+o:覆写方法ctrl+i:实现接口 ...

  2. KVM虚拟机迁移至VMWare ESXi

    需求 由于服务器迁移,为维护方便,将统一使用vmware 平台管理虚拟机,因此需将kvm 虚拟机统一迁至vmware kvm 磁盘镜像转换 查看虚拟机 # virsh list --all Id Na ...

  3. SSH的密钥登录配置

    1.ssh的登录方法. 两种方法: (1)linux系统connect to linux ssh -l root 192.168.2.191 #直接登录. 语法:$ssh -p 22 user@hos ...

  4. CF1561D Up the Strip

    Up the Strip 题意 你现在在 \(n\) 号格子,你需要跳到 \(1\) 号格子,你可以有两种跳法: 你可以做减法,即选择一个数 \(k\in [1,n)\) ,从 \(n\) 跳到 \( ...

  5. Web实时通信之SignalR

    前言 对于B/S模式的项目,基础的场景都是客户端发起请求,服务端返回响应结果就结束了一次连接:但在很多实际应用场景中,这种简单的请求和响应模式就显得很吃力,比如消息通知.监控看板信息自动刷新等实时通信 ...

  6. docker-io安装报错

    一般修改两个文件即可 1.文件 :/etc/docker/daemon.json { "storage-driver": "devicemapper" } 2. ...

  7. bzoj 3669

    思想基本同bzoj 2594,但是多了一步 首先我们发现这时的边有两个属性了,因此我们考虑先去掉其中一者的限制 我们把所有边按$a$大小排序,然后从小到大加入维护的最小生成树 每次加边时都按照$b$的 ...

  8. shell相关基础面试题

    用sed修改test.txt的23行test为tset: sed –i '23s/test/tset/g' test.txt 查看/web.log第25行第三列的内容. sed –n '25p' /w ...

  9. redis字段使用说明

    Set(集合)增删改查: #删除当前选择数据库中的所有key127.0.0.1:6379> flushdbOK#生成set集合,添加4个数据127.0.0.1:6379> sadd set ...

  10. 【pytest】pytest.mark.dependency用例依赖标签,并解决依赖失效的问题

    pytest第三方插件,用来解决用例之间的依赖关系.如果依赖的用例执行失败后 后续的用例会被跳过执行,相当于智能执行了pytest.mark.skip, 首先要安装插件:pip install pyt ...