如何用Springspring 读取jar xml中的文件

如何用Spring读取JAR中的文件_百度知道spring怎么获取在jar包中自定义注解的实体类上的注解?_百度知道  最近没什么实质性的工作,正好有点时间,就想学学别人的代码。也看过一点源码,算是有了点阅读的经验,于是下定决心看下spring这种大型的项目的源码,学学它的设计思想。
  手码不易,转载请注明:
  这篇博文你可以了解到:
  1 Spring jar包以及源码使用
  2 简单的spring运行示例
  3 利用断点调试程序,如何快速的阅读程序【快捷键等的使用】
  这次阅读的源码比较老了,是3.0.5版本的,由于正好手头有这个版本的源码,而且平时基本上也是用的这个版本Spring,因此后文的分析也都是针对这个版本。
  下面贡献一下,由于百度云上传的压缩包总是解压失败,就放在csdn上面了。
如何使用jar包以及源码的source包
  首先,在工程右键,属性中,添加必要的jar包。
  选中必要的jar包,上面给出的源码jar包中,导入spring3.0.5中的所有jar包。
  其中lib内的是spring的jar包,用到哪个导入哪个,不知道的话,全部导入就行了。
  外面的几个jar包,用于日志以及mysql的驱动。commons-logging jar包是必须的,其他的随意吧。
  不确定的话,lib外面的这几个jar包以及lib里面的都导入就行了。
  导入jar包后,点开jar包,选中source attachment进行编辑,链接到源码的jar包。
  选择相应的source源码包
  全部导入后,如下
spring样例
  首先是一个必要的POJO类,用于注入属性的值。
