日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring AbstractBeanFactory

發(fā)布時(shí)間:2024/4/13 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring AbstractBeanFactory 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

?

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ò),歡迎將生活随笔推薦給好友。