1. 程式人生 > >簡單的工廠+反射+ xml解耦和

簡單的工廠+反射+ xml解耦和

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解耦和