[转]spring的BeanFactory跟ApplicationContext接口(一)
版本:spring-framework-3.0.5.RELEASE
Spring的最核心的部分就是BeanFactory了,当然我们现在很少直接使用这个类而是通过ApplicationContext来使用了,本篇我们就对BeanFactory接口的核心方法、BeanFactory的子接口及其实现类以及ApplicationContext相关做一个详细的分析和了解。关于实现代码牵扯到的东西太多了,这里只分析接口的功能及继承关系,暂时不做实现类的分析。
一、我们首先看下BeanFactory接口的代码:
public interface BeanFactory { String FACTORY_BEAN_PREFIX = "&"; 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); }
- 首先第2行是一个字符串常量,值为"&",这个是用在FactoryBean那部分,假如有一个FactoryBean的name=foo,则使用name=&foo去取bean对象的时候取到的就是foo的工厂而不是foo本身。
- 第4行根据bean的name去查找bean,在当前BeanFactory查找不到的时候会去查找parent的BeanFactory,返回为一个Object对象需用户自行转换其原本的类型。
- 第5行也是根据name查找bean,但是多了一个参数requiredType,查找bean并要求结果符合这个类型,如果requiredType为null,则同上个方法一样只根据name查找,另外这里使用了泛型,返回对象类型会直接是requiredType。
- 第6行是根据requiredType查找bean,查找一个符合这个类型的bean,同样返回类型为requiredType。
- 第7行根据name查找bean,同时有一个参数组args,这个主要是用来给给工厂类创建bean对象的时候调用的,所以如果args不为空则意味着这里查找的是一个prototype的bean。
- 第9-12行分别是几个判断方法:判断是否存在bean;是否是单例bean;是否是prototype的bean,bean是否符合类型requiredType。
- 第13行是根据bean的name获取bean的类型。
- 最后是根据bean的name获取指向该bean的所有别名,如果输入的name本身就是别名,那返回的将包括bean的最初name,并且这个name在返回的数组中第一个元素。
二、现在我们看下BeanFactory的子接口
BeanFactory一共有3个子接口一个实现类,其中实现类SimpleJndiBeanFactory主要是jndi相关,我们这里暂不讨论,下面看3个接口
2.1、HierarchicalBeanFactory接口:主要定义BeanFactory的分层的支撑,所谓分层也就是parentBeanFactory概念
2.1.1、首先看下代码:
public interface HierarchicalBeanFactory extends BeanFactory { BeanFactory getParentBeanFactory(); boolean containsLocalBean(String name); }
2.1.2、这个接口有两个子接口:ApplicationContext和ConfigurableBeanFactory,关于这两个子接口下面独立做分析,因为他们已经不只是HierarchicalBeanFactory的子接口了。
2.2、ListableBeanFactory接口:主要是获取bean的定义和配置信息相关的支撑接口
2.2.1、代码如下:
public interface ListableBeanFactory extends BeanFactory { boolean containsBeanDefinition(String beanName); int getBeanDefinitionCount(); String[] getBeanDefinitionNames(); String[] getBeanNamesForType(Class type); String[] getBeanNamesForType(Class type, boolean includeNonSingletons, boolean allowEagerInit); <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException; <T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException; Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException; <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType); }
- containsBeanDefinition()方法判断是否存在指定beanName的定义信息
- getBeanDefinitionCount()获取bean定义的总数
- getBeanDefinitionNames()获取所有bean定义的name数组
- getBeanNamesForType()获取所有指定类型的bean的name数组
- 第2个getBeanNamesForType()方法多了两个参数,可以指定是否包含单例,是否渴望初始化
- 两个getBeansOfType()和getBeanNamesForType()的参数一样,只不过这个返回的是name为key,bean对象为value的map集合
- getBeansWithAnnotation()方法获取包含指定注解annotationType所有bean的map集合
- 最后findAnnotationOnBean()方法获取指定beanName的指定注解的注解信息对象
2.1.2、这个接口有两个子接口:ApplicationContext和ConfigurableListableBeanFactory,关于这两个子接口同样放到下面独立做分析。
注:该接口还有一个静态实现类StaticListableBeanFactory,没发现哪里在使用,代码上也很简单就是把bean的定义放到一个map集合beans里面,实现一个基本的本接口功能,暂不做分析。
2.3、AutowireCapableBeanFactory接口:主要是spring的自动装配相关功能支撑接口
2.3.1、代码如下:
public interface AutowireCapableBeanFactory extends BeanFactory { int AUTOWIRE_NO = 0; int AUTOWIRE_BY_NAME = 1; int AUTOWIRE_BY_TYPE = 2; int AUTOWIRE_CONSTRUCTOR = 3; int AUTOWIRE_AUTODETECT = 4; <T> T createBean(Class<T> beanClass) throws BeansException; Object createBean(Class beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; Object configureBean(Object existingBean, String beanName) throws BeansException; Object initializeBean(Object existingBean, String beanName) throws BeansException; Object autowire(Class beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; void autowireBean(Object existingBean) throws BeansException; void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck) throws BeansException; void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException; Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException; Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException; Object resolveDependency(DependencyDescriptor descriptor, String beanName) throws BeansException; Object resolveDependency(DependencyDescriptor descriptor, String beanName, Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException; }
这个接口的主要实现代码都在AbstractAutowireCapableBeanFactory类中,暂时也没有发现其他地方用到这个接口,查看这些方法的实现可以去看这个类。
- 首先是5个常量代表自动装配的类型:不自动装配、按name、按类型、根据自省完全自动装配(不推荐,已在3.0中过时)。
- 两个创建Bean的方法,一个是根据类型,另外一个多了两个参数自动装配类型和是否检查依赖
- configureBean()是一个用来主动的配置装配的,就是在需要的时候把existingBean自动装配给beanName对应的bean
- initializeBean()是bean的初始化方法在这里主要调用了几个工厂级回调(BeanNameAware、BeanClassLoaderAware和BeanFactoryAware),并处理了所有BeanPostProcessor的两个调用
- autowire()方法创建一个类型为beanClass的bean对象,并根据自动装配类型autowireMode进行自动装配,dependencyCheck则代表是否做依赖检查
- autowireBean()方法暂时没有很清楚,只知道和普通的按name按类型装配不同,和注解相关,以后分析清楚了再补充。
- autowireBeanProperties方法()和上面的方法类似,只不过省略了bean创建的步骤,直接穿入一个bean对象进行自动装配
- applyBeanPropertyValues()应用bean定义中明确定义的属性值,区别于autowireBeanProperties(会装配所有属性)。
- applyBeanPostProcessorsBeforeInitialization()和applyBeanPostProcessorsAfterInitialization()两个方法处理BeanPostProcessor的两种回调,上面的initializeBean()方法的实现中就是调用这两个
- 两个resolveDependency()方法也没有搞清楚,是跟bean的依赖相关的,以后清楚了再补充。
2.3.2、这个接口的继承结构也很清晰,一个子接口ConfigurableListableBeanFactory,一个实现类AbstractAutowireCapableBeanFactory。
转自http://www.sandzhang.com/
相关推荐
- SpringBoot启动流程及其原理 Spring Boot、Spring MVC 和 Spring 有什么区别? 一 springboot启动原理及相关流程概览 二 springboot的启动类入口 三 单单是SpringBootApplication接口用到了这些注解 四 springboot启动流程概览图 五 深入探索SpringApplication执行流程 简单了解下Bean的生命周期 BeanFactory 和ApplicationContext的区别 SpringMVC处理请求的流程 BEANFACTORY和FACTORYBEAN的区别与联系 Bean的循环依赖 同一个类中调用 @Transaction注解的方法会有事务效果吗?
- 转的一篇关于接口跟抽象类区别的文章
- spring之BeanFactory BeanFactory spring的IOC容器能够帮我们自动new对象,对象交给spring管之后我们不用自己手动去new对象了。那么它的原理是什么呢?是怎么实现的呢?下面我来简单的模拟一下spring的机制,相信看完之后就会对spring的原理有一定的了解。spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。我们一般都不直接用BeanFactory,而是用它的实现类ApplicationContext,这个类会自动解析我们配置的applicationContext.xml,然后根据我们配置的bean来new对象,将new好的对象放进一个Map中,键就是我们bean的id,值就是new的对象。 BeanFactory 管理 Bean(组件)的生命周期 Bean 的定义
- Spring的原理性总结 一、Bean的生命过程 二、BeanFactory 接口和 ApplicationContext 接口有什么区别 ? 三、Bean的加载方式: 四、请介绍一下Spring框架中Bean的作用域 五、Bean注入属性有哪几种方式? 六、Spring的核心类有哪些,各有什么作用? 七、Spring里面如何配置数据库驱动? 八、Spring里面applicationContext.xml文件能不能改成其他文件名? 九、Spring如何处理线程并发问题? 十、为什么要有事物传播行为? 十一、介绍一下Spring的事物管理
- [转]spring的BeanFactory跟ApplicationContext接口(一)
- Spring学习总结(6)——Spring之核心容器bean 一、Bean的基础知识 二、bean的生命周期 三、Beanfactory中bean生命周期实例 四、ApplicationContext与beanfactory的区别
- 一步一步学习spring(2)——ApplicationContext和BeanFactory的区别
- (一) Spring的BeanFactory和ApplicationContext接口的层次关系
- Spring ApplicationContext下的一连串aware接口的调用
- springboot自动装配原理【超详细】(转载) SpringBoot启动原理精简版 Spring Boot、Spring MVC 和 Spring 有什么区别? 一 springboot启动原理及相关流程概览 二 springboot的启动类入口 三 单单是SpringBootApplication接口用到了这些注解 四 springboot启动流程概览图 五 深入探索SpringApplication执行流程 简单了解下Bean的生命周期 BeanFactory 和ApplicationContext的区别 SpringMVC处理请求的流程 BEANFACTORY和FACTORYBEAN的区别与联系 Bean的循环依赖 @Import注解介绍 同一个类中调用 @Transaction注解的方法会有事务效果吗? 来源
- #1241 - Operand should contain 一 column(s)
- jsp页面导出封存word或Excel几种方法及个人总结