### Hibernate配置文件加载后修改配置信息 在Java开发过程中,特别是在使用ORM框架如Hibernate时,开发者经常需要对配置文件中的数据库连接信息进行动态修改或加密处理。本文将详细介绍如何利用反射机制来修改已经加载到内存中的`hibernate.cfg.xml`配置文件中的信息,并将这些配置信息提取到其他路径下的过程。 #### 一、了解Hibernate配置文件 在Hibernate框架中,`hibernate.cfg.xml`是其核心配置文件之一,用于指定Hibernate运行时所需的环境设置。该文件通常包含以下几类配置信息: - 数据库连接信息(例如:URL、用户名、密码等)。 - 使用的方言(Dialect)。 - 事务管理方式。 - 缓存策略等。 #### 二、反射机制简介 反射机制是Java语言的一个重要特性,它允许程序在运行时访问类的信息并进行操作。通过反射,我们可以动态地创建对象、调用方法、获取和设置字段值等。在本案例中,我们将利用反射来访问Hibernate内部的环境配置类`Environment`,进而修改数据库连接信息。 #### 三、修改Hibernate配置信息 ##### 1. 获取Hibernate配置信息 我们需要找到Hibernate配置文件中存储数据库连接信息的方式。根据提供的部分代码示例,可以看到`hibernate.cfg.xml`中定义了数据库连接URL的信息,其对应的属性名为`hibernate.connection.url`,并且通过`Environment.class`中的静态常量`URL`来获取。 ```java // Environment.class public static final String URL = "hibernate.connection.url"; ``` 此外,我们还可以看到,通过反射获取到的属性值可以通过`Properties`对象进行修改。 ##### 2. 修改配置信息 为了实现对数据库连接信息的修改,我们需要创建一个自定义的`ConnectionProvider`类,继承自`DriverManagerConnectionProvider`,并在其中覆盖`configure`方法。在这个方法中,我们可以读取原始配置信息,并对其进行加密或其他处理。 ```java public class CustomDriverManagerConnectionProvider extends DriverManagerConnectionProvider { public CustomDriverManagerConnectionProvider() { super(); } public void configure(Properties props) throws HibernateException { String user = props.getProperty(Environment.USER); String password = props.getProperty(Environment.PASS); String url = props.getProperty(Environment.URL); // 加密处理 props.setProperty(Environment.USER, SecUtil.decrypt(user)); props.setProperty(Environment.PASS, SecUtil.decrypt(password)); props.setProperty(Environment.URL, SecUtil.decrypt(url)); super.configure(props); } } ``` 在此基础上,我们还需要在`hibernate.cfg.xml`文件中指定使用自定义的`ConnectionProvider`: ```xml <!-- hibernate.cfg.xml --> <property name="connection.provider_class"> com.CustomDriverManagerConnectionProvider </property> ``` 这样,在Hibernate启动时,就会使用我们的自定义类来初始化数据库连接。 ##### 3. 利用反射修改配置 通过反射机制,我们可以获取到`Environment`类中的属性,进而修改`Properties`对象中的配置信息。具体实现方式如下: ```java // 获取Environment类的Class对象 Class<?> envClass = Class.forName("org.hibernate.cfg.Environment"); // 获取URL属性 Field urlField = envClass.getField("URL"); // 设置为可访问 urlField.setAccessible(true); // 获取原始URL值 String originalUrl = (String) urlField.get(null); // 修改URL String newUrl = SecUtil.encrypt(originalUrl); // 设置新的URL值 props.setProperty((String) urlField.get(null), newUrl); ``` 通过这种方式,我们可以在程序运行时动态修改配置文件中的信息,提高了系统的灵活性和安全性。 #### 四、总结 本文介绍了如何利用反射机制来修改Hibernate配置文件中的数据库连接信息,并通过自定义`ConnectionProvider`实现了对敏感信息的加密处理。这种做法不仅增强了应用程序的安全性,还提高了配置信息的管理效率。开发者可以根据实际需求调整加密算法或其他处理逻辑,以满足不同的应用场景。
hibernate提供的Environment.class类可以获取hibernate.cfg.xml配置文件的配置信息,在程序运行期间进行改变。
例如
1) Environment.class类中
public static final java.lang.String URL=”hibernate.connection.url”;
2) 在hibernate.cfg.xml配置文件中,name的属性值与Environment.class中的相同。
<property name="connection.url">
jdbc:oracle:thin:@192.168.131.202:1521:ORCLSZ
</property>
在配置文件中设置connection.provider_class类,从而当运行时在该类中获取hibernate.cfg.xml配置文件中的值,同时可以回写相应的值。
<property name="connection.provider_class">
com.CustomDriverManagerConnectionProvider
</property>
public class CustomDriverManagerConnectionProvider extends DriverManagerConnectionProvider
{
public CustomDriverManagerConnectionProvider() {
super();
}
public void configure(Properties props) throws HibernateException{
String user = props.getProperty(Environment.USER);
String password = props.getProperty(Environment.PASS);
String url = props.getProperty(Environment.URL);
props.setProperty(Environment.USER, SecUtil.decrypt(user));
props.setProperty(Environment.PASS, SecUtil.decrypt(password));
props.setProperty(Environment.URL,SecUtil.decrypt(url));
super.configure(props);
}
- liang_A2012-03-02不是动态加载hbm配置文件的例子
- 沼川2013-10-23实现代码不是很完全
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助