本來昨天在看 spring frame的八股, 看到了IOC部分,但是實在看不懂是什么東西,講是講源碼部分,但又不完全講,我想著那我要不自己看一下源碼
這是我畫的Bean Factory的大致關系圖

刪去了bean別名管理接口(AliasRegistry)和bean定義接口(BeanDefinitionRegistry)避免復雜理解
BeanFactory有三個子類ListableBeanFactory ,HierarchicalBeanFactory,ConfigurableBeanFactory ,AutowireCapableBeanFactory 。
我們先來看看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容器有了更擴展一些的理解
其實源碼還是挺容易看的,先通過一個類向上找到基類,再往下看詳細的接口類,實現類。 對其有一個全局的理解
浙公網安備 33010602011771號