美文网首页
#一般Java配置和Spring配置文件的加载路径

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

作者: Web前端学习营 | 来源:发表于2018-12-10 13:17 被阅读41次

    之前做.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文件中创建监听器:

    <listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

    配置配置文件路径

    <context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>/WEB-INF/config/appContext.xml</param-value>

    </context-param>

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

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

    如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数: 在<param-value> </param-value>里指定相应的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)一样的结果

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

    相关文章

      网友评论

          本文标题:#一般Java配置和Spring配置文件的加载路径

          本文链接:https://www.haomeiwen.com/subject/jmurhqtx.html