缓存的实现是以Jar包的方式引入到项目中使用的,之前说过那么Redis服务器的数据源信息就不能配置在Jar包内部,Jar包是不容易更改的。所以,应该将数据源信息配置在外部,即引入的项目中。这样做遇到了两个问题:一是,配置文件的路径,二是,数据源信息唯一。
路径
这个问题上也花费了一点时间,得到了路径很乱。所以,对JAVA的路径做了一点点了解。要读取资源文件,首先需要了解什么是classpath,即所谓的类路径。
classpath
它描述了Java虚拟机在运行一个Class时在哪些路径中加载要运行的类以及运行的类要用到的类。简单的说,就是像操作系统的path,只不过这个classpath是由Java的虚拟机来使用查找需要加载的类,而操作系统的path是由操作系统用来查找用户输入的可执行程序。
说白了就是你开发的那些类,编译成.class文件之后的存放位置。以本项目为例,它的classpath路径为:E:\ITOO\itoo\ejbredis-cache\target\classes。实际上我们开发目录和发布目录是不一样的,classpath指的是发布后的目录。所以,从target文件夹下找classes就对了。程序的classpath路径可以通过以下方法拿到。
取得资源文件的方法
通过class
this.getClass().getResource("")
得到的是当前类class文件的URI目录。不包括自己!
this.getClass().getResource("/")
得到的是当前的classpath的绝对URI路径。通过class取得路径时,资源名称是否以“/”开始,其相对路径是不一样的。需要注意。
通过classLoader
this.getClass().getClassLoader().getResource("")
得到的也是当前ClassPath的绝对URI路径。
ClassLoader.getSystemResource("")
得到的也是当前ClassPath的绝对URI路径。
该项目下我是通过如下方法取得资源文件的输入流的。这里我规定了,资源文件的位置。然后,根据拦截器得到的目标类,即ctx.getTarget()。然后再通过它的class取得资源文件,即服务器配置信息。
InputStream in =(ctx.getTarget().getClass().getResourceAsStream("/config/cache.xml"));
关于这个路径的知识,推荐一个视频,虽然有点啰嗦但是还算讲解的清楚。
数据源信息的唯一
这个问题是说我现在是通过拦截器得到的目标类,然后去读取资源文件的。但是每次读取文件是极度耗费资源的事情。因此,想到了单例类。EJB是通过@Singleton来实现单例的,先看看这个类吧!
@Singleton @Local(IProperty.class) @ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) public classCacheProperty implements IProperty{ //服务器地址 public String host = "127.0.0.1"; //端口号 public int port = 6379; public int expire = 0; public int timeout = 0; public String password = "" ; public String prefixion = null; //初始化标记 public boolean flag = false; //get\set方法省略 }
这里通过一个标记来标注类是否被初始化过了,从而保证不会每次都去读取配置文件。拦截器中的相关代码如下:
if(cachepro.getFlag() == false){ InputStream in =(ctx.getTarget().getClass().getResourceAsStream("/config/cache.xml")); byte[] byt = newbyte[in.available()]; in.read(byt); cache.init(byt); }
总结:关于配置文件的内容就到这里了,基本上缓存这个部分的内容也就是这么多了。关于类路径这一块其实有的内容没有深入。然后是,这个篇博客说的是,当将jar包的配置文件独立到外部的时候,读取资源文件的路径确定是通过拦截器,拦截到了类去得到的。其他方式我还不懂,敬请指教。