/** * 一个创建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); } }