加载资源文件注意地方
第一种方式读取资源文件
资源文件必须放在src目录下面或者src包里面
1.定义一个properties对象
private properties pros = new Properties();
static{
try {
//推荐使用这种方式加载配置文件
InputStream in = BeanFactory.class.getClassLoader().getReSourceAsStream("bean.properties");
/**/绝对不能用,web工程一旦发布,就没有Src目录**
/**InputStream in = new FileInputStream("src/bean.properties");*/
pros.load(in);
} catch(Exception e){
throw new ExceptionInInitializerError("加载配置文件失败"+e);
}
}
public static void main(String[] args){
System.out.println(pros.get("CUSTOMERDAO"));
}
第二种方式读取资源文件
更简单的一种方式加载properties资源文件
//1.他只能用于读取properties文件,别的读不了
2.他只能用于读取,不能写入
3.他只能读取类路径下,不在类路径下读取不了
注意:它的方法参数的写法是按照包名,类名的方式写的,所有请不要写扩展名
private static ResourceBundle hundle = ResourceBundle.getBuldle("bean");
//根据bean的名称创建类对象(工厂设计模式解耦)
//以前直接new 对象,强制关系太强
//控制权发生改变就叫控制反转,降低依赖关系(解耦)
public static Object getBean(String beanName){
try {
1.读取配置文件,跟据beanName获取全限定类名
String beanPath = bundle.getString(beanName);
return Class.forName(beanPath).newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
线程安全问题(jvm里面有六个区域)
工厂设计模式每次创建的对象都是不同的实例
这里只讨论两个(堆和栈)
图示的堆里面service对象里面有一个customer变量
每次线程访问这个变量都指向不同的变量,如果第一个线程访问这个变量并且更改这个变量值之后,再来一个线程访问的就是更改之后的变量,存在线程不安全问题(把变量放在方法里面可以避免这种情况,每次访问这个都是不同的变量),我们不要在类里面定义类成员。