1. 程式人生 > >Spring系列之Alias標籤的解析與使用

Spring系列之Alias標籤的解析與使用

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context.xsd"
>

<alias name="resourceHolder" alias="resourceHolder1"/> <alias name="resourceHolder" alias="resourceHolder2"/> <alias name="resourceHolder" alias="resourceHolder3"/> <bean id="resourceHolder" class="com.zk.demo1025.ResourceHolder"> <property name="resource"
value="classpath:com/zk/demo1025/applicationContext.xml"></property> </bean> </beans>

DefaultBeanDefinitionDocumentReader類中的processAliasRegistration()方法:

    /**
     * Process the given alias element, registering the alias with the registry.
   * 處理alias元素,並且註冊到註冊器中
*/ protected
void processAliasRegistration(Element ele) { String name = ele.getAttribute(NAME_ATTRIBUTE);得到name值 String alias = ele.getAttribute(ALIAS_ATTRIBUTE);得到 alias值 boolean valid = true; if (!StringUtils.hasText(name)) { getReaderContext().error("Name must not be empty", ele); valid = false; } if (!StringUtils.hasText(alias)) { getReaderContext().error("Alias must not be empty", ele); valid = false; } if (valid) { try { getReaderContext().getRegistry().registerAlias(name, alias);//這裡實際執行的是SimpleAliasRegistry中的registerAlias()方法 } catch (Exception ex) { getReaderContext().error("Failed to register alias '" + alias + "' for bean with name '" + name + "'", ele, ex); } getReaderContext().fireAliasRegistered(name, alias, extractSource(ele)); } }
SimpleAliasRegistry中的registerAlias()方法:最終放入HashMap中。
    private final Map<String, String> aliasMap = new ConcurrentHashMap<>(16);


    @Override
    public void registerAlias(String name, String alias) {synchronized (this.aliasMap) {
            if (alias.equals(name)) {
                this.aliasMap.remove(alias); 如果別名與名字相同,則在Map中移除
            }
            else {
                String registeredName = this.aliasMap.get(alias);
                if (registeredName != null) {
                    if (registeredName.equals(name)) { 如果相同,則無動於衷
                        return;
                    }
                }
                checkForAliasCircle(name, alias);檢查別名迴環
                this.aliasMap.put(alias, name);放入Map中,key是alias,value是name
            }
        }
    }

接下來是取值:AbstractBeanFactory介面的getAlias()方法:

    @Override
    public String[] getAliases(String name) {
        String beanName = transformedBeanName(name);轉換名字,這個方法與FactoryBean字首,別名轉換為真名有關
        List<String> aliases = new ArrayList<>();
        boolean factoryPrefix = name.startsWith(FACTORY_BEAN_PREFIX);是否是FactoryBean
        String fullBeanName = beanName;
        if (factoryPrefix) {
            fullBeanName = FACTORY_BEAN_PREFIX + beanName;
        }
        if (!fullBeanName.equals(name)) {
            aliases.add(fullBeanName);
        }
        String[] retrievedAliases = super.getAliases(beanName);去父類中aliasMap取值
        for (String retrievedAlias : retrievedAliases) {
            String alias = (factoryPrefix ? FACTORY_BEAN_PREFIX : "") + retrievedAlias;
            if (!alias.equals(name)) {
                aliases.add(alias);
            }
        }
        if (!containsSingleton(beanName) && !containsBeanDefinition(beanName)) {
            BeanFactory parentBeanFactory = getParentBeanFactory();
            if (parentBeanFactory != null) {
                aliases.addAll(Arrays.asList(parentBeanFactory.getAliases(fullBeanName)));
            }
        }
        return StringUtils.toStringArray(aliases);
    }

相關推薦

Spring系列Alias標籤解析使用

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema

Spring系列手寫註解配置檔案的解析

目錄 Spring系列之IOC的原理及手動實現 Spring系列之DI的原理及手動實現 Spring系列之AOP的原理及手動實現 引入 在前面我們已經完成了IOC,DI,AOP的實現,基本的功能都已經完成了,我們的手寫框架也能勉強使用起來。為了讓我們的框架能夠使用起來比較簡單,這一節我

【認證授權】Spring Security系列認證流程解析

> 上面我們一起開始了Spring Security的初體驗,並通過簡單的配置甚至零配置就可以完成一個簡單的認證流程。可能我們都有很大的疑惑,這中間到底發生了什麼,為什麼簡單的配置就可以完成一個認證流程啊,可我啥都沒看見,沒有寫頁面,沒有寫介面。這一篇我們將深入到原始碼層面一起來了解一下spring secu

Spring系列beanFactoryApplicationContext

初始化 緩存 arc 等待 管理bean 核心 畫的 ssi alias 一、BeanFactoryBeanFactory 是 Spring 的“心臟”。它就是 Spring IoC 容器的真面目。Spring 使用 BeanFactory 來實例化、配置和管理 Bean。

Spring Security4.0.3原始碼分析http標籤解析

最近在學習安全框架Spring Security,想弄清楚其中實現的具體步驟,於是下定決心,研究一下Spring Security原始碼,這篇部落格的目的是想把學習過程記錄下來。學習過程中主要參考了http://dead-knight.iteye.com/cat

Spring系列——springboot解析resources.application.properties文件

new created turn code component html cal onf closed   摘要:本文通過講解如何解析application.properties屬性,介紹了幾個註解的運用@Value @ConfigurationProperties @En

spring原始碼深度解析— IOC 預設標籤解析(上)

概述 接前兩篇文章  spring原始碼深度解析—Spring的整體架構和環境搭建  和  spring原始碼深度解析— IOC 之 容器的基本實現 本文主要研究Spring標籤的解析,Spring的標籤中有預設標籤和自定義標籤,兩

spring原始碼深度解析— IOC 預設標籤解析(下)

在spring原始碼深度解析— IOC 之 預設標籤解析(上)中我們已經完成了從xml配置檔案到BeanDefinition的轉換,轉換後的例項是GenericBeanDefinition的例項。本文主要來看看標籤解析剩餘部分及BeanDefinition的註冊。 預設標籤中的自定義標籤解析

Spring Security系列極速入門實踐教程

@[TOC](Spring Security系列之極速入門與實踐教程) ### 1. Spring Security Spring Security 是 Spring 家族中的一個安全管理框架,應用程式的兩個主要區域是“認證”和“授權”(或者訪問控制)。Spring Security是針對Spring專案的

2Python全棧系列Tornado的CookieSess

requestPython全棧之路系列之Tornado的Cookie與Sess主要的代碼結構為:#!/usr/bin/env python # _*_coding:utf-8 _*_ import tornado.ioloop import tornado.web class MainHandler(to

MongoDB初探系列四:MongoDBJava共舞

ever 文件 basic query find man mongodb next() 入學 因為版本號不同,可能API也有所不同。本次學習用的是3.0版本號。 1、使用的mongodb的jdbc驅動版本號為:mongo-java-driver-3.0.0.jar

Spring系列AOP

-a cte implement 結合 動態擴展 分離 可操作性 技術 其中 一、什麽是AOPAOP(Aspect-OrientedProgramming,面向方面編程),可以說是OOP(Object-Oriented Programing,面向對象編程)的補充和完善。OO

Spring系列bean的使用

ack 工廠 使用實例 自動裝配 繼承 放心 sys xmla 客戶端 一、Bean的定義 <bean id="userDao" class="com.dev.spring.simple.MemoryUserDao"/> 這是一個最簡單的 Bean 定義。它

Spring系列AOP實現的兩種方式

部分 靜態常量 cep value conf tar import enc ble AOP常用的實現方式有兩種,一種是采用聲明的方式來實現(基於XML),一種是采用註解的方式來實現(基於AspectJ)。 首先復習下AOP中一些比較重要的概念: Joinpoint(連接點)

緩存系列二:CDN其他層面緩存

級別 spl pecl apache 分布式緩存 -o 真實ip har 分享 緩存系列之二:CDN與其他層面緩存 一:內容分發網絡(Content Delivery Network),通過將服務內容分發至全網加速節點,利用全球調度系統使用戶能夠就近獲取,有效降低訪問延遲,

談談-Android-PickerView系列源碼解析(二)

需求 動態 () comm tag 多個 來源 ntc 寬高 前言   WheelView想必大家或多或少都有一定了解, 它是一款3D滾輪控件,效果類似IOS 上面的UIpickerview 。按照國際慣例,先放一張效果圖:   以上是Android-PickerView

redis系列數據庫緩存數據一致性解決方案

查詢緩存 src dev 信息 一次 ram ren red getc redis系列之數據庫與緩存數據一致性解決方案 數據庫與緩存讀寫模式策略 寫完數據庫後是否需要馬上更新緩存還是直接刪除緩存? (1)、如果寫數據庫的值與更新到緩存值是一樣的,不需要經過任何的計算,可以馬

SpringMVC 框架系列組件概述配置詳解

align 概述 handle ont htm 配置文件 掃描器 springmvc 解析 在上一篇文章 SpringMVC 框架系列之初識與入門實例 的實例中,我們已經知道,SpringMVC 框架是一個 web 層的框架,本篇文章就詳細解釋一下 SpringMVC 框架

1.spring系列簡要概述

esc 不依賴 切面 可能 tro 接受 校驗和 javabean 異常處理 一、什麽是Spring? 1.spring是一個開源框架,它是為簡化企業級應用開發而生,它是一個IOC或者稱之為DI和AOP容器框架。 2.Spring解決的是業務邏輯層和其他各層的松耦合問題,

3.Spring系列IOC&DI

java程序 xmlns 配置文件 string main 設計 instance 什麽是 資源獲取 一、什麽是IOC? 1.概念 IOC—Inversion of Control,即“控制反轉”,不是新的技術,而是一種設計思想。Java開發中,IOC意味著將你設計好的對