自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(3)
  • 资源 (25)
  • 问答 (1)
  • 收藏
  • 关注

转载 由“单独搭建Mybatis”到“Mybatis与Spring的整合/集成”

使用方法请参考文章:http://www.cnblogs.com/nick-huang/p/3838326.html

2015-05-12 21:40:00 257

转载 Servlet 工作原理解析

Servlet 工作原理解析许 令波, Java 工程师, 淘宝网简介: Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础。因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的基本要求。本文将带你认识 Java Web 技术是如何基于 Servlet 工作,你将

2012-05-20 20:54:04 346

原创 U盘不能删除的正确方法

安全删除U盘时,无法停止的正确处理热度 4已有 30 次阅读 2011-3-29 14:18 |个人分类:卧槽族安全删除U盘时,大家常常会遇到提示“无法停止通用卷’设备,请稍候再停止该设备。”这种情况下可以强行拔下U盘吗?当然不可以!这时候如果强行拔除的话,很容易损坏计算机U口或者你的U盘。如果你的U盘上有重要的资料,很有可能就此毁坏了。那么应该怎么办呢?第一种方法:往往我们

2011-04-21 12:33:00 562

org.apache.tools.*需要的ant.jar包

java调用ant构建打包,java调用ant构建打包,java调用ant构建打包,java调用ant构建打包,

2017-11-06

.chm文件制作

.chm文件制作 里要制作的是"王长喜CET-4课堂",首先在硬盘中将所有有关的资料融合到一个文件夹中,这将大大方便后期的制作。

2013-05-12

java规范

java规范

2012-06-05

spring定时器关于表达式的说明

spring定时器关于表达式的说明

2012-01-30

解析XML文件例子

解析XML文件例子

2011-12-21

怎样读取properties文件内容

怎样读取properties文件内容,用java中最基本的方式去读取properties文件中的内容

2011-12-18

myEclise反编译插件

myEclise反编译插件myEclise反编译插件

2011-12-18

jQuery有关的实例

jQuery有关的实例

2011-12-18

exe4j破解注册码4.11版本

exe4j破解注册码4.11版本,将你的java程序转化为window桌面可执行程序。

2011-12-11

myEclipse自动关闭问题

myEclipse自动关闭问题myEclipse自动关闭问题

2011-12-01

spring源码

