加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

Spring源码解析 - BeanFactory接口体系分析

发布时间:2021-12-10 18:16:27 所属栏目:教程 来源:互联网
导读:不知道为什么看着Spring的源码,感触最深的是Spring对概念的抽象,所以我就先学接口了,BeanFactory是Spring IOC实现的基础,这边定义了一系列的接口,我们通过这些接口的学习,可以大致了解BeanFactory体系各接口如何分工合作。 为学习具体实现打下基础.毕竟这边
不知道为什么看着Spring的源码,感触最深的是Spring对概念的抽象,所以我就先学接口了,BeanFactory是Spring IOC实现的基础,这边定义了一系列的接口,我们通过这些接口的学习,可以大致了解BeanFactory体系各接口如何分工合作。
 
为学习具体实现打下基础.毕竟这边逻辑复杂,涉及的概念很多.
 
 
 
BeanFactory 是Spring bean容器的根接口.提供获取bean,是否包含bean,是否单例与原型,获取bean类型,bean 别名的api.
 
-- AutowireCapableBeanFactory 添加集成其他框架功能.如果集成WebWork则可以使用Spring对Actions等进行管理.
 
-- HierarchicalBeanFactory 提供父容器的访问功能
 
-- -- ConfigurableBeanFactory 如名,提供factory的配置功能,眼花缭乱好多api
 
-- -- -- ConfigurableListableBeanFactory 集大成者,提供解析,修改bean定义,并与初始化单例.
 
-- ListableBeanFactory 提供容器内bean实例的枚举功能.这边不会考虑父容器内的实例.
 
看到这边,我们是不是想起了设计模式原则里的接口隔离原则
 
 Interface Segregation Principle(ISP):客户端不应该依赖它不需要的接口;类间的依赖关系应该建立在最小的接口上
 
这边清晰地定义了如下的体系:
 
  根接口BeanFactory(基础容器)
 
  第二层: 第三方集成,继承体系,遍历bean
 
  第三层: 配置功能
 
  第四层: 配置+迭代
 
接下来具体分析下各个接口吧(顺便做目录):
 
1. BeanFactory
 
2. AutowireCapableBeanFactory
 
3. HierarchicalBeanFactory
 
4. ListableBeanFactory
 
5. ConfigurableBeanFactory
 
6. ConfigableListableBeanFactory
 
1. BeanFactory
 
BeanFactory是Spring bean容器的根接口.
 
每个bean都是通过string类型bean name进行标识.这边提供了设计模式单例,原型的替代实现.
 
如果bean name配置为单例,应用内只会获取到一个实例.如果配置为原型,那么可以实例化好后填充属性(基于用户的配置).
 
BeanFactory作为应用集中配置管理的地方,极大简便应用开发,这样开发人员可以集中与业务.
 
BeanFactory需要管理bean的生命周期,比如初始化时需要按顺序实现如下接口:
 
  1. BeanNameAware's {@code setBeanName}
  2. BeanClassLoaderAware's {@code setBeanClassLoader}
  3. BeanFactoryAware's {@code setBeanFactory}
  4. ResourceLoaderAware's {@code setResourceLoader}仅对application context有效
  5. ApplicationEventPublisherAware's {@code setApplicationEventPublisher}仅对application context有效
  6. MessageSourceAware's {@code setMessageSource}仅对application context有效
  7. ApplicationContextAware's {@code setApplicationContext}仅对application context有效
  8. ServletContextAware's {@code setServletContext}仅对application context有效
  9. {@code postProcessBeforeInitialization} methods of BeanPostProcessors
  10. InitializingBean's {@code afterPropertiesSet}
  11. a custom init-method definition xml中配置的init-method
  12. {@code postProcessAfterInitialization} methods of BeanPostProcessors
 
还有关闭容器的接口:
 
  1. DisposableBean's {@code destroy}
  2. a custom destroy-method definition xml配置中的destroy-method
 
接口里定义了一个变量String FACTORY_BEAN_PREFIX = "&";
 
  这是用来区分是获取FactoryBean还是FactoryBean的createBean创建的实例.如果&开始则获取FactoryBean;否则获取createBean创建的实例.
 
我们来看下定义的方法:
 
  a, 获取bean,这边可以实现单例,原型
 
    Object getBean(String name) throws BeansException; 可以用别名查找哦
 
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
 
    <T> T getBean(Class<T> requiredType) throws BeansException; 这边的类型可以是接口或者子类,但不能是null
 
    Object getBean(String name, Object... args) throws BeansException;
 
  b, 判断是否包含bean.陷阱出现:这边不管类是否抽象类,懒加载,是否在容器范围内,只要符合都返回true,所以这边true,不一定能从getBean获取实例
 
    boolean containsBean(String name);
 
  c, 单例,原型,bean类型的判断
 
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
 
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
 
    boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
 
  d, 获取bean 的类型,别名
 
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
 
    String[] getAliases(String name);
 
 
 
2. AutowireCapableBeanFactory
 
在BeanFactory基础上实现对已存在实例的管理.
 
可以使用这个接口集成其它框架,捆绑并填充并不由Spring管理生命周期并已存在的实例.像集成WebWork的Actions 和Tapestry Page就很实用.
 
一般应用开发者不会使用这个接口,所以像ApplicationContext这样的外观实现类不会实现这个接口,如果真手痒痒可以通过ApplicationContext的getAutowireCapableBeanFactory接口获取.
 
 
 
这边定义了5种自动装配策略:不注入AUTOWIRE_NO,使用bean name策略装配AUTOWIRE_BY_NAME,使用类型装配策略AUTOWIRE_BY_TYPE,使用构造器装配策略AUTOWIRE_CONSTRUCTOR,自动装配策略AUTOWIRE_AUTODETECT
 
  这边的自动策略是先尝试构造器,然后才是byType.这边应该是跟xml配置文件中的装配策略对应.
 
继续看定义的api:
 
  a, 创建和填充外部bean实例的典型方法
 
    <T> T createBean(Class<T> beanClass) throws BeansException;
 
    void autowireBean(Object existingBean) throws BeansException; // 使用autowireBeanProperties装配属性
 
    Object configureBean(Object existingBean, String beanName) throws BeansException; // 自动装配属性,填充属性值,使用诸如setBeanName,setBeanFactory这样的工厂回调填充属性,最好还要调用post processor
 
    Object resolveDependency(DependencyDescriptor descriptor, String beanName) throws BeansException;
 
  b, 在bean的生命周期进行细粒度控制的专门方法
 
    Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; // 会执行bean完整的初始化,包括BeanPostProcessors和initializeBean
 
    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;
 
    Object initializeBean(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, Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException;
 

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读