少し機密性の高いデータに対して文字列操作を行う静的utilクラスがあります。このクラスを使用する前に、.properties
ファイルに保存したいユーザー名/パスワードなどの値で特定の静的変数を初期化する必要があります。
.properties
ファイルのロードがJavaでどのように機能するか、特に* Spring DI *コンテナの外部ではあまり詳しくありません。誰でも私にこれをどのように行うことができるかについての手掛かり/洞察を与えることができますか?
ありがとうございました!
追加:.properties
ファイルの正確な場所は不明ですが、クラスパス上にあります。 classpath:/my/folder/name/myproperties.propeties
のような
チェックアウト Java.util.Properties 。
静的初期化子を使用できます。したがって、クラスの上で次のことができます。
static {
Properties props = new Properties();
InputStream Steam = ...; // open the file
props.load(stream);
// process properties content
String username = props.getProperty("username");
}
次のいずれかを使用します。
CurrentClassName.class.getResourceAsStream
new FileInputStream(File)
クラスがクラスパスにあるかクラスパスにないかに応じて、入力ストリームを取得します。次に使用します
Properties.load
プロパティをロードします。
久しぶりですが、私が正しく覚えていれば、次のようなことをするだけです。
Properties prop = new Properties();
prop.load(new FileInputStream(filename));
//For each property you need.
blah = prop.getProperty(propertyname);
私にとってMyClass.class.getClassLoader().getResourceAsStream(..)
はトリックをしました:
private static final Properties properties;
static {
Properties fallback = new Properties();
fallback.put(PROP_KEY, FALLBACK_VALUE);
properties = new Properties(fallback);
try {
try (InputStream stream = MyClass.class.getClassLoader().getResourceAsStream("myProperties.properties")) {
properties.load(stream);
}
} catch (IOException ex) {
// handle error
}
}
静的プロパティの場合、クラスに1回読み込まれるシングルトンとして初期化することは理にかなっています。次に例を示します。
class Example
{
public final static String PROPSFILE = "test.properties";
private static Properties props;
protected static Properties getProperties()
{
if(props == null)
{
props = new Properties();
props.load(new FileInputStream(new File(PROPSFILE));
}
return props;
}
public static User getUser()
{
String username = getProperties().getProperty("username");
return new User(username);
}
}
相対パス名を使用する場合は、クラスパスが正しく設定されていることを確認してください。
私は@Daffに同意します。シングルトンクラスを使用する方が良いかもしれません。これは、同様の要件のためにプロジェクトに持っているものです。
クラスのクライアントは次のように使用できます。
ConfigsLoader configsLoader = ConfigsLoader.getInstance("etc/configs.xml");
System.out.format("source dir %s %n", configsLoader.getSourceDir());
そしてクラス:
パブリッククラスConfigsLoader {
private String sourceDir;
private String destination;
private String activeMqUrl;
private static Logger log = Logger.getLogger(ConfigsLoader.class.getName());
private static ConfigsLoader instance = null;
private ConfigsLoader(String configFileName) {
log.info("loading configs");
Properties configs = new Properties();
try {
configs.loadFromXML(new FileInputStream(configFileName));
sourceDir = configs.getProperty("source.dir");
destination = configs.getProperty("destination");
activeMqUrl = configs.getProperty("activemqconnectionurl");
configs.setProperty("lastLoaded", new SimpleDateFormat("yyyy-M-d HH:mm").format(new Date()));
configs.storeToXML(new FileOutputStream(configFileName), "saving last modified dates");
} catch (InvalidPropertiesFormatException e) {
log.log(Level.SEVERE,"Error occured loading the properties file" ,e);
} catch (FileNotFoundException e) {
log.log(Level.SEVERE,"Error occured loading the properties file" ,e);
} catch (IOException e) {
log.log(Level.SEVERE,"Error occured loading the properties file" ,e);
}
}
public static ConfigsLoader getInstance(String configFileName) {
if(instance ==null) {
instance = new ConfigsLoader(configFileName);
}
return instance;
}
public String getSourceDir() {
return sourceDir;
}
public void setSourceDir(String sourceDir) {
this.sourceDir = sourceDir;
}
public String getDestination() {
return destination;
}
public void setDestination(String destination) {
this.destination = destination;
}
public String getActiveMqUrl() {
return activeMqUrl;
}
public void setActiveMqUrl(String activeMqUrl) {
this.activeMqUrl = activeMqUrl;
}
}
最後に、静的コードブロックが書き込まれているクラスに関連付けられたgetResourceAsStream()関数を使用してこれを行いました。
//associate Property and ImputStream imports
public class A {
static Properties p;
static {
p = new Properties();
try {
InputStream in = A.class.getResourceAsStream("filename.properties");
p.load(in);
} catch (FileNotFoundException e) {
System.out.println("FileNotFoundException");
e.printStackTrace();
} catch (IOException e) {
System.out.println("IOException");
e.printStackTrace();
}
}
.
.
.
}