1 package com.test.
3 public class Person {
private int
public String getName() {
public void setName(String name) {
this.name =
public int getAge() {
public void setAge(int age) {
this.age =
public void info(){
System.out.println("name:"+getName()+" age:"+getAge());
  主函数,用于读取资源文件,获取bean,调用info方法
1 package testS
3 import org.springframework.context.ApplicationC
4 import org.springframework.context.support.ClassPathXmlApplicationC
6 import com.test.bean.P
8 public class test {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");//读取bean.xml中的内容
Person p = ctx.getBean("person",Person.class);//创建bean的引用对象
  bean.xml用于配置bean的资源文件
1 &?xml version="1.0" encoding="UTF-8"?&
2 &beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"&
&bean id="person" class="com.test.bean.Person"&
&property name="name" value="xingoo"/&
&property name="age" value="12"/&
10 &/beans&
  运行结果
  首先,有了前面的jar包以及源码包,你就可以通过这个简单的程序,进行但不的调试,阅读源码。
  简单的说下调试的快捷键:
  1 F5:下一步,可以进入下一个函数栈
  2 F6:当前函数的下一步,不会进入其他的函数。
  3 F8:下一个断点。
  4 也可以通过选中一个变量或者表达式,按ctrl+shift+i 来查看内容。或者添加监视的方式,查看。
  5 可以通过快捷键F2,来查看一个函数方法的javadoc,即说明
  6 快捷键F3或者ctrl+鼠标点击,进入一个函数
  7 ctrl+shift+G 查看当前方法都有谁在使用
  8 F4查看类的继承关系,可以向上显示出类继承的父类以及接口。
  有了调试的方法,接下来,就是如何阅读源码了!
  1 参考书籍,推荐《Spring技术内幕》
  这本书,基本上很详细的讲述了,spring的实现方式,以及类之间的复杂关系。可以帮助你快速的理清复杂的类之间的关系。
  2 使用StarUML画类图
  比如你好不容易理清了一个部分的关系,很快就会忘记其中的关系,那么可以通过这个工具,简单的画出其中的复杂关系。
  这样,下一次看的时候也会清楚一些,这是我今天刚画好的ClassPathXmlApplicationContext的类图关系:
阅读(...) 评论()<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&博客访问: 99832
博文数量: 60
博客积分: 1400
博客等级: 上尉
技术积分: 355
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Java
大家可能经常会遇到在Java程序中存取程序配置文件的需求,比如,为了能够和不同的数据库连接,我们经常把数据库连接的信息存放到属性文件中,这些信息一般包括数据库驱动程序类名、数据库连接的URL,数据库的用户名和口令等等。为了便于程序的安装或部署,我们经常会把这些的配置文件存放到程序安装的根目录中。由于Java程序用包来分组类,有时候将这些配置文件放入到读取它们的类所在的包目录中会更好一些。比如,在下面的图示中,将数据库配置文件 database.properties放到数据库读取类所在的包目录就是一种比较清晰的存储方案:/-----------其它包目录||-------edu.ec.database||---------------ConnectionPool(数据库连接池类)||---------------Dao(数据库访问对象类)||---------------DaoFactory(Dao的工厂类)||---------------database.properties(数据库配置属性文件)||---------------RecordSet(记录集类)在这种存储方案中,所有的与数据库相关的类和配置文件都在同一个包目录中;在开发过程中,配置文件和源文件也按采用这种方式进行组织,这样会使得程序的数据库访问维护变得相当清晰明了。大部分开发工具在编译打包这样的源文件组织时,会自动将相关配置文件和类文件放到生成的目标文件夹中或JAR文件中。一般情况下,我们在发布自己的 Java程序时,都是以JAR或WAR形式将程序打包发布,而对应的配置文件也会按照上述的目录格式被放到了JAR或WAR文件中,这样,就实现了配置文件和程序文件打包在一起发布的目的。现在的问题是,我们如何读取位于程序安装文件中的配置文件的信息?比如,在上面的图中, ConnectionPool是一个数据库连接池类,它需要在系统启动时自动读取存储在database.properties中的数据库连接和配置信息,以便设置相关的数据库连接。这样,我们 就需要在程序中测定目前程序安装或部署的位置,以便读取对应的属性文件。在很多其他语言编写的程序中,我们可以利用一些系统提供的API或一些全局对象获取目前应用程序运行所在的目录。比如VB,我们可以使用Application对象测定当前程序的安装位置,在Java程序中如何完成类似的任务呢?Java程序并没有类似于VB那种全局对象,但如果我们观察位于上述目录结构中的database.properties文件,应该发现其处于应用程序的CLASSPATH中,这样,我们就可以使用Java中的类装载器中的相关的方法,读出这些配置文件的信息,该类名为ClassLoader。比如,在上例中,我们可以先得到ConnectinPool的类装载器,然后测定ConnectionPool类所在的包路径,然后利用 ConnectionPool所在的包目录读出database.properties文件的信息,对应的伪代码如下:ClassLoader loader=ConnectionPool.class.getClassLoader();得到ConnectionPool所在的包名;将包名转换为对应的目录名,存入一个名为path的字符串变量中;调用loader的getResourceAsStream(path+"database.properties"),得到输入流下面是一个可实际运行的样例代码片段,它可自动测定传入的类所在的包目录,返回传入的属性文件所代表的输入流。它还有一个附加的功能:如果属性文件直接放到了当前类所在的根目录(比如位于JAR文件的根目录或WAR文件的WEB-INF/classes目录中)、系统的用户目录系统、系统其他的类路径中时,它也可以找到;当然,如果还是找不到,它将返回null。具体的代码如下:public class PropHelper{/***guessPropFile:*@param cls:和要寻找的属性文件处于相同的包中的任意的类*@param propFile:要寻找的属性文件名*/public static java.io.InputStream guessPropFile(Class cls,String propFile){try{//得到类的类装载器ClassLoader loader=cls.getClassLoader();//先从当前类所处路径的根目录中寻找属性文件java.io.InputStream in=loader.getResourceAsStream(propFile);if(in!=null)//没有找到,就从该类所处的包目录中查找属性文件Package pack=cls.getPackage();if(pack!=null){String packName=pack.getName();String path="";if(packName.indexOf(".") < 0 )&#160;path=packName+"/";else{int start=0,end=0;end=packName.indexOf(".");while(end!=-1){path=path+packName.substring(start,end)+"/";start=end+1;end=packName.indexOf(".",start);}path=path+packName.substring(start)+"/";}in=loader.getResourceAsStream(path+propFile);if(in!=null)}//如果没有找到,再从当前系统的用户目录中进行查找java.io.File f=String curDir=System.getProperty("user.dir");f=new java.io.File(curDir,propFile);if(f.exists()) return new java.io.FileInputStream(f);//如果还是没有找到,则从系统所有的类路径中查找String classpath=System.getProperty("java.class.path");String[] cps=classpath.split(System.getProperty("path.separator"));for(int i=0;i < cps. i++){f=new java.io.File(cps[i],propFile);if(f.exists())f=}if(f!=null) return new java.io.FileInputStream(f);}catch(Exception e){throw new RuntimeException(e);}}}使用举例:利用上述的方法,可在ConnectionPool中自动查找和ConnectionPool处于同一个包目录中的database.properties的输入流,并利用该输入流读入对应的属性值的代码如下:public class ConnectionPool{//静态初始化器,将在ConnectionPools加载时自动执行static{java.util.Properties dbProp=new java.util.Properties();java.io.InputStream in=PropHelper.guessPropFile(edu.ec.database.ConnectionPool.class,"database.properties");if(in!=null) dbProp.load(in);//利用dbProp,为相应的数据源对象设置相关的属性,比如C3P0........}}评论deadcode 写道程序打包成Jar发布后,应该将配置文件放在jar的当前同级目录,访问调用直接访问,如&#160;java.util.Properties pro = new java.util.Properties();&#160;InputStream inStream = new java.io.FileInputStream("database.properties");pro.load(inStream);&#160;如果是打包成WAR发布,则放在适合LZ的方法现在,guessPropFile可以自动在如下位置中寻找属性文件:&#160;在未打包的Java程序的类文件所在的根目录中寻找属性文件 在打包的JAR程序的根目录中寻找属性文件 在未打包的Java类文件所在的根目录中对应传入参数类所在的包目录中寻找属性文件 在打包的JAR文件中对应传入参数类所在的包目录中寻找属性文件 在未打包及打包的WAR文件夹中的WEB-INF/classes目录中寻找属性文件 在未打包及打包的WAR文件中的WEB-INF/classes目录中对应传入参数类所在的包目录中寻找属性文件 在操作系统中的当前登录用户的主目录中寻找属性文件 在系统设定的环境变量CLASSPATH所指向的各个目录中寻找属性文件&#160;其实,guessPropFile方法还可做的更加智能一些,比如在WAR文件的WEB-INF文件中寻找属性文件。如果要完成这个任务,ClassLoader是关键类,利用它的getResource方法,就可以获得相应程序中的资源的位置,我们可以在它的基础上稍加修改就可获得当前Java程序的运行位置信息,其伪代码如下:&#160;获得Class参数的所在的类名&#160;取得该类所在的包名&#160;将包名转换为路径&#160;利用getResource得到当前的类文件所在URL&#160;利用URL解析出当前Java程序所在的路径&#160;具体代码如下:&#160;public class PropHelper{ //其他方法的定义 //............. /** *getAppPath需要一个当前程序使用的Java类的class属性参数,它可以返回打包过的 *Java可执行文件(jar,war)所处的系统目录名或非打包Java程序所处的目录 *@param cls为Class类型 *@return 返回值为该类所在的Java程序运行的目录 */ public static String getAppPath(Class cls){ ClassLoader loader=cls.getClassLoader(); String clsName=cls.getName()+".class"; Package pack=cls.getPackage(); String path=""; if(pack!=null){ String packName=pack.getName(); clsName=clsName.substring(packName.length()+1); if(packName.indexOf(".")-1) realPath=realPath.substring(pos+5); pos=realPath.indexOf(path+clsName); realPath=realPath.substring(0,pos-1); if(realPath.endsWith("!")) realPath=realPath.substring(0,realPath.lastIndexOf("/")); return realP }//getAppPath定义结束 }//PropHelper类定义结束&#160;在getAppPath方法的帮助下,我们可以测定当前程序运行的路径是不是包含WEB-INF/classes路径信息,如果是,则当前程序就可能是运行在Web环境中,这样,就可以对guessPropFile中的代码进行增加,加入在WEB-INF文件夹寻找属性文件的方法。
阅读(3086) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 spring读取xml文件 的文章

 

随机推荐