博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring-BeanFactory的各项实现
阅读量:4144 次
发布时间:2019-05-25

本文共 10128 字,大约阅读时间需要 33 分钟。

咱们直接看一下AbstractBeanFactory的继承和实现结构:

继承结构大体描述一下:AbstractBeanFactory功能结构主要有两部分,1.实现了BeanFactory相关的功能,2.实现了别名,单列注册以及工厂支持.
BeanFactory相关接口前面已经描述过,这里不再重复,接下来看一下2)部分:
1.AliasRegistry别名注册

//给指定的bean注册别名	void registerAlias(String name, String alias);	//移除别名	void removeAlias(String alias);	//别名判断	boolean isAlias(String name);	//获取所有的别名	String[] getAliases(String name);

2.SimpleAliasRegistry别名注册的简单实现类,核心结构如下:

//别名map,键是别名,值是name	private final Map
aliasMap = new ConcurrentHashMap<>(16);

3.SingletonBeanRegistry单例bean注册支持

void registerSingleton(String beanName, Object singletonObject);	Object getSingleton(String beanName);	boolean containsSingleton(String beanName);	String[] getSingletonNames();	int getSingletonCount();	//注册单例的锁,同步对单例结构的更改	Object getSingletonMutex();

4.DefaultSingletonBeanRegistry对单列注册的结构性实现

看一下核心结构:

/** Cache of singleton objects: bean name to bean instance. */所有的单列都存储在这个map中	private final Map
singletonObjects = new ConcurrentHashMap<>(256); /** Cache of singleton factories: bean name to ObjectFactory. */单列对象的创建工厂 private final Map
> singletonFactories = new HashMap<>(16); /** Cache of early singleton objects: bean name to bean instance. */正在创建中的bean private final Map
earlySingletonObjects = new HashMap<>(16); /** Set of registered singletons, containing the bean names in registration order. */按注册顺序的所有注册beanname的集合 private final Set
registeredSingletons = new LinkedHashSet<>(256); /** Names of beans that are currently in creation. */当前正在创建中的bean private final Set
singletonsCurrentlyInCreation = Collections.newSetFromMap(new ConcurrentHashMap<>(16)); /** Names of beans currently excluded from in creation checks. */排除在创建检查之外的beanname private final Set
inCreationCheckExclusions = Collections.newSetFromMap(new ConcurrentHashMap<>(16)); /** List of suppressed Exceptions, available for associating related causes. */ @Nullable private Set
suppressedExceptions; /** Flag that indicates whether we're currently within destroySingletons. */ private boolean singletonsCurrentlyInDestruction = false; /** Disposable bean instances: bean name to disposable instance. */需要执行destroy接口的bean的map private final Map
disposableBeans = new LinkedHashMap<>(); /** Map between containing bean names: bean name to Set of bean names that the bean contains. */描述了bean和内部bean之间关系 private final Map
> containedBeanMap = new ConcurrentHashMap<>(16); /** Map between dependent bean names: bean name to Set of dependent bean names. */描述了当前bean被那些bean依赖的关系 private final Map
> dependentBeanMap = new ConcurrentHashMap<>(64); /** Map between depending bean names: bean name to Set of bean names for the bean's dependencies. */描述了bean和依赖bean之间的关系 private final Map
> dependenciesForBeanMap = new ConcurrentHashMap<>(64);

5.FactoryBeanRegistrySupport工厂支持bean

看一下核心结构:

/** Cache of singleton objects created by FactoryBeans: FactoryBean name to object. */private final Map
factoryBeanObjectCache = new ConcurrentHashMap<>(16);

6.AbstractBeanFactory第一个带有BeanFactory结尾的抽象类,基本成型,先来了解一下他的核心结构:

/** Parent bean factory, for bean inheritance support. */垂直工程结构的支持	@Nullable	private BeanFactory parentBeanFactory;	/** ClassLoader to resolve bean class names with, if necessary. */类加载器	@Nullable	private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();	/** ClassLoader to temporarily resolve bean class names with, if necessary. */一般在lwt中使用	@Nullable	private ClassLoader tempClassLoader;	/** Whether to cache bean metadata or rather reobtain it for every access. */是否缓存bean的元数据,不缓存的话每次创建bean都会重新加载bean的定义	private boolean cacheBeanMetadata = true;	/** Resolution strategy for expressions in bean definition values. */表达式解析spel	@Nullable	private BeanExpressionResolver beanExpressionResolver;	/** Spring ConversionService to use instead of PropertyEditors. */类型安全转换服务	@Nullable	private ConversionService conversionService;	/** Custom PropertyEditorRegistrars to apply to the beans of this factory. */属性注册	private final Set
propertyEditorRegistrars = new LinkedHashSet<>(4); /** Custom PropertyEditors to apply to the beans of this factory. */定制的属性编辑器 private final Map
, Class
> customEditors = new HashMap<>(4); /** A custom TypeConverter to use, overriding the default PropertyEditor mechanism. */类型转换 @Nullable private TypeConverter typeConverter; /** String resolvers to apply e.g. to annotation attribute values. */值解析 private final List
embeddedValueResolvers = new CopyOnWriteArrayList<>(); /** BeanPostProcessors to apply in createBean. */各种BeanPostProcessor集合 private final List
beanPostProcessors = new CopyOnWriteArrayList<>(); /** Indicates whether any InstantiationAwareBeanPostProcessors have been registered. */是否有实例化BeanPost后置处理器 private volatile boolean hasInstantiationAwareBeanPostProcessors; /** Indicates whether any DestructionAwareBeanPostProcessors have been registered. */是否有DestructionAwareBeanPostProcessors 后置处理器 private volatile boolean hasDestructionAwareBeanPostProcessors; /** Map from scope identifier String to corresponding Scope. */各种scope private final Map
scopes = new LinkedHashMap<>(8); /** Security context used when running with a SecurityManager. */ @Nullable private SecurityContextProvider securityContextProvider; /** Map from bean name to merged RootBeanDefinition. */合并后的bean定义map private final Map
mergedBeanDefinitions = new ConcurrentHashMap<>(256); /** Names of beans that have already been created at least once. */已经创建的bean的合集 private final Set
alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<>(256)); /** Names of beans that are currently in creation. */正在创建的原型 private final ThreadLocal
prototypesCurrentlyInCreation = new NamedThreadLocal<>("Prototype beans currently in creation");

