1.Properties文件的内容
dbName=sampledb driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/${dbName} #userName=root #password=1234 userName=WnplV/ietfQ= password=gJQ9O+q34qk\=
2.Spring配置
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!--1.使用传统的PropertyPlaceholderConfigurer引用属性文件 --> <!-- bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" p:fileEncoding="utf-8"> <property name="locations"> <list> <value>classpath:com/baobaotao/placeholder/jdbc.properties</value> </list> </property> </bean --> <!--2.使用context命名空间的配置引用属性文件 --> <!--context:property-placeholder location="classpath:com/baobaotao/placeholder/jdbc.properties" file-encoding="utf8"/> <bean id="utf8" class="java.lang.String"> <constructor-arg value="utf-8"></constructor-arg> </bean--> <!--3.使用加密版的属性文件 --> <bean class="com.baobaotao.placeholder.EncryptPropertyPlaceholderConfigurer" p:location="classpath:com/baobaotao/placeholder/jdbc.properties" p:fileEncoding="utf-8"/> <context:component-scan base-package="com.baobaotao.placeholder"/> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${driverClassName}" p:url="${url}" p:username="${userName}" p:password="${password}" /> </beans>
3.加密的java Class文件EncryptPropertyPlaceholderConfigurer.java
package com.baobaotao.placeholder; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer { private String[] encryptPropNames ={"userName","password"}; @Override protected String convertProperty(String propertyName, String propertyValue) { if(isEncryptProp(propertyName)){ String decryptValue = DESUtils.getDecryptString(propertyValue); System.out.println(decryptValue); return decryptValue; }else{ return propertyValue; } } /** * 判断是否是加密的属性 * @param propertyName * @return */ private boolean isEncryptProp(String propertyName){ for(String encryptPropName:encryptPropNames){ if(encryptPropName.equals(propertyName)){ return true; } } return false; } }
使用到的加密工具DESUtils.java
package com.baobaotao.placeholder; import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class DESUtils { private static Key key; private static String KEY_STR = "myKey"; static { try { KeyGenerator generator = KeyGenerator.getInstance("DES"); generator.init(new SecureRandom(KEY_STR.getBytes())); key = generator.generateKey(); generator = null; } catch (Exception e) { throw new RuntimeException(e); } } /** * 对str进行DES加密 * * @param str * @return */ public static String getEncryptString(String str) { BASE64Encoder base64en = new BASE64Encoder(); try { byte[] strBytes = str.getBytes("UTF8"); Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encryptStrBytes = cipher.doFinal(strBytes); return base64en.encode(encryptStrBytes); } catch (Exception e) { throw new RuntimeException(e); } } /** * 对str进行DES解密 * * @param str * @return */ public static String getDecryptString(String str) { BASE64Decoder base64De = new BASE64Decoder(); try { byte[] strBytes = base64De.decodeBuffer(str); Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.DECRYPT_MODE, key); byte[] decryptStrBytes = cipher.doFinal(strBytes); return new String(decryptStrBytes, "UTF8"); } catch (Exception e) { throw new RuntimeException(e); } } public static void main(String[] args) throws Exception { // if (args == null || args.length < 1) { // System.out.println("请输入要加密的字符,用空格分隔."); // } else { // for (String arg : args) { // System.out.println(arg + ":" + getEncryptString(arg)); // } // } System.out.println(getDecryptString("WnplV/ietfQ=")); System.out.println(getDecryptString("gJQ9O+q34qk=")); } }
4.在基于注解的java类中使用属性
package com.baobaotao.placeholder; import org.apache.commons.lang.builder.ToStringBuilder; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Component; @Component public class MyDataSource { @Value("${driverClassName}") private String driverClassName; @Value("${url}") private String url; @Value("${userName}") private String userName; @Value("${password}") private String password; public String toString(){ return ToStringBuilder.reflectionToString(this); } }