一、好处
- 实现了数据和代码的分离,解耦
- 编写的java程序部署到服务器上时,需要打包,如果java代码修改过,就需要重新打包;而使用配置文件则不需要修改代码,所以不用重新打包。
二、实现方式
- 在src目录下新建一个.properties文件
- 获取资源文件的输入流。
- 获取配置文件中的信息
- 连接数据库
static { Properties pros = new Properties(); InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties"); // JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"); try { pros.load(is); } catch (IOException e) { e.printStackTrace(); } classname = pros.getProperty("classname"); url = pros.getProperty("url"); user = pros.getProperty("user"); password = pros.getProperty("password"); try { Class.forName(classname); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
classname=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/shop user=root password=123456
三、获取资源文件输入流的方法
以下部分为自己当前的理解,未必正确
我们在scr目录下配置文件,因为当web项目进行部署时,编译器会把src下资源文件(配置文件和java文件编译成的字节码文件)移至WEB-INF/classes目录下,而类加载器默认是从classpath下获取资源的(这里的classpath就是classes目录,因为class文件一般存放于此),故通过ClassLoader.getSystemClassLoader()返回ApplicationClassLoader对象(应用类加载器/系统类加载器,负责在JVM启动时,加载来自在命令java中的classpath或者java.class.path系统属性或者CLASSPATH操作系统属性所指定的JAR类包和类路径.),就可以加载classpath下的class文件,再通过getResourceAsStream()方法,直接将配置文件名传入参数即可以获得该目录下的配置文件的输入流
同样JdbcUtils(类名).class.getClassLoader().getResourceAsStream(“jdbc.properties”)也可以用于获取配置文件的输入流,.class用于获取类的class对象,getClassLoader()是获取当前的类加载器(用来加载java类的,负责把class文件加载进内存中,并创建一个java.lang.Class类的一个实例),通过该类加载器同样可以获取资源文件,因为一个类的加载器的classpath自然也指向这个类编译成的类文件的目录(这样才能加载到该类),而JdbcUtils类编译成的class文件也同样在classes目录下,那么就可以用它获取classes目录下的配置文件
而如果我们把配置文件放在于类同级的目录下(即包中),则填写路径时需要加上包名,例如getResourceAsStream(“utils/jdbc.properties”),因为classpath只到classes目录,需要自己补齐对应的相对路径