以接口肢解bean factory,源码没那么神秘

本来昨天在看 spring frame的八股, 看到了IOC部分,但是实在看不懂是什么东西,讲是讲源码部分,但又不完全讲,我想着那我要不自己看一下源码

这是我画的Bean Factory的大致关系图

以接口肢解bean factory,源码没那么神秘

删去了bean别名管理接口(AliasRegistry)和bean定义接口(BeanDefinitionRegistry)避免复杂理解

BeanFactory有三个子类ListableBeanFactoryHierarchicalBeanFactoryConfigurableBeanFactoryAutowireCapableBeanFactory

我们先来看看BeanFactory 只实现了IOC 容器的基本行为规范,好比是让需求方提出对目标的需求。

public interface BeanFactory { //与FactoryBean创建的bean区分开来, 若命名的bean是FactoryBean, //则获取将返回Factory,而不是Factory返回的实例。     String FACTORY_BEAN_PREFIX = "&";      Object getBean(String var1) throws BeansException;      <T> T getBean(String var1, Class<T> var2) throws BeansException;      Object getBean(String var1, Object... var2) throws BeansException;      <T> T getBean(Class<T> var1) throws BeansException;      <T> T getBean(Class<T> var1, Object... var2) throws BeansException;      <T> ObjectProvider<T> getBeanProvider(Class<T> var1);      <T> ObjectProvider<T> getBeanProvider(ResolvableType var1);      boolean containsBean(String var1);      boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;      boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;      boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;      boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;      @Nullable     Class<?> getType(String var1) throws NoSuchBeanDefinitionException;      @Nullable     Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;      String[] getAliases(String var1); }  

ListableBeanFactory 定义了Factory Bean的可枚举性,适用于批量操作 bean 的场景

public interface ListableBeanFactory extends BeanFactory {     boolean containsBeanDefinition(String var1);      int getBeanDefinitionCount();      String[] getBeanDefinitionNames();      <T> ObjectProvider<T> getBeanProvider(Class<T> var1, boolean var2);      <T> ObjectProvider<T> getBeanProvider(ResolvableType var1, boolean var2);      String[] getBeanNamesForType(ResolvableType var1);      String[] getBeanNamesForType(ResolvableType var1, boolean var2, boolean var3);      String[] getBeanNamesForType(@Nullable Class<?> var1);      String[] getBeanNamesForType(@Nullable Class<?> var1, boolean var2, boolean var3);      <T> Map<String, T> getBeansOfType(@Nullable Class<T> var1) throws BeansException;      <T> Map<String, T> getBeansOfType(@Nullable Class<T> var1, boolean var2, boolean var3) throws BeansException;      String[] getBeanNamesForAnnotation(Class<? extends Annotation> var1);      Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> var1) throws BeansException;      @Nullable     <A extends Annotation> A findAnnotationOnBean(String var1, Class<A> var2) throws NoSuchBeanDefinitionException;      @Nullable     <A extends Annotation> A findAnnotationOnBean(String var1, Class<A> var2, boolean var3) throws NoSuchBeanDefinitionException; } 

HierarchicalBeanFactory 定义了Bean Factory的分层能力

之前还不知道Bean Factory可以有父子容器区分
与继承相似,子类可以调用父类的方法。父类不能调用子类的方法

Spring MVC 有以下分层

  • 根上下文(ContextLoaderListener 或 Spring Boot 创建)作为父容器。

如服务层、数据访问层和基础设施 bean(DataSource)。

  • DispatcherServlet 的上下文作为子容器。

定义 Web 层特定 bean,如控制器、HandlerMapping 等。

public interface HierarchicalBeanFactory extends BeanFactory {     @Nullable     BeanFactory getParentBeanFactory();      boolean containsLocalBean(String var1); } 

ConfigurableBeanFactory 定义了自定义Bean工厂的能力 , 自定义类加载器、beany定义、作用域、依赖关系。

 public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {     // 自定义类加载器     void setBeanClassLoader(@Nullable ClassLoader var1);     @Nullable     ClassLoader getBeanClassLoader();     void setTempClassLoader(@Nullable ClassLoader var1);     @Nullable     ClassLoader getTempClassLoader();      // bean 定义     void setCacheBeanMetadata(boolean var1);     boolean isCacheBeanMetadata();     BeanDefinition getMergedBeanDefinition(String var1) throws NoSuchBeanDefinitionException;     boolean isFactoryBean(String var1) throws NoSuchBeanDefinitionException;      // 作用域     void registerScope(String var1, Scope var2);     String[] getRegisteredScopeNames();     @Nullable     Scope getRegisteredScope(String var1);      // 依赖关系     void registerDependentBean(String var1, String var2);     String[] getDependentBeans(String var1);     String[] getDependenciesForBean(String var1);          ......     ...... } 

AutowireCapableBeanFactory 实现了Bean自动装配能力

public interface AutowireCapableBeanFactory extends BeanFactory {     int AUTOWIRE_NO = 0;     int AUTOWIRE_BY_NAME = 1;     int AUTOWIRE_BY_TYPE = 2;     int AUTOWIRE_CONSTRUCTOR = 3;     /** @deprecated */     @Deprecated     int AUTOWIRE_AUTODETECT = 4;     String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL";      <T> T createBean(Class<T> var1) throws BeansException;      void autowireBean(Object var1) throws BeansException;      Object configureBean(Object var1, String var2) throws BeansException;      Object createBean(Class<?> var1, int var2, boolean var3) throws BeansException;      Object autowire(Class<?> var1, int var2, boolean var3) throws BeansException;      void autowireBeanProperties(Object var1, int var2, boolean var3) throws BeansException;      void applyBeanPropertyValues(Object var1, String var2) throws BeansException;      Object initializeBean(Object var1, String var2) throws BeansException;      Object applyBeanPostProcessorsBeforeInitialization(Object var1, String var2) throws BeansException;      Object applyBeanPostProcessorsAfterInitialization(Object var1, String var2) throws BeansException;      void destroyBean(Object var1);      <T> NamedBeanHolder<T> resolveNamedBean(Class<T> var1) throws BeansException;      Object resolveBeanByName(String var1, DependencyDescriptor var2) throws BeansException;      @Nullable     Object resolveDependency(DependencyDescriptor var1, @Nullable String var2) throws BeansException;      @Nullable     Object resolveDependency(DependencyDescriptor var1, @Nullable String var2, @Nullable Set<String> var3, @Nullable TypeConverter var4) throws BeansException; }  

看完了这些接口类和接口方法,对IOC容器有了更扩展一些的理解

其实源码还是挺容易看的,先通过一个类向上找到基类,再往下看详细的接口类,实现类。 对其有一个全局的理解

发表评论

评论已关闭。

相关文章