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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring AbstractBeanFactory

發布時間:2024/4/13 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring AbstractBeanFactory 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

AbstractBeanFactory的作用

源碼解析

屬性

獲取bean實例


Spring BeanFactory

Spring AbstractBeanFactory

Spring AbstractAutowireCapableBeanFactory

Spring DefaultListableBeanFactory

?

AbstractBeanFactory的作用

  • BeanFactory接口實現的基類,同時實現了ConfigurableBeanFactory的SPI,提供了所有的功能
  • 通過DefaultSingletonBeanRegistry實現單例bean的緩存,同時提供了單例和多例和別名的定義等操作.
  • 通過name獲取bean定義,已經通過bean定義創建實例的模板方法,具有由子類AbstractAutowireCapableBeanFactory#createBean和DefaultListableBeanFactory#getBeanDefinition實現。

源碼解析

屬性

// 父類容器 private BeanFactory parentBeanFactory; // 類加載器 private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); // 臨時加載器 private ClassLoader tempClassLoader; // bean的元數據緩存 private boolean cacheBeanMetadata = true; // bean的表達式解析器 private BeanExpressionResolver beanExpressionResolver; // 類型轉換器 private ConversionService conversionService; // 屬性編輯器 private final Set<PropertyEditorRegistrar> propertyEditorRegistrars = new LinkedHashSet<>(4); // 類的屬性編輯器 private final Map<Class<?>, Class<? extends PropertyEditor>> customEditors = new HashMap<>(4); // 類型轉換器 private TypeConverter typeConverter; // 為嵌入的值(如注釋屬性)添加字符串解析器 private final List<StringValueResolver> embeddedValueResolvers = new CopyOnWriteArrayList<>(); // 后置處理器 private final List<BeanPostProcessor> beanPostProcessors = new CopyOnWriteArrayList<>(); // InstantiationAwareBeanPostProcessors是否已注冊 private volatile boolean hasInstantiationAwareBeanPostProcessors; // DestructionAwareBeanPostProcessors是否已注冊 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實例是否已創建 private final Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<>(256)); // 本地緩存,正在創建的多例bean。這邊用本地線程,是因為其他線程創建bean與當前線程不沖突 private final ThreadLocal<Object> prototypesCurrentlyInCreation = new NamedThreadLocal<>("Prototype beans currently in creation");

?

customEditors 是自定義的屬性編輯器,適用于該beanFactory的所有bean。
propertyEditorRegistrars屬性編輯器的注冊器,使用于該beanFactory的所有bean。
beanPostProcessors 創建bean時應用的beanPostProcessors。
hasInstantiationAwareBeanPostProcessors 表明是否注冊有任何的InstantiationAwareBeanPostProcessors。
hasDestructionAwareBeanPostProcessors表明是否注冊有任何的DestructionAwareBeanPostProcessors
scopes:域標識符和對應域的鍵值對集合。
securityContextProvider 運行SecurityManager時使用的security context。

?

獲取bean實例

@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);}

最終調用的是doGetBean方法。

doGetBean有四個參數:

  • name:bean的名稱
  • requiredType: 返回的類型
  • args: 傳遞的構造參數
  • typeCheckOnly: 檢查類型
protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {//如果是別名轉化為實際的name,如果是&開頭的(所有的都去掉),去掉&再轉化別名。final String beanName = transformedBeanName(name);Object bean;// Eagerly check singleton cache for manually registered singletons.//獲取單例實例:DefaultSingletonBeanRegistry.getSingletonObject sharedInstance = getSingleton(beanName);//已經創建了,且沒有構造參數,進入這個方法,如果有構造參數,則根據構造函數創建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 {// 沒創建過bean或者是多例的情況或者有參數的情況// 創建過Prototype的bean,會循環引用,拋出異常,單例才嘗試解決循環依賴的問題if (isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}// 父容器存在,本地沒有當前beanName,從父容器取BeanFactory parentBeanFactory = getParentBeanFactory();if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {// 如果名稱以&開頭,則beanName以&開頭。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);}//以上沒有獲取到bean實例。try {//合并父子bean的定義final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);//檢查合并之后的bean的定義,必要時拋異常checkMergedBeanDefinition(mbd, beanName, args);//如果有依賴bean,先初始化當前bean所依賴的beanString[] dependsOn = mbd.getDependsOn();if (dependsOn != null) {for (String dep : dependsOn) {//循環引用,拋出異常if (isDependent(beanName, dep)) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");}//注冊依賴的bean,registerDependentBean(dep, beanName);try {//生成bean實例。getBean(dep);}catch (NoSuchBeanDefinitionException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"'" + beanName + "' depends on missing bean '" + dep + "'", ex);}}}// 創造bean實例。if (mbd.isSingleton()) {//如果是單例,則調用createBean。(被子類覆蓋的方法)sharedInstance = getSingleton(beanName, () -> {try {return createBean(beanName, mbd, args);}catch (BeansException ex) {//最后從緩存中移除對應的實例原因有://1.每當有bean在創建時,允許循環參考來解析對應的beanDefinition//2.刪除臨時引用該bean的beandestroySingleton(beanName);throw ex;}});bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}else if (mbd.isPrototype()) {// 多例,創建新的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;}}//檢查類型與實際的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;}

?

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的Spring AbstractBeanFactory的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。