- 浏览: 84187 次
- 性别:
- 来自: 大连
-
文章分类
- 全部博客 (49)
- 对象持久化 (1)
- Core Java (7)
- 关系数据库 (0)
- 架构设计 (4)
- Linux&Unix (9)
- 软件思想随想 (4)
- Spring (12)
- Python (0)
- OSGI (0)
- Java Tools (0)
- Java应用服务器 (0)
- MQ (0)
- SOA (0)
- 云计算 (1)
- .Net-C# (2)
- .Net-WCF (0)
- .Net-WPF (0)
- .Net-WF (0)
- .Net Web (0)
- .Net应用服务器 (1)
- Java Web (0)
- 非关系性数据库 (2)
- 生活随想 (3)
- 我的开源社区 (1)
- 管理思想 (0)
- 测试方法论 (0)
- 开发方法论 (2)
- Hadoop (0)
- 工作流 (0)
- Quartz (0)
- ASP.Net MVC (0)
- LinQ (0)
- .Net Platform (2)
- 我的书 (1)
最新评论
-
magicyang919:
很期待,加油做啊。讲清楚how,和why,更重要的是why,重 ...
原来有关Spring核心部分的源代码分析 -
magicyang919:
这个必须顶,我们要知道的就是为什么spring这么设计,而不是 ...
Spring框架核心源代码的分析及其感受-1 -
pastore123:
分析的很好,思维过程讲的很好,通俗易懂
Spring框架核心源代码的分析及其感受-1 -
gbllty1981:
一个简单的基于约定优于配置(Coc)的对象工厂实现 -
沙舟狼客:
其实在开发中有好多都是固定模式的,所以应该用约定;这样维护起来 ...
约定优于配置的一个思考
this . readerContext .getRegistry(), true );
}
else {
// 如果 Bean 为空,就在这里注册一个 Class 全局限定名
beanName = this . readerContext .generateBeanName(beanDefinition);
String beanClassName = beanDefinition.getBeanClassName();
if (beanClassName != null &&
beanName.startsWith(beanClassName) && beanName.length() > beanClassName.length() &&
! this . readerContext .getRegistry().isBeanNameInUse(beanClassName)) {
aliases.add(beanClassName);
}
}
if ( logger .isDebugEnabled()) {
logger .debug( "Neither XML 'id' nor 'name' specified - " +
"using generated bean name [" + beanName + "]" );
}
}
catch (Exception ex) {
error(ex.getMessage(), ele);
return null ;
}
}
String[] aliasesArray = StringUtils.toStringArray (aliases);
return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);
}
return null ;
哈哈哈,我快乐疯了,就在上面这段代码里, AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean).
public AbstractBeanDefinition parseBeanDefinitionElement(
Element ele, String beanName, BeanDefinition containingBean) {
this . parseState .push( new BeanEntry(beanName));
String className = null ;
if (ele.hasAttribute( CLASS_ATTRIBUTE )) {
className = ele.getAttribute( CLASS_ATTRIBUTE ).trim();
}
try {
String parent = null ;
if (ele.hasAttribute( PARENT_ATTRIBUTE )) {
parent = ele.getAttribute( PARENT_ATTRIBUTE );
}
// 创建实例
AbstractBeanDefinition bd = createBeanDefinition(className, parent);
// 将 XML 中的属性写进入
parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);
bd.setDescription(DomUtils.getChildElementValueByTagName (ele, DESCRIPTION_ELEMENT ));
// 都是把 XML 里面的东西写进去!
parseMetaElements(ele, bd);
parseLookupOverrideSubElements(ele, bd.getMethodOverrides());
parseReplacedMethodSubElements(ele, bd.getMethodOverrides());
parseConstructorArgElements(ele, bd);
parsePropertyElements(ele, bd);
parseQualifierElements(ele, bd);
bd.setResource( this . readerContext .getResource());
bd.setSource(extractSource(ele));
return bd;
}
catch (ClassNotFoundException ex) {
….
}
事情已经很清楚了,但是我又在想一个 Spring 应用程序一般会用到很多 XML 配置文件的,也有很多应用类的,应该有能让 Spring 在一个集中的能快速找到这些 BeanDefintion 的地方吧?
(在分析代码的过程中,你最好还是要不断的思考,说不定能提前预知一些事情哪!!!)回到 DefaultBeanDefinitionDocumentReader 的 doRegisterBeanDefinitions(Element root) 方法中:
preProcessXml(root);
parseBeanDefinitions(root, this . delegate );
postProcessXml(root);
在你看完这些方法的实现,你就清楚了,这里不再挨个看了,直接给出答案!
protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
//DeanDefinitionHolder 实际是 BeanDefintion 的包装类,持有 BeanDefinitionHolder ,实际上也就拥有了
//BeanDefinition 的创建核心
BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
if (bdHolder != null ) {
bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder );
try {
// Register the final decorated instance.
//BeanDEfintion 在这里注册
BeanDefinitionReaderUtils.registerBeanDefinition (bdHolder , getReaderContext().getRegistry());
}
catch (BeanDefinitionStoreException ex) {
getReaderContext().error( "Failed to register bean definition with name '" +
bdHolder .getBeanName() + "'" , ele, ex);
}
// Send registration event.
getReaderContext().fireComponentRegistered( new BeanComponentDefinition(bdHolder ));
}
}
BeanDefinitionReaderUtils.registerBeanDefinition :
public static void registerBeanDefinition (
BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
throws BeanDefinitionStoreException {
// Register bean definition under primary name.
String beanName = definitionHolder.getBeanName();
registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
// Register aliases for bean name, if any.
String[] aliases = definitionHolder.getAliases();
if (aliases != null ) {
for (String aliase : aliases) {
registry.registerAlias(beanName, aliase);
}
}
}
发现使用了 BeanDefinitionRegistry 类,从名字来看,注册有关,在查询一些材料时,我是知道这个注册是用来干什么的,就是把 BeanDefinition 方法一方地方,一个能供 Spring 其他类找到 BeanDefinition 的地方!这个类是一个接口,它的实现居然是 DefaultListableBeanFactory( 按 F4 键后看到的类继承结构后分析出来的 )! 我在它里面发现了这个:
public void registerBeanDefinition (String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException {
Assert.hasText (beanName, "Bean name must not be empty" );
Assert.notNull (beanDefinition, "BeanDefinition must not be null" );
if (beanDefinition instanceof AbstractBeanDefinition) {
try {
((AbstractBeanDefinition) beanDefinition).validate();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
"Validation of bean definition failed" , ex);
}
}
synchronized ( this . beanDefinitionMap ) {
Object oldBeanDefinition =
this . beanDefinitionMap .get(beanName);
if (oldBeanDefinition != null ) {
if (! this . allowBeanDefinitionOverriding ) {
throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
"Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +
"': There is already [" + oldBeanDefinition + "] bound." );
- Spring框架核心源代码的分析及其感受-1.rar (93.8 KB)
- 下载次数: 6
发表评论
-
约定优于配置的一个思考
2011-03-21 10:29 1310为什么必须用IOC(DI ... -
原来有关Spring核心部分的源代码分析
2011-02-23 09:19 1055原来有关Spring核心部分的源代码分析,比较乱,而且没有整理 ... -
Spring框架核心源代码的分析及其感受-IOC篇-4
2010-11-13 16:34 2539从上一篇,我知道了我 ... -
Spring框架核心源代码的分析及其感受-IOC篇-3
2010-11-13 16:09 3064在上一篇中,我们找到了doCreateBean方法,我绕了半圈 ... -
Spring框架核心源代码的分析及其感受-IOC篇-2
2010-11-13 15:51 2172在上一篇,我们看到这样的代码: DefaultLis ... -
Spring框架核心源代码的分析及其感受-IOC篇-1
2010-11-13 15:29 2216首先,必须先在[/size]Spring源代码中,找到IOC的 ... -
Spring框架核心源代码的分析及其感受-6
2010-11-12 15:53 1560} else ... -
Spring框架核心源代码的分析及其感受-4
2010-11-12 15:47 1686好了!这里又出现了新的类型 BeanDefinitionPa ... -
Spring框架核心源代码的分析及其感受-3
2010-11-12 15:44 1639protected void loadBeanDefiniti ... -
Spring框架核心源代码的分析及其感受-2
2010-11-12 15:38 1973呵呵,无论从调用关系、方法名称和注释都能敏感的感觉到找对地方了 ... -
Spring框架核心源代码的分析及其感受-1
2010-11-12 15:29 7104(事先用Word写好的,再贴上来,格式有点...,有时间再调整 ...
相关推荐
《Spring框架核心源代码分析及感悟》 Spring框架作为Java企业级应用开发的基石,其强大的功能和灵活性深受开发者喜爱。深入理解Spring的核心源代码,不仅有助于我们更好地使用这个框架,还能提升我们的编程技艺和对...
Spring框架是Java开发中不可或缺的一部分,它以依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)为核心,提供了丰富的功能来简化企业级应用的开发。当我们深入理解...
《Spring Boot 揭秘与实战》系列源代码涉及了使用Spring Boot框架进行开发的一系列实践案例,包括但不限于配置、编码、测试以及部署等方面。作为当今流行的开源框架,Spring Boot简化了基于Spring的应用开发,通过...
源代码将被合理组织,并包含适当的注释,以便其他开发者理解和维护。此外,代码将遵循代码规范和最佳实践,确保代码质量。 系统的用户界面将采用现代化的Web设计语言,如HTML5、CSS3和JavaScript等,以提供响应式和...
1. **SpringBoot**:SpringBoot是Spring平台和第三库的集成,它利用了Spring框架的核心特性,简化了配置文件,实现了自动配置,并且支持快速构建独立的Spring应用程序。 - **优点**:易于理解和使用,可快速搭建...
【标题】"20170117-171626-49634_java书城系统_网上书城_源码"所指的是一个基于Java编程语言开发的网上书城系统源代码。这个系统可能包含了实现网上书店核心功能的所有必要组件,如用户管理、书籍展示、购物车、订单...
在平台的实现过程中,sheuquyanglaofuwu这一子文件夹包含了所有的源代码文件,这些源码文件是整个平台的核心,通过它们的整合和编译,最终形成了可供部署和运行的养老服务应用程序。 springboot187社区养老服务平台...
本项目是一个基于Java语言,采用ssm(Spring+SpringMVC+MyBatis)框架开发的电影推荐系统,其核心算法是协同过滤(Collaborative Filtering),并提供了完整的源代码、说明文档以及演示PPT。 协同过滤是推荐系统中...