/**
* 一个创建Bean对象的工厂
*
* Bean:在计算机英语中,有可重用组件的含义。
* JavaBean:用java语言编写的可重用组件。
* javabean > 实体类
*
* 它就是创建我们的service和dao对象的。
*
* 第一个:需要一个配置文件来配置我们的service和dao
* 配置的内容:唯一标识=全限定类名(key=value)
* 第二个:通过读取配置文件中配置的内容,反射创建对象
*
* 配置文件可以是xml也可以是properties
*/
public class BeanFactory{
//定义一个properties对象
private static Properties properties;
//定义一个Map,用于存放我们要创建的对象, 我们把它称之为容器, 创建一个存起来,这样创建的对象就成为了单实例对象
private static Map<String,Object> beans;
/**
* 首先,static{}(静态代码块)在程序加载中static是先于构造方法加载的,并且只会加载一次。
* 两外static块中只能使用static修饰的属性。
* 程序中的static{}块只是为了加载properties文件信息,这个加载只会被加载一次。
*/
//使用静态代码块为properties赋值
static {
try {
//实例化对象
// properties = new Properties ();
// //获取properties文件的流对象
//InputStream inputStream=new FileInputStream ();//不能使用此方式,文件具体路径可能并不确定
InputStream inputStream=BeanFactory.class.getClassLoader ().getResourceAsStream ("bean.properties");
properties.load (inputStream);
//实例化容器
beans=new HashMap<String,Object> ();
//取出配置文件中所有的Key
//Enumeration keys=properties.keys ();
Set keys= properties.keySet ();
//遍历
for (Object obj: keys) {
//获取key
String key=(String)obj;
//根据key获取value
String beanPath=properties.getProperty (key);
try {
//反射创建对象
Object value=Class.forName (beanPath).newInstance ();
//把key和value存入容器之中
beans.put (key,value);
} catch (Exception e) {
e.printStackTrace ();
}
}
} catch (IOException e) {
throw new ExceptionInInitializerError ("初始化失败!");
}
}
/**
* 在getBean时实例化一个对象,每次调用getBean时都会实例化一个新的对象,多实例
* 多例对象被创建多次,执行效率不如单例对象
* @param beanName
* @return
*/
public static Object getBean(String beanName){
//Object bean=null;
//try {
// //beanPath : com.itheima.service.impl.AccountServiceImpl
// String beanPath=properties.getProperty (beanName);
// /**
// * Class.forName (beanPath).newInstance ();
// * newInstance () 每次都会调用默认构造函数创建对象
// */
// bean=Class.forName (beanPath).newInstance ();
//} catch (Exception e) {
// e.printStackTrace ();
//}
//return bean;
return beans.get (beanName);
}
}