专栏名称: 程序员大咖
为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。
目录
相关文章推荐
51好读  ›  专栏  ›  程序员大咖

向Spring大佬低头——大量源码流出解析

程序员大咖  · 公众号  · 程序员  · 2018-05-08 10:24

正文

请到「今天看啥」查看全文


postProcessBeanFactory(beanFactory);

//调用所有BeanFactoryProcessor的postProcessBeanFactory()方法
invokeBeanFactoryPostProcessors(beanFactory);

//注册BeanPostProcessor,BeanPostProcessor作用是用于拦截Bean的创建
registerBeanPostProcessors(beanFactory);

//初始化消息Bean
initMessageSource();

//初始化上下文的事件多播组建,ApplicationEvent触发时由multicaster通知给ApplicationListener
initApplicationEventMulticaster();

//ApplicationContext初始化一些特殊的bean
onRefresh();

//注册事件监听器,事件监听Bean统一注册到multicaster里头,ApplicationEvent事件触发后会由multicaster广播
registerListeners();

//非延迟加载的单例Bean实例化
finishBeanFactoryInitialization(beanFactory);

finishRefresh();
}

catch (BeansException ex) {
logger.warn( "Exception encountered during context initialization - cancelling refresh attempt" , ex);

destroyBeans();

cancelRefresh(ex);

throw ex;
}
}
}

代码逻辑清晰的值得mark一下。这个方法的作用是创建加载Spring容器配置(包括.xml配置,property文件和数据库模式等)。

BeanFactory体系结构是典型的工厂方法模式,即什么样的工厂生产什么样的产品。要知道工厂是如何产生对象的,我们需要看具体的IOC容器实现,具体的实现有:如 DefaultListableBeanFactory 、 XmlBeanFactory 、 ApplicationContext 等。那么,究竟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 getBean(String name, Class requiredType) throws BeansException;

    T getBean(Class 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);// 根据实例的名字获取实例的别名






请到「今天看啥」查看全文