簡單的工廠+反射+ xml解耦和
阿新 • • 發佈:2017-06-19
logs trace att loader 類加載 一個 encoding saxreader cnblogs
傳統的調用業務層是:
CustomerServiceImpl csi = new CustomerServiceImpl();
通過面向接口編程改進過後:
CustomerService cs = new CustomerServiceImpl();
這種還是不好,因為如果我要修改底層的實現類,還是要修改源代碼
我們編程應該遵循opc原則:open-close:對程序擴展是開放的,對修改源碼是關閉的
所以我們需要降低程序之間的耦合性,解耦和操作
在接口和實現類之間用工廠來解耦和
就像
CustomerService cs = new CustomerServiceImpl();我們要通過工廠模式改造成:
CustomerService cs = BeanFatory.getCustomerService();
所以在BeanFactory中的代碼應該是:
class BeanFactory { public static CustomerService getCustomerService() { return new CustomerServiceImpl(); } }
但是我們發現這樣做也不好,因為實現類跟這個工廠耦合了,而且如果有其他的service,我們還
需要為每個service都寫一個工廠的方法
在這個基礎上,我們需要進一步改進得連工廠都不需要修改
所以用工廠+反射+配置文件來解耦和
在xml文件中配置接口名,和實現類的絕對路徑
其實這就是最簡單的控制反轉
在src下建立一個xml文件
例如我們在src下建立了一個applicationContext.xml文件
裏面配置了service層和到層的解耦和文件
<?xml version="1.0" encoding="UTF-8"?> <beans> <!-- 配置service層解耦 --> <bean id="CategoryService" class="com.project.service.imp.CategoryServiceImpl"></bean> <bean id="ProductService" class="com.project.service.imp.ProductServiceImpl"></bean> <bean id="UserService" class="com.project.service.imp.UserServiceImpl"></bean> <!-- 配置dao層解耦 --> <bean id="CategoryDao" class="com.project.dao.imp.CategoryDaoImpl"></bean> <bean id="ProductDao" class="com.project.dao.imp.ProductDaoImpl"></bean> <bean id="UserDao" class="com.project.dao.imp.UserDaoImpl"></bean> </beans>
寫一個BeanFactory類
public class BeanFactory { public static Object getBean(String id) { try { //用類加載器解析xml文件 SAXReader reader = new SAXReader(); Document document = reader.read(BeanFactory.class.getClassLoader().getResourceAsStream("applicationContext.xml")); //xpath技術獲得bean元素 Element element = (Element) document.selectSingleNode("//bean[@id=‘"+id+"‘]"); //拿到class屬性裏面的值 String value = element.attributeValue("class"); //獲得反射對象 Class clazz = Class.forName(value); //獲得實例 return clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); } } }
這樣我們要調用service層就成了
CategoryService cs = (CategoryService )BeanFactory.getBean("CategoryService ");
簡單的工廠+反射+ xml解耦和