7.AutowireCapableBeanFactory可注入bean工厂

T createBean(Class
beanClass) throws BeansException; void autowireBean(Object existingBean) throws BeansException; Object configureBean(Object existingBean, String beanName) throws BeansException; Object createBean(Class
beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; 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; void destroyBean(Object existingBean);
NamedBeanHolder
resolveNamedBean(Class
requiredType) throws BeansException; Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException; Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName, @Nullable Set
autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException;}

讲一个bean工厂转换成,该结构后可以单独使用手动创建bean,自动注入字段等功能.

8.DefaultListableBeanFactory默认可枚举工厂,默认的ApplicationContext创建的就是这个对象,通过他可以

简单的描述一下他的结构:

/** Map from serialized id to factory instance. */	private static final Map
> serializableFactories = new ConcurrentHashMap<>(8); /** Optional id for this factory, for serialization purposes. */ @Nullable private String serializationId; /** Whether to allow re-registration of a different definition with the same name. */ private boolean allowBeanDefinitionOverriding = true; /** Whether to allow eager class loading even for lazy-init beans. */ private boolean allowEagerClassLoading = true; /** Optional OrderComparator for dependency Lists and arrays. */ @Nullable private Comparator
dependencyComparator; /** Resolver to use for checking if a bean definition is an autowire candidate. */ private AutowireCandidateResolver autowireCandidateResolver = new SimpleAutowireCandidateResolver(); /** Map from dependency type to corresponding autowired value. */可解析的依赖 private final Map
, Object> resolvableDependencies = new ConcurrentHashMap<>(16); /** Map of bean definition objects, keyed by bean name. */bean定义表 private final Map
beanDefinitionMap = new ConcurrentHashMap<>(256); /** Map of singleton and non-singleton bean names, keyed by dependency type. */ private final Map
, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64); /** Map of singleton-only bean names, keyed by dependency type. */ private final Map
, String[]> singletonBeanNamesByType = new ConcurrentHashMap<>(64); /** List of bean definition names, in registration order. */ private volatile List
beanDefinitionNames = new ArrayList<>(256); /** List of names of manually registered singletons, in registration order. */ private volatile Set
manualSingletonNames = new LinkedHashSet<>(16); /** Cached array of bean definition names in case of frozen configuration. */ @Nullable private volatile String[] frozenBeanDefinitionNames; /** Whether bean definition metadata may be cached for all beans. */ private volatile boolean configurationFrozen = false;

9.BeanDefinitionRegistry接口,所有的bean的定义都是通过这里的api注入到beanfactory中,常见的有解析xml配置或注解配置,然后注入到bean工厂中,看一下他的接口视图:

void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)			throws BeanDefinitionStoreException;		void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;		BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;		boolean containsBeanDefinition(String beanName);		String[] getBeanDefinitionNames();		int getBeanDefinitionCount();	boolean isBeanNameInUse(String beanName);

下一节,我们一起看一下ApplicationContext的结构,然后进行一些必要的实践,加深对运行过程中,各个结构如何协调工作,具体存储数据的视图.

转载地址:http://fduti.baihongyu.com/

你可能感兴趣的文章
实验3-1 赋值操作符
查看>>
实验3-2 算术操作符
查看>>
实验3-3 强制类型转换和自增自减操作符
查看>>
实验3-4 函数的使用
查看>>
实验3-5 编程初步
查看>>
实验4-1 逻辑量的编码和关系操作符
查看>>
实验4-2 逻辑表达式
查看>>
实验4-3 if结构的初步
查看>>
实验4-4 if结构的分析
查看>>
实验4-6 选择结构的嵌套
查看>>
实验4-7 条件操作符
查看>>
实验4-8 switch结构
查看>>
实验4-9 综合练习
查看>>
实验4-10 用if结构求1+2+…+n(n<=10)的值
查看>>
实验5-1 while循环结构
查看>>
实验5-2 for循环结构
查看>>
实验5-3 break语句和continue语句
查看>>
实验5-4 循环的嵌套
查看>>
实验5-5 循环的合并
查看>>
实验5-6 do-while循环结构
查看>>