我们应该明白,spring的依赖注入的最大亮点是你所有的Bean对Spring容器的存在是没有意识的,我们可以将Spring容器换成其他的容器,Spring容器中的Bean的耦合度因此也是极低的。
但是我们在实际的开发中,我们却经常要用到Spring容器本身的功能资源,所以Spring容器中的Bean此时就要意识到Spring容器的存在才能调用Spring所提供的资源。我们通过Spring提供的一系列接口Spring Aware来实现具体的功能。
首先介绍一下Spring所提供的Aware接口:
BeanNameAware 获得到容器中Bean的名称
BeanFactoryAware 获得当前bean Factory,从而调用容器的服务
ApplicationContextAware 当前的application context从而调用容器的服务
MessageSourceAware 得到message source从而得到文本信息
ApplicationEventPublisherAware 应用时间发布器,用于发布事件
ResourceLoaderAware 获取资源加载器,可以获得外部资源文件
也就是说:在Java类中可以通过文件流等的形式加载外部资源文件,并能读取资源文件中的配置,通过下面的get属性可以获取Properties中
的配置属性。
public final class SettingsBean implements ResourceLoaderAware{
private Properties settings;
private ResourceLoader loader;
private static final String SETTINGS_FILE = "classpath:/config/settings.properties";
public Properties getSettings() {
return settings;
}
public void setProperty(String key,String value){
settings.setProperty(key, value);
}
public String getProperty(String key){
return settings.getProperty(key);
}
public double getDouble(String key){
return Double.parseDouble(settings.getProperty(key));
}
public int getInteger(String key){
return Integer.parseInt(settings.getProperty(key));
}
public void save(){
try {
OutputStream outputStream = new FileOutputStream(loader.getResource(SETTINGS_FILE).getFile());
settings.store(outputStream, "");
outputStream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void setResourceLoader(ResourceLoader loader) {
this.loader = loader;
try {
FileInputStream inputStream = new FileInputStream(loader.getResource(SETTINGS_FILE).getFile());
settings = new Properties();
settings.load(inputStream);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}