Java工厂模式解耦 —— 理解Spring IOC
package com.ithonor.dao;
/**
* 账户持久层接口
* */
public interface IAccountDao {
void saveAccount();
}
package com.ithonor.service;
/**
* 账户业务层的接口
* */
public interface IAccountService {
/**
* 模拟保存账户
* */
void saveAccount();
}
package com.ithonor.dao.impl;
import com.ithonor.dao.IAccountDao;
/**
* 账户持久层实现类
* */
public class AccountDaoImpl implements IAccountDao{
public void saveAccount() {
System.out.println("保存成功!");
}
}
package com.ithonor.service.impl;
import com.ithonor.dao.IAccountDao;
import com.ithonor.factory.BeanFactory;
import com.ithonor.service.IAccountService;
/**
* 账户的业务层实现类
* */
public class AccountServiceImpl implements IAccountService {
// 业务层要调用持久层
private IAccountDao accountDao ;
public void saveAccount() {
accountDao = (IAccountDao) BeanFactory.getBean("accountDao");
accountDao.saveAccount();
}
}
package com.ithonor.factory;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class BeanFactory {
private static Properties properties;
//定义一个Map,用于存放我们创建的对象,把他称为容器
private static Map<String,Object> beans;
static{
properties = new Properties();
try {
properties = new Properties();
InputStream inputStream =
BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
properties.load(inputStream);
//实例化容器
beans = new HashMap<String,Object>();
//取出配置文件中所有的key
Enumeration keys = properties.keys();
//遍历枚举
while (keys.hasMoreElements()){
//获取每个key
String key = keys.nextElement().toString();
//根据key获取value
String beanPath = properties.getProperty(key);
//反射创建对象
Object value = Class.forName(beanPath).getDeclaredConstructor().newInstance();
//把key和value放入容器中
beans.put(key,value);
System.out.println(value);
System.out.println(beans);
}
} catch (Exception e) {
new ExceptionInInitializerError("初始化Properties失败。。。");
}finally {
// System.out.println(beans);
}
}
//根据Bean的名称获取Bean对象
public static Object getBean(String beanName){
return beans.get(beanName);
}
}
package com.ithonor.ui;
import com.ithonor.factory.BeanFactory;
import com.ithonor.service.IAccountService;
public class Client {
public static void main(String[] args) {
IAccountService service = (IAccountService) BeanFactory.getBean("accountService");
service.saveAccount();
}
}
accountService=com.ithonor.service.impl.AccountServiceImpl
accountDao=com.ithonor.dao.impl.AccountDaoImpl
注意事项:AccountServiceImpl实现时候,初始化需要在saveAccount中定义,避免NullPointerException异常