DefaultBeanDefinitionDocumentReader#parseDefaultElement()方法
private void parseDefaultElement ( Element ele, BeanDefinitionParserDelegate delegate) {
if ( delegate. nodeNameEquals ( ele, IMPORT_ELEMENT ) ) {
importBeanDefinitionResource ( ele) ;
}
else if ( delegate. nodeNameEquals ( ele, ALIAS_ELEMENT ) ) {
processAliasRegistration ( ele) ;
}
else if ( delegate. nodeNameEquals ( ele, BEAN_ELEMENT ) ) {
processBeanDefinition ( ele, delegate) ;
}
else if ( delegate. nodeNameEquals ( ele, NESTED_BEANS_ELEMENT ) ) {
doRegisterBeanDefinitions ( ele) ;
}
}
DefaultBeanDefinitionDocumentReader#importBeanDefinitionResource()方法
protected void importBeanDefinitionResource ( Element ele) {
String location = ele. getAttribute ( RESOURCE_ATTRIBUTE ) ;
if ( ! StringUtils . hasText ( location) ) {
getReaderContext ( ) . error ( "Resource location must not be empty" , ele) ;
return ;
}
location = getReaderContext ( ) . getEnvironment ( ) . resolveRequiredPlaceholders ( location) ;
Set < Resource > actualResources = new LinkedHashSet < > ( 4 ) ;
boolean absoluteLocation = false ;
try {
absoluteLocation = ResourcePatternUtils . isUrl ( location) || ResourceUtils . toURI ( location) . isAbsolute ( ) ;
}
catch ( URISyntaxException ex) {
}
if ( absoluteLocation) {
try {
int importCount = getReaderContext ( ) . getReader ( ) . loadBeanDefinitions ( location, actualResources) ;
if ( logger. isTraceEnabled ( ) ) {
logger. trace ( "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 {
try {
int importCount;
Resource relativeResource = getReaderContext ( ) . getResource ( ) . createRelative ( location) ;
if ( relativeResource. exists ( ) ) {
importCount = getReaderContext ( ) . getReader ( ) . loadBeanDefinitions ( relativeResource) ;
actualResources. add ( relativeResource) ;
}
else {
String baseLocation = getReaderContext ( ) . getResource ( ) . getURL ( ) . toString ( ) ;
importCount = getReaderContext ( ) . getReader ( ) . loadBeanDefinitions (
StringUtils . applyRelativePath ( baseLocation, location) , actualResources) ;
}
if ( logger. isTraceEnabled ( ) ) {
logger. trace ( "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 [ 0 ] ) ;
getReaderContext ( ) . fireImportProcessed ( location, actResArray, extractSource ( ele) ) ;
}
DefaultBeanDefinitionDocumentReader#processAliasRegistration()方法
protected void processAliasRegistration ( Element ele) {
String name = ele. getAttribute ( NAME_ATTRIBUTE ) ;
String alias = ele. getAttribute ( ALIAS_ATTRIBUTE ) ;
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) ;
}
catch ( Exception ex) {
getReaderContext ( ) . error ( "Failed to register alias '" + alias +
"' for bean with name '" + name + "'" , ele, ex) ;
}
getReaderContext ( ) . fireAliasRegistered ( name, alias, extractSource ( ele) ) ;
}
}
DefaultBeanDefinitionDocumentReader#processBeanDefinition()方法
protected void processBeanDefinition ( Element ele, BeanDefinitionParserDelegate delegate) {
BeanDefinitionHolder bdHolder = delegate. parseBeanDefinitionElement ( ele) ;
if ( bdHolder != null ) {
bdHolder = delegate. decorateBeanDefinitionIfRequired ( ele, bdHolder) ;
try {
BeanDefinitionReaderUtils . registerBeanDefinition ( bdHolder, getReaderContext ( ) . getRegistry ( ) ) ;
}
catch ( BeanDefinitionStoreException ex) {
getReaderContext ( ) . error ( "Failed to register bean definition with name '" +
bdHolder. getBeanName ( ) + "'" , ele, ex) ;
}
getReaderContext ( ) . fireComponentRegistered ( new BeanComponentDefinition ( bdHolder) ) ;
}
}
BeanDefinitionParserDelegate#parseCustomElement()方法
public BeanDefinition parseCustomElement ( Element ele, @Nullable BeanDefinition containingBd) {
String namespaceUri = getNamespaceURI ( ele) ;
if ( namespaceUri == null ) {
return null ;
}
NamespaceHandler handler = this . readerContext. getNamespaceHandlerResolver ( ) . resolve ( namespaceUri) ;
if ( handler == null ) {
error ( "Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]" , ele) ;
return null ;
}
return handler. parse ( ele, new ParserContext ( this . readerContext, this , containingBd) ) ;
}