- 浏览: 83234 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (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 1282为什么必须用IOC(DI ... -
原来有关Spring核心部分的源代码分析
2011-02-23 09:19 1044原来有关Spring核心部分的源代码分析,比较乱,而且没有整理 ... -
Spring框架核心源代码的分析及其感受-IOC篇-4
2010-11-13 16:34 2530从上一篇,我知道了我 ... -
Spring框架核心源代码的分析及其感受-IOC篇-3
2010-11-13 16:09 3054在上一篇中,我们找到了doCreateBean方法,我绕了半圈 ... -
Spring框架核心源代码的分析及其感受-IOC篇-2
2010-11-13 15:51 2164在上一篇,我们看到这样的代码: DefaultLis ... -
Spring框架核心源代码的分析及其感受-IOC篇-1
2010-11-13 15:29 2205首先,必须先在[/size]Spring源代码中,找到IOC的 ... -
Spring框架核心源代码的分析及其感受-6
2010-11-12 15:53 1550} else ... -
Spring框架核心源代码的分析及其感受-4
2010-11-12 15:47 1679好了!这里又出现了新的类型 BeanDefinitionPa ... -
Spring框架核心源代码的分析及其感受-3
2010-11-12 15:44 1633protected void loadBeanDefiniti ... -
Spring框架核心源代码的分析及其感受-2
2010-11-12 15:38 1964呵呵,无论从调用关系、方法名称和注释都能敏感的感觉到找对地方了 ... -
Spring框架核心源代码的分析及其感受-1
2010-11-12 15:29 7091(事先用Word写好的,再贴上来,格式有点...,有时间再调整 ...
相关推荐
《Spring框架核心源代码分析及感悟》 Spring框架作为Java企业级应用开发的基石,其强大的功能和灵活性深受开发者喜爱。深入理解Spring的核心源代码,不仅有助于我们更好地使用这个框架,还能提升我们的编程技艺和对...
Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 ...
Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- ...
Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 ---- 事务操作 ---- 代码 Spring5 框架 --...
Spring5 框架 ---- Spring5的新功能 ---- 代码 Spring5 框架 ---- Spring5的新功能 ---- 代码 Spring5 框架 ---- Spring5的新功能 ---- 代码 Spring5 框架 ---- Spring5的新功能 ---- 代码 Spring5 框架 ---- Spring...
JavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源...
JavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源代码 spring-coreJavaEE源...
JavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 spring-jpaJavaEE源代码 ...
JavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 spring-jdoJavaEE源代码 ...
JavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 spring-daoJavaEE源代码 ...
JavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源代码 spring-jdbcJavaEE源...
JavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源代码 spring-mockJavaEE源...
JavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 spring-ibatisJavaEE源代码 ...
JavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-beansJavaEE源代码 spring-...
JavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源代码 spring-contextJavaEE源...
Spring的源代码分析,不仅仅是技术层面的学习,更是对软件工程思想的探索。它教会我们如何分析问题,如何利用现有知识系统,如何对待不同的设计理念,以及如何更好地学习和使用工具。这种深入的理解可以帮助我们成长...
JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-...
在"spring框架学习源代码"这个资料中,你将有机会深入理解并实践这些关键概念。 首先,让我们从Spring的IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)开始。IOC是指应用程序不再...
通过阅读并分析这些源代码,开发者可以更深入地理解Spring框架的工作机制,学习如何有效地使用其特性来提高代码的可维护性和可扩展性。每个章节都会提供实际的示例,帮助开发者将理论知识转化为实践技能。对于想要...
看透springMvc源代码分析与实践-扫描版本 解压后大小(57.7M) 国内资深Web开发专家根据Spring MVC全新技术撰写,基于实际生产环境,从基础知识、源代码和实战3个维度对Spring MVC的结构和实现进行详细讲解 全面介绍...