之前做.NET的时候,读取自定义的配置文件都是习惯于用绝对路径的方式,感觉很方便,也没那么多困惑。
刚刚Spring入门的时候,看很多网上的教程都是配置文件放在src根目录下,然后从claspath去读取。然而这样我心里总像有个疙瘩似得,如果有很多配置文件一眼看去一大坨,很不爽,在这一点上感觉好像有强迫症了啊。
如果有想学习java的程序员,可来我们的java学习扣qun:94311,1692免费送java的视频教程噢!我整理了一份适合18年学习的java干货,送给每一位想学的小伙伴,并且每天晚上8点还会在群内直播讲解Java知识,欢迎大家前来学习哦。
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:projectsrcmain esourcesapplicationContext.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文件中创建监听器:
配置配置文件路径
ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。
如果在web.xml中不写任何参数配置信息,默认的路径是"/WEB-INF/applicationContext.xml, 在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。
如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数: 在
也可以这样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)一样的结果
嗯。这样在我心里就有点清楚了。不知各位大侠有更好更合适的方式吗?不妨分享出来让大家见识见识啊?