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