第一步:创建一个objs.properties文件用于存放文件
userDao=com.itany.shopping.dao.impl.UserDaoImpl
itemDao=com.itany.shopping.dao.impl.ItemDaoImpl
orderDao=com.itany.shopping.dao.impl.OrderDaoImpl
第二步:创建一个对象工厂,利用静态代码块,通过类名反射加载需要创建的对象
/**
*
* 创建对象的工厂类
*
* 根据类路径下的objs.properties属性文件中的配置来创建对象
* 要求:
* 1.文件中不能有空行
* 2.注意编写顺序,由于对象间可能存在依赖关系,被依赖的对象必须放在依赖对象的前面
*/
public class ObjectFactory {
/*
* 定义一个Map集合,用来存储对象
*/
private static Map<String, Object> objs = new HashMap<>();
/*
* 类加载时读取属性文件,创建相应对象,对象是单例的
*/
static {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(
ObjectFactory.class.getClassLoader().getResourceAsStream(
"objs.properties")));) {
String line = null;
while ((line = reader.readLine()) != null) {
String[] entry = line.split("=");
objs.put(entry[0], Class.forName(entry[1]).newInstance());
}
} catch (Exception e) {
throw new ExceptionInInitializerError("ObjectFactory初始化失败:" + e);
}
}
/*
* 工厂方法,用来获取对象
*/
public static Object getObject(String key) {
return objs.get(key);
}
}
第三步:就是利用factory进行创建对象,而不是利用new来创建对象。
import java.util.List;
import com.itany.shopping.dao.ItemDao;
import com.itany.shopping.entity.Item;
import com.itany.shopping.factory.ObjectFactory;
import com.itany.shopping.service.ItemService;
public class ItemServiceImpl implements ItemService {
private ItemDao itemDao=(ItemDao) ObjectFactory.getObject("itemDao");
@Override
public List<Item> findByOrderId(int orderId,int userId) {
return itemDao.selectByOrderId(orderId,userId);
}
}
使用以上工厂可以直接调用到bean,只需要
private ItemDao itemDao=(ItemDao) ObjectFactory.getObject("itemDao");
即可!
如果通过正常的创建对象方法则需要通过new来实现创建对象,这就会增加层与层之间的耦合性。
ItemDao itemDao=new ItemDaoImpl();