目錄
?
AbstractBeanFactory的作用
源碼解析
屬性
獲取bean實(shí)例
Spring BeanFactory
Spring AbstractBeanFactory
Spring AbstractAutowireCapableBeanFactory
Spring DefaultListableBeanFactory
?
AbstractBeanFactory的作用
- BeanFactory接口實(shí)現(xiàn)的基類(lèi),同時(shí)實(shí)現(xiàn)了ConfigurableBeanFactory的SPI,提供了所有的功能
- 通過(guò)DefaultSingletonBeanRegistry實(shí)現(xiàn)單例bean的緩存,同時(shí)提供了單例和多例和別名的定義等操作.
- 通過(guò)name獲取bean定義,已經(jīng)通過(guò)bean定義創(chuàng)建實(shí)例的模板方法,具有由子類(lèi)AbstractAutowireCapableBeanFactory#createBean和DefaultListableBeanFactory#getBeanDefinition實(shí)現(xiàn)。
源碼解析
屬性
// 父類(lèi)容器
private BeanFactory parentBeanFactory;
// 類(lèi)加載器
private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();
// 臨時(shí)加載器
private ClassLoader tempClassLoader;
// bean的元數(shù)據(jù)緩存
private boolean cacheBeanMetadata = true;
// bean的表達(dá)式解析器
private BeanExpressionResolver beanExpressionResolver;
// 類(lèi)型轉(zhuǎn)換器
private ConversionService conversionService;
// 屬性編輯器
private final Set<PropertyEditorRegistrar> propertyEditorRegistrars = new LinkedHashSet<>(4);
// 類(lèi)的屬性編輯器
private final Map<Class<?>, Class<? extends PropertyEditor>> customEditors = new HashMap<>(4);
// 類(lèi)型轉(zhuǎn)換器
private TypeConverter typeConverter;
// 為嵌入的值(如注釋屬性)添加字符串解析器
private final List<StringValueResolver> embeddedValueResolvers = new CopyOnWriteArrayList<>();
// 后置處理器
private final List<BeanPostProcessor> beanPostProcessors = new CopyOnWriteArrayList<>();
// InstantiationAwareBeanPostProcessors是否已注冊(cè)
private volatile boolean hasInstantiationAwareBeanPostProcessors;
// DestructionAwareBeanPostProcessors是否已注冊(cè)
private volatile boolean hasDestructionAwareBeanPostProcessors;
// 作用域
private final Map<String, Scope> scopes = new LinkedHashMap<>(8);
// 提供安全作用域
private SecurityContextProvider securityContextProvider;
// 合并后的BeanDefinition
private final Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap<>(256);
// bean實(shí)例是否已創(chuàng)建
private final Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<>(256));
// 本地緩存,正在創(chuàng)建的多例bean。這邊用本地線(xiàn)程,是因?yàn)槠渌€(xiàn)程創(chuàng)建bean與當(dāng)前線(xiàn)程不沖突
private final ThreadLocal<Object> prototypesCurrentlyInCreation = new NamedThreadLocal<>("Prototype beans currently in creation");
?
customEditors 是自定義的屬性編輯器,適用于該beanFactory的所有bean。
propertyEditorRegistrars屬性編輯器的注冊(cè)器,使用于該beanFactory的所有bean。
beanPostProcessors 創(chuàng)建bean時(shí)應(yīng)用的beanPostProcessors。
hasInstantiationAwareBeanPostProcessors 表明是否注冊(cè)有任何的InstantiationAwareBeanPostProcessors。
hasDestructionAwareBeanPostProcessors表明是否注冊(cè)有任何的DestructionAwareBeanPostProcessors
scopes:域標(biāo)識(shí)符和對(duì)應(yīng)域的鍵值對(duì)集合。
securityContextProvider 運(yùn)行SecurityManager時(shí)使用的security context。
?
獲取bean實(shí)例
@Overridepublic Object getBean(String name) throws BeansException {return doGetBean(name, null, null, false);}@Overridepublic <T> T getBean(String name, Class<T> requiredType) throws BeansException {return doGetBean(name, requiredType, null, false);}@Overridepublic Object getBean(String name, Object... args) throws BeansException {return doGetBean(name, null, args, false);}public <T> T getBean(String name, @Nullable Class<T> requiredType, @Nullable Object... args)throws BeansException {return doGetBean(name, requiredType, args, false);}
最終調(diào)用的是doGetBean方法。
doGetBean有四個(gè)參數(shù):
- name:bean的名稱(chēng)
- requiredType: 返回的類(lèi)型
- args: 傳遞的構(gòu)造參數(shù)
- typeCheckOnly: 檢查類(lèi)型
protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {//如果是別名轉(zhuǎn)化為實(shí)際的name,如果是&開(kāi)頭的(所有的都去掉),去掉&再轉(zhuǎn)化別名。final String beanName = transformedBeanName(name);Object bean;// Eagerly check singleton cache for manually registered singletons.//獲取單例實(shí)例:DefaultSingletonBeanRegistry.getSingletonObject sharedInstance = getSingleton(beanName);//已經(jīng)創(chuàng)建了,且沒(méi)有構(gòu)造參數(shù),進(jìn)入這個(gè)方法,如果有構(gòu)造參數(shù),則根據(jù)構(gòu)造函數(shù)創(chuàng)建beanif (sharedInstance != null && args == null) {if (logger.isTraceEnabled()) {if (isSingletonCurrentlyInCreation(beanName)) {logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +"' that is not fully initialized yet - a consequence of a circular reference");}else {logger.trace("Returning cached instance of singleton bean '" + beanName + "'");}}// 如果是普通bean,直接返回,是FactoryBean,返回他的getObjectbean = getObjectForBeanInstance(sharedInstance, name, beanName, null);}else {// 沒(méi)創(chuàng)建過(guò)bean或者是多例的情況或者有參數(shù)的情況// 創(chuàng)建過(guò)Prototype的bean,會(huì)循環(huán)引用,拋出異常,單例才嘗試解決循環(huán)依賴(lài)的問(wèn)題if (isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}// 父容器存在,本地沒(méi)有當(dāng)前beanName,從父容器取BeanFactory parentBeanFactory = getParentBeanFactory();if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {// 如果名稱(chēng)以&開(kāi)頭,則beanName以&開(kāi)頭。String nameToLookup = originalBeanName(name);if (parentBeanFactory instanceof AbstractBeanFactory) {return ((AbstractBeanFactory) parentBeanFactory).doGetBean(nameToLookup, requiredType, args, typeCheckOnly);}else if (args != null) {// Delegation to parent with explicit args.return (T) parentBeanFactory.getBean(nameToLookup, args);}else if (requiredType != null) {// No args -> delegate to standard getBean method.return parentBeanFactory.getBean(nameToLookup, requiredType);}else {return (T) parentBeanFactory.getBean(nameToLookup);}}if (!typeCheckOnly) {// typeCheckOnly為false,將beanName放入alreadyCreated中markBeanAsCreated(beanName);}//以上沒(méi)有獲取到bean實(shí)例。try {//合并父子bean的定義final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);//檢查合并之后的bean的定義,必要時(shí)拋異常checkMergedBeanDefinition(mbd, beanName, args);//如果有依賴(lài)bean,先初始化當(dāng)前bean所依賴(lài)的beanString[] dependsOn = mbd.getDependsOn();if (dependsOn != null) {for (String dep : dependsOn) {//循環(huán)引用,拋出異常if (isDependent(beanName, dep)) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");}//注冊(cè)依賴(lài)的bean,registerDependentBean(dep, beanName);try {//生成bean實(shí)例。getBean(dep);}catch (NoSuchBeanDefinitionException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"'" + beanName + "' depends on missing bean '" + dep + "'", ex);}}}// 創(chuàng)造bean實(shí)例。if (mbd.isSingleton()) {//如果是單例,則調(diào)用createBean。(被子類(lèi)覆蓋的方法)sharedInstance = getSingleton(beanName, () -> {try {return createBean(beanName, mbd, args);}catch (BeansException ex) {//最后從緩存中移除對(duì)應(yīng)的實(shí)例原因有://1.每當(dāng)有bean在創(chuàng)建時(shí),允許循環(huán)參考來(lái)解析對(duì)應(yīng)的beanDefinition//2.刪除臨時(shí)引用該bean的beandestroySingleton(beanName);throw ex;}});bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}else if (mbd.isPrototype()) {// 多例,創(chuàng)建新的bean。Object prototypeInstance = null;try {beforePrototypeCreation(beanName);prototypeInstance = createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}else {//其他作用域。String scopeName = mbd.getScope();final Scope scope = this.scopes.get(scopeName);if (scope == null) {throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");}try {Object scopedInstance = scope.get(beanName, () -> {beforePrototypeCreation(beanName);try {return createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}});bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}catch (IllegalStateException ex) {throw new BeanCreationException(beanName,"Scope '" + scopeName + "' is not active for the current thread; consider " +"defining a scoped proxy for this bean if you intend to refer to it from a singleton",ex);}}}catch (BeansException ex) {cleanupAfterBeanCreationFailure(beanName);throw ex;}}//檢查類(lèi)型與實(shí)際的bean的是否匹配if (requiredType != null && !requiredType.isInstance(bean)) {try {T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);if (convertedBean == null) {throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}return convertedBean;}catch (TypeMismatchException ex) {if (logger.isTraceEnabled()) {logger.trace("Failed to convert bean '" + name + "' to required type '" +ClassUtils.getQualifiedName(requiredType) + "'", ex);}throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}}return (T) bean;}
?
超強(qiáng)干貨來(lái)襲 云風(fēng)專(zhuān)訪(fǎng):近40年碼齡,通宵達(dá)旦的技術(shù)人生
總結(jié)
以上是生活随笔為你收集整理的Spring AbstractBeanFactory的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。