1-@value
@Value("${keys}")
private String key;
这里需要注意的是
- 当前类要交给spring来管理
- @Value不会赋值给static修饰的变量。
因为Spring的@Value依赖注入是依赖set方法,而自动生成的set方法是普通的对象方法,你在普通的对象方法里,都是给实例变量赋值的,不是给静态变量赋值的,static修饰的变量,一般不生成set方法。若必须给static修饰的属性赋值可以参考以下方法
private static String url;
// 记得去掉static
@Value("${mysql.url}")
public void setDriver(String url) {
JdbcUtils.url= url;
}
但是该方案有个弊端,数组应该如何注入呢?
2-使用对象注入
auth:
clients:
- id:1
password: 123
- id: 2
password: 123
@Component
@ConfigurationProperties(prefix="auth")
public class IgnoreImageIdConfig {
private List<Map<String,String>> clients =new ArrayList<Integer>();
}
利用配置Javabean的形式来获得值,值得注意的是,对象里面的引用名字(‘clients’),必须和yml文件中的(‘clients’)一致,不然就会取不到数据,另外一点是,数组这个对象必须先new出来,如果没有对象的话也会取值失败的,(同理map形式也必须先将map对应的对象new出来)。
3-读取配置文件
private static final String FILE_PATH = "classpath:main_data_sync.yml";
static Map<String, String> result = null;
private static Properties properties = null;
private YmlUtil() {
}
/**
* 读取yml的配置文件数据
* @param filePath
* @param keys
* @return
*/
public static Map<String, String> getYmlByFileName(String filePath, String... keys) {
result = new HashMap<>(16);
if (filePath == null) {
filePath = FILE_PATH;
}
InputStream in = null;
File file = null;
try {
file = ResourceUtils.getFile(filePath);
in = new BufferedInputStream(new FileInputStream(file));
Yaml props = new Yaml();
Object obj = props.loadAs(in, Map.class);
Map<String, Object> param = (Map<String, Object>) obj;
for (Map.Entry<String, Object> entry : param.entrySet()) {
String key = entry.getKey();
Object val = entry.getValue();
if (keys.length != 0 && !keys[0].equals(key)) {
continue;
}
if (val instanceof Map) {
forEachYaml(key, (Map<String, Object>) val, 1, keys);
} else {
String value = val == null ? null : JSONObject.toJSONString(val);
result.put(key, value);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return result;
}
public static Map<String, String> forEachYaml(String keyStr, Map<String, Object> obj, int i, String... keys) {
for (Map.Entry<String, Object> entry : obj.entrySet()) {
String key = entry.getKey();
Object val = entry.getValue();
if (keys.length > i && !keys[i].equals(key)) {
continue;
}
String strNew = "";
if (StringUtils.isNotEmpty(keyStr)) {
strNew = keyStr + "." + key;
} else {
strNew = key;
}
if (val instanceof Map) {
forEachYaml(strNew, (Map<String, Object>) val, ++i, keys);
i--;
} else {
String value = val == null ? null : JSONObject.toJSONString(val);
result.put(strNew, value);
}
}
return result;
}
/**
* 获取Properties类型属性值
* @param filePath classpath:文件名
* @param key key值
* @return
* @throws IOException
*/
public static String getProperties(String filePath,String key) throws IOException {
if (properties == null) {
Properties prop = new Properties();
//InputStream in = Util.class.getClassLoader().getResourceAsStream("testUrl.properties");
InputStream in = new BufferedInputStream(new FileInputStream(ResourceUtils.getFile(filePath))) ;
prop.load(in);
properties = prop;
}
return properties.getProperty(key);
}
public static void main(String[] args) {
/*Map<String, String> cId = getYmlByFileName("classpath:test.yml", "auth", "clients");
//cId.get("")
String json = cId.get("auth.clients");
List<Map> maps = JSONObject.parseArray(json, Map.class);
System.out.println(maps);*/
try {
String properties = getProperties("classpath:test.properties", "fileServerOperator.beanName");
System.out.println(properties);
} catch (IOException e) {
e.printStackTrace();
}
}
auth: #认证
clients:
- id: 1
secretKey: ba2631ee44149bbe #密钥key
- id: 2
secretKey: ba2631ee44149bbe #密钥key