org.apache.tools.*需要的ant.jar包
java调用ant构建打包,java调用ant构建打包,java调用ant构建打包,java调用ant构建打包,
.chm文件制作
.chm文件制作
里要制作的是"王长喜CET-4课堂",首先在硬盘中将所有有关的资料融合到一个文件夹中,这将大大方便后期的制作。
spring定时器关于表达式的说明
spring定时器关于表达式的说明
怎样读取properties文件内容
怎样读取properties文件内容,用java中最基本的方式去读取properties文件中的内容
myEclise反编译插件
myEclise反编译插件myEclise反编译插件
exe4j破解注册码4.11版本
exe4j破解注册码4.11版本,将你的java程序转化为window桌面可执行程序。
myEclipse自动关闭问题
myEclipse自动关闭问题myEclipse自动关闭问题
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定义这块,只作为一个参考,希望对其他朋友能有所帮助吧,因为时间匆忙,有错漏的地方请指正。
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
springAOP笔记
springAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOPspringAOP
js控制上传文件的大小
js控制上传文件的大小js控制上传文件的大小js控制上传文件的大小js控制上传文件的大小js控制上传文件的大小js控制上传文件的大小js控制上传文件的大小
javaSE部分内容
javaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSEjavaSE
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
CSS 参考手册
CSS 参考手册 CSS 参考手册 CSS 参考手册 CSS 参考手册 CSS 参考手册 CSS 参考手册
jquery API
jquery API 目前最火的编程js jquery API 目前最火的编程js jquery API 目前最火的编程js jquery API 目前最火的编程js
将文件等分的方法
将文件等分后,再合到一起,和原来的文件是一样的。
mineminemine
minemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemineminemine
Spring依赖注入
对Spring中的依赖注放讲解,里面有例子的,很通俗的一个例子,相信你能看的懂的。
华为面试题,可以让你看下大公司的面试题
华为面试题,让你去了解大公司的面试题型,让你对大公司有个了解
java事务处理总结
java事务处理总结,让你正确的去理解java中事务的规范
javau总结面试题
里面包含了不少面试题的总结,可以从里面学到不少知识的