spring 之 import标签、alias标签、beans标签 解析
生活随笔
收集整理的這篇文章主要介紹了
spring 之 import标签、alias标签、beans标签 解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
繼續接著Spring 加載、解析applicationContext.xml 流程解析 import 、 alias、beans 標簽。
DefaultBeanDefinitionDocumentReader.parseDefaultElement()
1. import 標簽解析
標簽示例
<import resource="user-appalicationContext.xml"/>解析import 標簽
入口類、方法DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource();
protected void importBeanDefinitionResource(Element ele) {// 解析 resource 屬性String location = ele.getAttribute(RESOURCE_ATTRIBUTE);//如果為空,不做處理if (!StringUtils.hasText(location)) {getReaderContext().error("Resource location must not be empty", ele);return;}// 解析系統屬性。比如 "${user.dir}"location = getReaderContext().getEnvironment().resolveRequiredPlaceholders(location);Set<Resource> actualResources = new LinkedHashSet<>(4);boolean absoluteLocation = false;try {// 判斷 location 是絕對路徑還是相對路徑absoluteLocation = ResourcePatternUtils.isUrl(location) || ResourceUtils.toURI(location).isAbsolute();}catch (URISyntaxException ex) {// cannot convert to an URI, considering the location relative// unless it is the well-known Spring prefix "classpath*:"}// 絕對路徑if (absoluteLocation) {try {//加載xml配置文件,并解析資源int importCount = getReaderContext().getReader().loadBeanDefinitions(location, actualResources);if (logger.isDebugEnabled()) {logger.debug("Imported " + importCount + " bean definitions from URL location [" + location + "]");}}catch (BeanDefinitionStoreException ex) {getReaderContext().error("Failed to import bean definitions from URL location [" + location + "]", ele, ex);}}else {// No URL -> considering resource location as relative to the current file.try {int importCount;//獲取絕對路徑,并解析文件Resource relativeResource = getReaderContext().getResource().createRelative(location);if (relativeResource.exists()) {//加載xml文件,并解析importCount = getReaderContext().getReader().loadBeanDefinitions(relativeResource);actualResources.add(relativeResource);}else {// 獲取URL 路徑,并解析文件String baseLocation = getReaderContext().getResource().getURL().toString();importCount = getReaderContext().getReader().loadBeanDefinitions(StringUtils.applyRelativePath(baseLocation, location), actualResources);}if (logger.isDebugEnabled()) {logger.debug("Imported " + importCount + " bean definitions from relative location [" + location + "]");}}catch (IOException ex) {getReaderContext().error("Failed to resolve current resource location", ele, ex);}catch (BeanDefinitionStoreException ex) {getReaderContext().error("Failed to import bean definitions from relative location [" + location + "]",ele, ex);}}Resource[] actResArray = actualResources.toArray(new Resource[actualResources.size()]);getReaderContext().fireImportProcessed(location, actResArray, extractSource(ele)); }2. alias 標簽解析
alias 標簽示例
<bean id="user" class="cn.com.infcn.test.User"></bean> <alias name="user" alias="myUser" />解析 alias 標簽
DefaultBeanDefinitionDocumentReader.processAliasRegistration()
protected void processAliasRegistration(Element ele) {//獲取 name屬性String name = ele.getAttribute(NAME_ATTRIBUTE);//獲取 alias 屬性String alias = ele.getAttribute(ALIAS_ATTRIBUTE);boolean valid = true;//驗證 name 是否為空if (!StringUtils.hasText(name)) {getReaderContext().error("Name must not be empty", ele);valid = false;}//驗證 alias 是否為空if (!StringUtils.hasText(alias)) {getReaderContext().error("Alias must not be empty", ele);valid = false;}if (valid) {try {//把 alias 注冊到 SimpleAliasRegistry.aliasMap 中getReaderContext().getRegistry().registerAlias(name, alias);}catch (Exception ex) {getReaderContext().error("Failed to register alias '" + alias +"' for bean with name '" + name + "'", ele, ex);}getReaderContext().fireAliasRegistered(name, alias, extractSource(ele));} }SimpleAliasRegistry 源碼
public class SimpleAliasRegistry implements AliasRegistry {private final Map<String, String> aliasMap = new ConcurrentHashMap<>(16);@Overridepublic void registerAlias(String name, String alias) {Assert.hasText(name, "'name' must not be empty");Assert.hasText(alias, "'alias' must not be empty");if (alias.equals(name)) {this.aliasMap.remove(alias);}else {String registeredName = this.aliasMap.get(alias);if (registeredName != null) {if (registeredName.equals(name)) {// An existing alias - no need to re-registerreturn;}if (!allowAliasOverriding()) {throw new IllegalStateException("Cannot register alias '" + alias + "' for name '" +name + "': It is already registered for name '" + registeredName + "'.");}}checkForAliasCircle(name, alias);this.aliasMap.put(alias, name);}}protected boolean allowAliasOverriding() {return true;}......3. beans 標簽解析
beans標簽示例
<?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:util="http://www.springframework.org/schema/util"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"><bean id="user" class="cn.com.infcn.test.User"></bean><beans>......</beans> </beans>beans 標簽解析 又調用了doRegisterBeanDefinitions() 方法,這個方法在Spring 加載、解析applicationContext.xml 流程中已經介紹過了。
跟import 解析都類似。又相當于重新執行解析了一邊 bean 標簽一樣。
本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書
GIT地址:http://git.oschina.net/brucekankan/
點擊這里快速進入GIT
總結
以上是生活随笔為你收集整理的spring 之 import标签、alias标签、beans标签 解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring 加载、解析applicat
- 下一篇: spring 循环依赖注入