XmlBeanFactory实现的接口

屏幕快照 2018-08-28 下午11.32.29.png

基本spring2.5版本

XmlBeanFactory是springIOC的基础类。

写了一个DEMO来列举XmlBeanFactory实现的接口。

    @Test
    public void testBeanInterFace() throws Exception{
        Class<XmlBeanFactory> clazz = XmlBeanFactory.class;
        Set<Class<?>> set = new HashSet<Class<?>>();
        getAllInterFaces(clazz, set);
        
        for (Class<?> class1 : set) {
            System.out.println(class1);
        }
    }

    private void getAllInterFaces(Class<?> clazz, Set<Class<?>> set) {
        if(null == clazz) {
            return;
        }
        
        if (clazz.equals(Object.class)) {
            return;
        }
        
        if (clazz.isInterface()) {
            set.add(clazz);
        }
        
        Class<?>[] interfaces = clazz.getInterfaces();
        for (Class<?> class1 : interfaces) {
            getAllInterFaces(class1, set);
        }
        
        Class<?> superclass = clazz.getSuperclass();
        getAllInterFaces(superclass, set);
    }

输出如下:

interface org.springframework.beans.factory.BeanFactory
interface org.springframework.beans.factory.HierarchicalBeanFactory
interface org.springframework.beans.factory.ListableBeanFactory
interface org.springframework.beans.factory.config.ConfigurableListableBeanFactory
interface org.springframework.beans.factory.support.BeanDefinitionRegistry
interface org.springframework.beans.factory.config.ConfigurableBeanFactory
interface org.springframework.beans.factory.config.AutowireCapableBeanFactory
interface org.springframework.core.AliasRegistry
interface org.springframework.beans.factory.config.SingletonBeanRegistry

下面来分析下这些接口的作用。

BeanFactory

BeanFactory是springIOC中最重要的接口,这个接口主要提供了IOC容器的一些基本功能,例如获取bean,bean是否存在等。
常用方法如下:

Object getBean(String name) throws BeansException;

boolean containsBean(String name);

boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

要求子类实现此接口时,必须满足如下功能:

Bean factory implementations should support the standard bean lifecycle interfaces as far as possible. The full set of initialization methods and their standard order is:
1. BeanNameAware's setBeanName
2. BeanClassLoaderAware's setBeanClassLoader
3. BeanFactoryAware's setBeanFactory
4. ResourceLoaderAware's setResourceLoader (only applicable when running in an application context)
5. ApplicationEventPublisherAware's setApplicationEventPublisher (only applicable when running in an application context)
6. MessageSourceAware's setMessageSource (only applicable when running in an application context)
7. ApplicationContextAware's setApplicationContext (only applicable when running in an application context)
8. ServletContextAware's setServletContext (only applicable when running in a web application context)
9. postProcessBeforeInitialization methods of BeanPostProcessors
10. InitializingBean's afterPropertiesSet
11. a custom init-method definition
12. postProcessAfterInitialization methods of BeanPostProcessors

On shutdown of a bean factory, the following lifecycle methods apply:
1. DisposableBean's destroy
2. a custom destroy-method definition

ListableBeanFactory

ListableBeanFactory时BeanFactory的子类,Listable的意思是可以列举的,就是可以遍历它所管理的bean。
这是一个很自私(专注)的接口,他只管理自己的bean,不会管理继承的bean。如果需要对这两者同时管理的话,需要使用BeanFactoryUtils中的方法。什么是继承bean?这个就是面向对象中的封装,即一个类A中的有另一个类B的引用,类A的某些功能是由类B来完成的。

ListableBeanFactory的主要接口如下:

boolean containsBeanDefinition(String beanName);

int getBeanDefinitionCount();

String[] getBeanDefinitionNames();

String[] getBeanNamesForType(Class type);

Map getBeansOfType(Class type) throws BeansException;

从以上接口的名字也可以理解Listable的含义:
可以获取(列举)所有的BeanDefinition(bean定义,spring是使用BeanDefinition来代表一个bean的,在第一次获取单例类的bean的时候会根据BeanDefinition来创建bean,对于applicationcontext类来讲,会自动初始化这些非延迟加载的单例类),可以获取(列举)某一类的bean。

AutowireCapableBeanFactory

自动装配基础接口,定义了如下常量和方法:

int AUTOWIRE_NO = 0;

int AUTOWIRE_BY_NAME = 1;
....

Object createBean(Class beanClass) throws BeansException;

void autowireBean(Object existingBean) throws BeansException;

Object configureBean(Object existingBean, String beanName) throws BeansException;

Object resolveDependency(DependencyDescriptor descriptor, String beanName) throws BeansException;

Object initializeBean(Object existingBean, String beanName) throws BeansException;

Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException;

Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException;

主要是bean的初始化操作,例如执行init方法,各种aware接口的调用。

SingletonBeanRegistry

单例bean的注册接口,主要有以下方法:

void registerSingleton(String beanName, Object singletonObject);

Object getSingleton(String beanName);

boolean containsSingleton(String beanName);

String[] getSingletonNames();

int getSingletonCount();

HierarchicalBeanFactory

可以继承的beanfactory,即使用了面向对象中的封装模式(设计模式中的代理模式)。
主要提供了以下方法:

    BeanFactory getParentBeanFactory();

    boolean containsLocalBean(String name);

ConfigurableBeanFactory

可以配置的beanfactory,提供的方法比较多比较杂,主要是spring内部使用。
主要方法简单列举一二如下:

void setTempClassLoader(ClassLoader tempClassLoader);

// 我的理解是解析properties标签?TODO
void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);

void registerCustomEditor(Class requiredType, Class propertyEditorClass);
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

// 处理scpoe标签
void registerScope(String scopeName, Scope scope);

void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;

// 处理parent属性
BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

// 被依赖的beans
String[] getDependentBeans(String beanName);

// 获取bean的依赖,即dependson属性
String[] getDependenciesForBean(String beanName);

ConfigurableListableBeanFactory

相对于ConfigurableBeanFactory而言,ConfigurableListableBeanFactory提供了用来分析和修改BeanDefinition的方法。

void registerResolvableDependency(Class dependencyType, Object autowiredValue);

boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException;

BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

void freezeConfiguration();

void preInstantiateSingletons() throws BeansException;

AliasRegistry

别名注册器,主要方法:

void registerAlias(String name, String alias);

void removeAlias(String alias);

boolean isAlias(String beanName);

String[] getAliases(String name);

BeanDefinitionRegistry

这个接口提供了注册BeanDefinition的方法。主要方法有:

void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;

BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 1.1 spring IoC容器和beans的简介 Spring 框架的最核心基础的功能是IoC(控制反转)容器,...
    simoscode阅读 6,699评论 2 22
  • 什么是Spring Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Jav...
    jemmm阅读 16,439评论 1 133
  • 本来是准备看一看Spring源码的。然后在知乎上看到来一个帖子,说有一群**自己连Spring官方文档都没有完全读...
    此鱼不得水阅读 6,926评论 4 21
  • 1.1 Spring IoC容器和bean简介 本章介绍了Spring Framework实现的控制反转(IoC)...
    起名真是难阅读 2,567评论 0 8
  • 1, 经过这段时间的改变,孩子很多方面都有很大的突破,老师表扬孩子最近进步很大,上课会主动回答问题,非常积极。(这...
    hl越望越远阅读 111评论 0 0