rar包内含有spring2.5.6源码,解压即可使用 源代码分析,是一件既痛苦又快乐的事情,看别人写的代码是通过的,但当你能够看明白的时候,相信快乐也会随之而来,为了减少痛苦,更快的带来快乐,在这里希望通过这篇文章对觉得困难的朋友有一个帮助。 本文以spring框架的XmlBeanFactory为入手点进行分析,希望能够以尽量简洁明了的方式给予有需要的朋友一定的帮助。 首先来打开该类的代码,我们将看到如下代码: Java代码 public class XmlBeanFactory extends DefaultListableBeanFactory { private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); public XmlBeanFactory(Resource resource) throws BeansException { this(resource, null); } public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException { super(parentBeanFactory); this.reader.loadBeanDefinitions(resource); } } public class XmlBeanFactory extends DefaultListableBeanFactory { private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); public XmlBeanFactory(Resource resource) throws BeansException { this(resource, null); } public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException { super(parentBeanFactory); this.reader.loadBeanDefinitions(resource); } } 这个类的代码很简单,一个成员对象加两个构造函数,从这里我们可以看出,最重要的地方在于最后一个构造函数: Java代码 super(parentBeanFactory); this.reader.loadBeanDefinitions(resource); super(parentBeanFactory); this.reader.loadBeanDefinitions(resource); 第一句就是将父亲工厂交给父类的构造函数,实际上最后也就是把父工厂保存到类的parentBeanFactory成员对象中,这个对象是在AbstractBeanFactory抽象类中定义的,而这个父工厂也会一直传递到该抽象类进行保存。第二句就是整个类中最重要的地方了,顾名思义,它的目的是通过XmlBeanDefinitionReader这个XML的Reader从资源resource中(也就是你的配置文件)读取bean的定义。接下来我们打开XmlBeanDefinitionReader的loadBeanDefinitions方法,我们可看到在这个方法里代码就一行,调用了一个同名不同参的方法,而参数是EncodedResource的一个实例,这个类实际上是Resource的一个包装类,用来保存资源的Encode的,那接下来我们再看被调用的loadBeanDefinitions方法,这个方法里最主要的部分就是: Java代码 InputSource inputSource = new InputSource(inputStream); if (encodedResource.getEncoding() != null) { inputSource.setEncoding(encodedResource.getEncoding()); } return doLoadBeanDefinitions(inputSource, encodedResource.getResource()); InputSource inputSource = new InputSource(inputStream); if (encodedResource.getEncoding() != null) { inputSource.setEncoding(encodedResource.getEncoding()); } return doLoadBeanDefinitions(inputSource, encodedResource.getResource()); 这里的目的是将资源包装成一个InputSource,连同Resource作为参数传递到doLoadBeanDefinitions方法 Java代码 DocumentBuilderFactory factory = createDocumentBuilderFactory(); if (logger.isDebugEnabled()) { logger.debug("Using JAXP implementation [" + factory + "]"); } DocumentBuilder builder = createDocumentBuilder(factory); Document doc = builder.parse(inputSource); return registerBeanDefinitions(doc, resource); DocumentBuilderFactory factory = createDocumentBuilderFactory(); if (logger.isDebugEnabled()) { logger.debug("Using JAXP implementation [" + factory + "]"); } DocumentBuilder builder = createDocumentBuilder(factory); Document doc = builder.parse(inputSource); return registerBeanDefinitions(doc, resource); 这个方法的目的一目了然,就是为了将资源解释成为Document对象,然后调用registerBeanDefinitions方法,这里不做详细解释,不了解的话请去看看关于JAXP的介绍。接下来我们打开registerBeanDefinitions方法: Java代码 public int registerBeanDefinitions(Document doc, Resource resource) throws BeansException { XmlBeanDefinitionParser parser = (XmlBeanDefinitionParser) BeanUtils.instantiateClass(this.parserClass); return parser.registerBeanDefinitions(this, doc, resource); } public int registerBeanDefinitions(Document doc, Resource resource) throws BeansException { XmlBeanDefinitionParser parser = (XmlBeanDefinitionParser) BeanUtils.instantiateClass(this.parserClass); return parser.registerBeanDefinitions(this, doc, resource); } 这里创建了一个XmlBeanDefinitionParser接口的实现,这个接口的具体类是DefaultXmlBeanDefinitionParser,这个接口很简单,只有registerBeanDefinitions一个方法,这个方法的作用也很明了,就是用来注册Bean的定义的,所以说类和方法的名字一定要起得有意义,这样可以让人一看就大概了解其作用,减少了很多阅读代码的痛苦。废话不多说,我们打开DefaultXmlBeanDefinitionParser的registerBeanDefinitions方法,这个类就是解释XML配置文件的核心类了,打开registerBeanDefinitions方法后我们看到如下代码: Java代码 public int registerBeanDefinitions(BeanDefinitionReader reader, Document doc, Resource resource) throws BeanDefinitionStoreException { this.beanDefinitionReader = reader; this.resource = resource; logger.debug("Loading bean definitions"); Element root = doc.getDocumentElement(); //初始化根元素 initDefaults(root); if (logger.isDebugEnabled()) { logger.debug("Default lazy init '" + getDefaultLazyInit() + "'"); logger.debug("Default autowire '" + getDefaultAutowire() + "'"); logger.debug("Default dependency check '" + getDefaultDependencyCheck() + "'"); } preProcessXml(root);//一个空方法用于扩展 int beanDefinitionCount = parseBeanDefinitions(root);//解释配置的主要方法 if (logger.isDebugEnabled()) { logger.debug("Found " + beanDefinitionCount + " <bean> elements in " + resource); } postProcessXml(root); //一个空方法用于扩展 return beanDefinitionCount; } public int registerBeanDefinitions(BeanDefinitionReader reader, Document doc, Resource resource) throws BeanDefinitionStoreException { this.beanDefinitionReader = reader; this.resource = resource; logger.debug("Loading bean definitions"); Element root = doc.getDocumentElement(); //初始化根元素 initDefaults(root); if (logger.isDebugEnabled()) { logger.debug("Default lazy init '" + getDefaultLazyInit() + "'"); logger.debug("Default autowire '" + getDefaultAutowire() + "'"); logger.debug("Default dependency check '" + getDefaultDependencyCheck() + "'"); } preProcessXml(root);//一个空方法用于扩展 int beanDefinitionCount = parseBeanDefinitions(root);//解释配置的主要方法 if (logger.isDebugEnabled()) { logger.debug("Found " + beanDefinitionCount + " <bean> elements in " + resource); } postProcessXml(root); //一个空方法用于扩展 return beanDefinitionCount; } 在这个方法当中,主要用于解释定义的有两个方法,一个是initDefaults,一个是parseBeanDefinitions,第一个方法是用来解释根元素的属性的,例如lazy-init, autowire等,而parseBeanDefinitions就是用来解释具体的bean定义了,方法代码如下: Java代码 protected int parseBeanDefinitions(Element root) throws BeanDefinitionStoreException { NodeList nl = root.getChildNodes(); int beanDefinitionCount = 0; for (int i = 0; i < nl.getLength(); i++) { Node node = nl.item(i); if (node instanceof Element) { Element ele = (Element) node; if (IMPORT_ELEMENT.equals(node.getNodeName())) { importBeanDefinitionResource(ele); } else if (ALIAS_ELEMENT.equals(node.getNodeName())) { String name = ele.getAttribute(NAME_ATTRIBUTE); String alias = ele.getAttribute(ALIAS_ATTRIBUTE); this.beanDefinitionReader.getBeanFactory().registerAlias(name, alias); } else if (BEAN_ELEMENT.equals(node.getNodeName())) { beanDefinitionCount++; BeanDefinitionHolder bdHolder = parseBeanDefinitionElement(ele, false); BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, this.beanDefinitionReader.getBeanFactory()); } } } return beanDefinitionCount; } protected int parseBeanDefinitions(Element root) throws BeanDefinitionStoreException { NodeList nl = root.getChildNodes(); int beanDefinitionCount = 0; for (int i = 0; i < nl.getLength(); i++) { Node node = nl.item(i); if (node instanceof Element) { Element ele = (Element) node; if (IMPORT_ELEMENT.equals(node.getNodeName())) { importBeanDefinitionResource(ele); } else if (ALIAS_ELEMENT.equals(node.getNodeName())) { String name = ele.getAttribute(NAME_ATTRIBUTE); String alias = ele.getAttribute(ALIAS_ATTRIBUTE); this.beanDefinitionReader.getBeanFactory().registerAlias(name, alias); } else if (BEAN_ELEMENT.equals(node.getNodeName())) { beanDefinitionCount++; BeanDefinitionHolder bdHolder = parseBeanDefinitionElement(ele, false); BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, this.beanDefinitionReader.getBeanFactory()); } } } return beanDefinitionCount; } 其他标签具体如何被解释这里就不多说,相信大家也能看得懂,这里主要讲一下解释bean的的处理,我们注意以下代码: Java代码 else if (BEAN_ELEMENT.equals(node.getNodeName())) { beanDefinitionCount++; BeanDefinitionHolder bdHolder = parseBeanDefinitionElement(ele, false); BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, this.beanDefinitionReader.getBeanFactory()); } else if (BEAN_ELEMENT.equals(node.getNodeName())) { beanDefinitionCount++; BeanDefinitionHolder bdHolder = parseBeanDefinitionElement(ele, false); BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, this.beanDefinitionReader.getBeanFactory()); } 这里是当碰到一个bean标签的时候所进行的处理,也既是对bean的定义进行解释,可以看到parseBeanDefinitionElement方法的第一个参数就是bean则个元素,第二个参数表示该bean是否为内置的bean,从这里进行解释的bean都不可能是内置的,所以这里直接以false为参数,打开parseBeanDefinitionElement方法,就可以看到这个方法里就是对bean的内部的解释,也很简单,也不多讲了,呵呵(下班时间已经到了,所以就写这么多了,基本的流程也就这样,没什么特别难的地方。),对了,最后还有一点就是解释完后,bean的定义将会被保存到beanFactory中,这个beanFactory的实现就是XmlBeanFactory了,该beanFactory是在new的时候被传递到reader中的,就是该类中以下这行代码: Java代码 private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); 好了,就这么多了,本文只作为参考,只讲解了如何加载bean定义这块,只作为一个参考,希望对其他朋友能有所帮助吧,因为时间匆忙,有错漏的地方请指正。

2011-11-20

struts in Action中文版

Struts In Action 中文版 Struts In Action 使用领先的Java框架构建Web应用 中文版 目 录 1. 介绍...............18 1.1. 关于本书...19 1.1.1. 谁创建了Struts?.........19 1.1.2. 为什么Struts 要开源?.................19 1.1.3. 为什么叫Struts?.........19 1.1.4. 落到实处...27 1.1.5. 再看看.......34 1.2. 小结...........36 2. 深入STRUTS 架构..........37 2.1. 随便谈谈...38 2.2. 为什么我们需要Struts ...............38 2.2.1. 退一进三...38 2.2.2. 进入 Struts .................39 2.2.3. Struts 控制器组件......39 2.2.4. 用Struts 开发Web 应用..............42 2.3. 为什么需要框架.........43 2.3.1. Web—永无休止的修补................43 2.3.2. Servlet 解决方案.......44 2.3.3. Servlet 框架...............44 2.3.4. 黑盒-白盒统一体.......45 2.4. Struts, Model 2,以及 MVC........46 2.4.1. MVC 的演化...............46 2.4.2. Model 2 的出现..........47 2.4.3. 应用层—视图之间的去耦合.......47 2.4.4. Struts 如何实现Model 2, MVC, 和分层......49 2.5. Struts 控制流............50 2.5.1. 总图...........51 2.5.2. 出色的细节.................52 2.5.3. Struts 是富有效率的吗?..............54 2.6. Struts 的长处和弱点.55 2.6.1. 弱点...........56 2.6.2. Struts 的强项..............58 Struts in Action 中文版 Lastest Revised:10/14/2005 10:27:00 AM Translated By: Eric Liu(铁手) [email protected](MSN) 第 3 页 http://www.blogjava.net/steelhand 2.7. 小结...........59 3. 构建一个简单应用............60 3.1. 被支柱支撑的支柱.....61 3.1.1. 为什么选择 logon 应用? .............61 3.2. 漫游logon 应用.........62 3.2.1. 从这里开始.................62 3.2.2. 我们看到的屏幕.........62 3.2.3. 欢迎屏幕...63 3.2.4. 登录屏幕...63 3.2.5. 重新显示欢迎屏幕.....65 3.2.6. 欢迎屏幕,再见.........65 3.2.7. 所使用的特征.............66 3.3. 解剖 logon 应用.......66 3.3.1. 欢迎屏幕的浏览器代码...............66 3.3.2. 欢迎页面的JSP 源代码...............67 3.3.3. Welcome 屏幕的配置源代码.......70 3.3.4. logon 屏幕的浏览器代码............70 3.3.5. logon 的配置源代码..73 3.3.6. LogonSubmit 配置......74 3.3.7. LogonForm 源代码....75

2011-11-20

Dictionary

Dictionary

2011-11-06

springAOP笔记

springAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOP

2011-10-27

js控制上传文件的大小

js控制上传文件的大小js控制上传文件的大小js控制上传文件的大小js控制上传文件的大小js控制上传文件的大小js控制上传文件的大小js控制上传文件的大小

2011-10-27

javaSE部分内容

javaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSE

2011-10-23

CSS2.0_DOC.chm

CSS2.0_DOC.chmCSS2.0_DOC.chmCSS2.0_DOC.chmCSS2.0_DOC.chmCSS2.0_DOC.chmCSS2.0_DOC.chmCSS2.0_DOC.chmCSS2.0_DOC.chmCSS2.0_DOC.chm

2011-10-16

CSS 参考手册

CSS 参考手册 CSS 参考手册 CSS 参考手册 CSS 参考手册 CSS 参考手册 CSS 参考手册

2011-10-16

jquery API

jquery API 目前最火的编程js jquery API 目前最火的编程js jquery API 目前最火的编程js jquery API 目前最火的编程js

2011-10-16

将文件等分的方法

将文件等分后,再合到一起,和原来的文件是一样的。

2011-09-21

mineminemine

minemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemine

2011-08-05

Spring依赖注入

对Spring中的依赖注放讲解,里面有例子的,很通俗的一个例子,相信你能看的懂的。

2011-07-03

华为面试题,可以让你看下大公司的面试题

华为面试题,让你去了解大公司的面试题型,让你对大公司有个了解

2011-04-28

java事务处理总结

java事务处理总结,让你正确的去理解java中事务的规范

2011-04-28

javau总结面试题

里面包含了不少面试题的总结,可以从里面学到不少知识的

2011-03-12

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除