好了!这里又出现了新的类型
BeanDefinitionParserDelegate
干什么用的?不过我知道这肯定和
XML
解析有关,所以不容错过!于是乎,简单浏览了一下它的实现(怕进入代码丛林!),我的天啊,我找到正题了:
public
class
BeanDefinitionParserDelegate
{
public
static
final
String
BEANS_NAMESPACE_URI
=
"http://www.springframework.org/schema/beans"
;
public
static
final
String
BEAN_NAME_DELIMITERS
=
",; "
;
public
static
final
String
TRUE_VALUE
=
"true"
;
public
static
final
String
FALSE_VALUE
=
"false"
;
public
static
final
String
DEFAULT_VALUE
=
"default"
;
public
static
final
String
DESCRIPTION_ELEMENT
=
"description"
;
public
static
final
String
AUTOWIRE_NO_VALUE
=
"no"
;
public
static
final
String
AUTOWIRE_BY_NAME_VALUE
=
"byName"
;
public
static
final
String
AUTOWIRE_BY_TYPE_VALUE
=
"byType"
;
public
static
final
String
AUTOWIRE_CONSTRUCTOR_VALUE
=
"constructor"
;
public
static
final
String
AUTOWIRE_AUTODETECT_VALUE
=
"autodetect"
;
public
static
final
String
DEPENDENCY_CHECK_ALL_ATTRIBUTE_VALUE
=
"all"
;
public
static
final
String
DEPENDENCY_CHECK_SIMPLE_ATTRIBUTE_VALUE
=
"simple"
;
public
static
final
String
DEPENDENCY_CHECK_OBJECTS_ATTRIBUTE_VALUE
=
"objects"
;
public
static
final
String
NAME_ATTRIBUTE
=
"name"
;
…..
这不是我们在
Spring XML
配置文件中经常看到的
XML
属性名称吗!我又看看了下面一些方法!
protected
void
populateDefaults(DocumentDefaultsDefinition defaults, DocumentDefaultsDefinition parentDefaults, Element root) {
String lazyInit = root.getAttribute(
DEFAULT_LAZY_INIT_ATTRIBUTE
);
if
(
DEFAULT_VALUE
.equals(lazyInit)) {
lazyInit = parentDefaults !=
null
? parentDefaults.getLazyInit() :
FALSE_VALUE
;
}
defaults.setLazyInit(lazyInit);
String merge = root.getAttribute(
DEFAULT_MERGE_ATTRIBUTE
);
if
(
DEFAULT_VALUE
.equals(merge)) {
merge = parentDefaults !=
null
? parentDefaults.getMerge() :
FALSE_VALUE
;
}
defaults.setMerge(merge);
String autowire = root.getAttribute(
DEFAULT_AUTOWIRE_ATTRIBUTE
);
if
(
DEFAULT_VALUE
.equals(autowire)) {
autowire = parentDefaults !=
null
? parentDefaults.getAutowire() :
AUTOWIRE_NO_VALUE
;
}
defaults.setAutowire(autowire);
defaults.setDependencyCheck(root.getAttribute(
DEFAULT_DEPENDENCY_CHECK_ATTRIBUTE
));
if
(root.hasAttribute(
DEFAULT_AUTOWIRE_CANDIDATES_ATTRIBUTE
)) {
defaults.setAutowireCandidates(root.getAttribute(
DEFAULT_AUTOWIRE_CANDIDATES_ATTRIBUTE
));
}
else
if
(parentDefaults !=
null
) {
defaults.setAutowireCandidates(parentDefaults.getAutowireCandidates());
}
if
(root.hasAttribute(
DEFAULT_INIT_METHOD_ATTRIBUTE
)) {
defaults.setInitMethod(root.getAttribute(
DEFAULT_INIT_METHOD_ATTRIBUTE
));
}
else
if
(parentDefaults !=
null
) {
defaults.setInitMethod(parentDefaults.getInitMethod());
}
if
(root.hasAttribute(
DEFAULT_DESTROY_METHOD_ATTRIBUTE
)) {
defaults.setDestroyMethod(root.getAttribute(
DEFAULT_DESTROY_METHOD_ATTRIBUTE
));
}
else
if
(parentDefaults !=
null
) {
defaults.setDestroyMethod(parentDefaults.getDestroyMethod());
}
defaults.setSource(
this
.
readerContext
.extractSource(root));
}
这不就是解析的过程吗?咦?装入
BeanDefinition
中的逻辑在什么地方,我们不能在
Spring
代码其他地方直接使用这些配置信息啊,只能给它们包装到一个实体类啊(当数据结构过长,一般是用实体类来存储的,哈哈,我也明白
BeanDefinitio
的设计目的了!)我继续在这个类里面找:
public
BeanDefinitionHolder parseBeanDefinitionElement(Element ele, BeanDefinition containingBean) {
String id = ele.getAttribute(
ID_ATTRIBUTE
);
String nameAttr = ele.getAttribute(
NAME_ATTRIBUTE
);
List<String> aliases =
new
ArrayList<String>();
if
(StringUtils.hasLength
(nameAttr)) {
String[] nameArr = StringUtils.tokenizeToStringArray
(nameAttr,
BEAN_NAME_DELIMITERS
);
aliases.addAll(Arrays.asList
(nameArr));
//
别名的解析
}
String beanName = id;
if
(!StringUtils.hasText
(beanName) && !aliases.isEmpty()) {
beanName = aliases.remove(0);
//
第一个作为
Bean
的默认名称
,very good!
if
(
logger
.isDebugEnabled()) {
logger
.debug(
"No XML 'id' specified - using '"
+ beanName +
"' as bean name and "
+ aliases +
" as aliases"
);
}
}
if
(containingBean ==
null
) {
//check bean
名是不是在容器中唯一
checkNameUniqueness(beanName, aliases, ele);
}
//
在这里具体创建
beanDefinition
实例,非常好的逻辑,代码逻辑清晰
AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);
if
(beanDefinition !=
null
) {
if
(!StringUtils.hasText
(beanName)) {
try
{
if
(containingBean !=
null
) {
//
没有
Bean
名的话,就生成一个
,.
供内部使用
beanName = BeanDefinitionReaderUtils.generateBeanName
(
beanDefinition,
this
.
readerContext
分享到:
相关推荐
《Spring框架核心源代码分析及感悟》 Spring框架作为Java企业级应用开发的基石,其强大的功能和灵活性深受开发者喜爱。深入理解Spring的核心源代码,不仅有助于我们更好地使用这个框架,还能提升我们的编程技艺和对...
Spring框架是Java开发中不可或缺的一部分,它以依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)为核心,提供了丰富的功能来简化企业级应用的开发。当我们深入理解...
《Spring Boot 揭秘与实战》系列源代码涉及了使用Spring Boot框架进行开发的一系列实践案例,包括但不限于配置、编码、测试以及部署等方面。作为当今流行的开源框架,Spring Boot简化了基于Spring的应用开发,通过...
1. **SpringBoot**:SpringBoot是Spring平台和第三库的集成,它利用了Spring框架的核心特性,简化了配置文件,实现了自动配置,并且支持快速构建独立的Spring应用程序。 - **优点**:易于理解和使用,可快速搭建...
源代码将被合理组织,并包含适当的注释,以便其他开发者理解和维护。此外,代码将遵循代码规范和最佳实践,确保代码质量。 系统的用户界面将采用现代化的Web设计语言,如HTML5、CSS3和JavaScript等,以提供响应式和...
【标题】"20170117-171626-49634_java书城系统_网上书城_源码"所指的是一个基于Java编程语言开发的网上书城系统源代码。这个系统可能包含了实现网上书店核心功能的所有必要组件,如用户管理、书籍展示、购物车、订单...
在平台的实现过程中,sheuquyanglaofuwu这一子文件夹包含了所有的源代码文件,这些源码文件是整个平台的核心,通过它们的整合和编译,最终形成了可供部署和运行的养老服务应用程序。 springboot187社区养老服务平台...
本项目是一个基于Java语言,采用ssm(Spring+SpringMVC+MyBatis)框架开发的电影推荐系统,其核心算法是协同过滤(Collaborative Filtering),并提供了完整的源代码、说明文档以及演示PPT。 协同过滤是推荐系统中...