1.what
程序之间的大量耦合,不利于开发维护,所以我们需要解耦
* 程序的耦合
* 耦合:程序间的依赖关系
* 包括:
* 类之间的依赖
* 方法间的依赖
* 解耦:
* 降低程序间的依赖关系
* 实际开发中:
* 应该做到:编译期不依赖,运行时才依赖。
* 解耦的思路:
* 第一步:使用反射来创建对象,而避免使用new关键字。
* 第二步:通过读取配置文件来获取要创建的对象全限定类名
*
2.why
利用spring的工厂模式,可以帮助我们解耦
3.code
- Factory
public class BeanFactory {
public static Properties prop;
//来一个存放类的容器
/**
* beans容器的引入在加载工厂时就将配置文件中所有的类都加载放入到beans中
* 且由于static代码块只执行一次,则这个类的对象属于单例模式,在多线程中会提高service层和dao层的执行效率
* 且service层和dao层一般没有成员变量,所以不会引起线程安全问题!
*/
private static Map<String,Object> beans;
static {
try {
prop = new Properties();
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");//利用这个工厂的类来得到配置文件
prop.load(in);//加载配置文件
beans = new HashMap<String,Object>();
Enumeration<Object> keys = prop.keys();//读取所有的key,key的容器
while(keys.hasMoreElements()){//判断是否还有指针
String key = keys.nextElement().toString();//获得当前指针的String
String property = prop.getProperty(key);//在配置文件中对应key的全类名
Object value = Class.forName(property).newInstance();//利用反射得到这个类
beans.put(key,value);//将这个类的key和对象放入到beans容器中
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static Object getBean(String beanName){
return beans.get(beanName);
}
}
- properties
AccountDao=dao.imp.AccountDaoImp
AccountService=service.imp.AccountServiceImp
3.业务层的BeanFactory使用
/**
* 模拟一个表现层,用于调用业务层
*/
public class Client {
public static void main(String[] args) {
//IAccountService as = new AccountServiceImpl();
for(int i=0;i<5;i++) {
IAccountService as = (IAccountService) BeanFactory.getBean("accountService");
System.out.println(as);
as.saveAccount();
}
}
}