例子:
在Client.java中
// IAccountService accountService=new AccountServiceImpl();
为了解耦,可以创建BeanFactory 先创建bean.properties
accountService=com.itheima.service.impl.AccountServiceImpl accountDao=com.itheima.dao.impl.AccountDaoImpl创建factory.BeanFactory
/** * 需要一个配置文件来配置我们的service和dao * 配置的内容:唯一标识=全限定类名(key=value) * 通过读取配置文件中的内容,反射创建文件 * 我们的配置可以是xml也可以是properties */ public class BeanFactory { private static Properties props; static { props=new Properties(); try { InputStream in=BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties"); props.load(in); }catch (Exception e) { throw new ExceptionInInitializerError("初始化properties失败!"); } } public static Object getBean(String beanName) { Object bean=null; try { String beanPath=props.getProperty(beanName); bean=Class.forName(beanPath).newInstance(); }catch (Exception e) { e.printStackTrace(); } return bean; } }
这样我们在Client中就可以用工厂BeanFactory了
IAccountService accountService= (IAccountService) BeanFactory.getBean("accountService"); accountService.saveAccount();但是这样的话我们利用BeanFactory创建出来的对象是多例的,
多例对象被创建多次,执行效率没有单例对象高,
虽然单例对象有线程问题,但我们的service和dao中不存在类成员变量,所有进一步分析
我们其实是没有问题的,因为我们没有在单例对象中可以改变的类成员。
我们希望是单例的。
bean=Class.forName(beanPath).newInstance();
如果创建完之后不存起来,由于Java的垃圾回收机制,长时间不用就会被回收。所以对象创建出来要存起来。 我们业务层和持久层是很少包含类成员的,所以可以是单例的。单例的对象效果更好。