一般Java配置和Spring配置文件的加载路径

之前做.NET的时候,读取自定义的配置文件都是习惯于用绝对路径的方式,感觉很方便,也没那么多困惑。

刚刚Spring入门的时候,看很多网上的教程都是配置文件放在src根目录下,然后从claspath去读取。然而这样我心里总像有个疙瘩似得,如果有很多配置文件一眼看去一大坨,很不爽,在这一点上感觉好像有强迫症了啊。

一般Java配置和Spring配置文件的加载路径

1. Spring使用ClassPathXmlApplicationContext 从classpath读取

ClassPathXmlApplicationContext 默认会去 classPath 路径下找。classPath 路径指的就是编译后的 classes 目录。

1.1 如果配置文件在classpath目录下:

ClassPathXmlApplicationContext tx = new ClassPathXmlApplicationContext("appContext2.xml");

1.2 如果一个包专门用来存配置文件

ClassPathXmlApplicationContext tx = new ClassPathXmlApplicationContext("//my/config/appContext2.xml");

或者

ClassPathXmlApplicationContext tx = new ClassPathXmlApplicationContext("my/config/appContext2.xml");

其实这两种都是相对于classpath路径的路径

1.3 也可以绝对路径获取,但是路径前要加“file”

BeanFactory beanFactory = new ClassPathXmlApplicationContext("file:E:projectsrcmainesourcesapplicationContext.xml");

2. Spring使用FileSystemXmlApplicationContext加载

FileSystemXmlApplicationContext 默认是去项目的路径下加载,可以是相对路径,也可以是绝对路径,若是绝对路径,“file:” 前缀可以缺省。

2.1 使用FileSystemXmlApplicationContext也可以从classpath加载,要在路径前添加classpath前缀

FileSystemXmlApplicationContext tx = new FileSystemXmlApplicationContext("classpath:my/config/appContext2.xml");

2.2 以绝对路径形式加载

FileSystemXmlApplicationContext tx = new FileSystemXmlApplicationContext("d:/my/config/appContext2.xml");

当然 这里比较好的做法是程序运行期间动态的算出绝对路径,避免直接在代码里写死一个绝对路径。

3. SpringMvc使用WebApplicationContext

在Web项目中,可以使用ContextLoaderListener 自动装配ApplicationContext的信息。

在web.xml文件中创建监听器:

org.springframework.web.context.ContextLoaderListener

配置配置文件路径

contextConfigLocation

/WEB-INF/config/appContext.xml

ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。

如果在web.xml中不写任何参数配置信息,默认的路径是"/WEB-INF/applicationContext.xml, 在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。

如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数: 在 里指定相应的xml文件名,如果有多个xml文件,可以写在一起并以“,”号分隔。

也可以这样applicationContext-*.xml采用通配符,比如这那个目录下有applicationContext-ibatis-base.xml,

applicationContext-action.xml,applicationContext-ibatis-dao.xml等文件,都会一同被载入。

4. Java中的路径读取

封装一个方法获取classpath绝对路径:

public static String getRealPath(String file) {

String path = PathUtils.class.getClassLoader().getResource(file).getPath();

return path;

}

class.getResource("")要想获得文件的路径,得从最终生成的.class文件为着手点,再结合相对路径的概念,就可以准确地定位资源文件了。不同的IDEbuild出来是不同的位置下的,不过都是以顶层package作为根目录,比如在Web应用中,有一个WEB-INF的目录,WEB-INF目录里面除了web.xml文件外,还有一个classes目录,它就是这个WEB应用的package的顶层目录,也是所有.class的根目录“/”,假如clasaes目录下面有一个mynewfile.txt文件,它的相对路径就是"/mynewfile.txt",如果相对路径不是以"/"开头,那么它就是相对于.class的路径。

class.getClassLoader().getResource 如果是getClassLoader().getResource,路径前加不加"/"都是可以的,比如Home.class.getClassLoader().getResource("my/config/file1.html")和Home.class.getClassLoader().getResource("/my/config/file1.html")都是可以的。

还有一个getResourceAsStream()方法,参数是与getResouce()方法是一样的,它相当于你用getResource()取得File文件后,再new InputStream(file)一样的结果

嗯。这样在我心里就有点清楚了。不知各位大侠有更好更合适的方式吗?不妨分享出来让大家见识见识啊?


分享到:


相關文章: