1、回顧(一)
上節我已經基本說明了耦合,以及在一些業務上是怎么發生的,實際上我們要理解一個思想,傳統的EJB開發模式,因為受到了很多很多的框架硬性約束,web容器的約束
導致了代碼的可讀性,可移植和可擴展性變得不好,所以有這些解耦的思想,我們才會在03年spring的廣泛流行!
回顧上節末尾:我們是不是遺留了一個問題,如果我們在工廠中,每次有一個新的物件,我們就需要手動的加一個對應的getBean方法,可重用性大大降低,所以我們稱下面的代碼,叫做
---------------------------簡單工廠------------------------------------
/** * 定義一個bean工廠,專門生產普通物件 */ public class BeanFactory { private static Properties properties = new Properties(); //1.加載組態檔 static { InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties"); try { properties.load(resourceAsStream); resourceAsStream.close(); } catch (IOException e) { e.printStackTrace(); } } public static UserDao getBean(String key){ // 2.使用key獲得value String className = properties.getProperty(key); // 3.使用value利用反射技術創建物件 try{ return (UserDao) Class.forName(className).newInstance(); }catch(Exception e){ e.printStackTrace(); return null; } } }那么為了避免多個不同的物件在實際生產業務中,代碼的繁重,我們將這個簡單工廠,改造成通用工廠
/** * 定義一個bean工廠,專門生產普通物件 */ public class BeanFactory { private static Properties properties = new Properties(); //1.加載組態檔 static { InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties"); try { properties.load(resourceAsStream); resourceAsStream.close(); } catch (IOException e) { e.printStackTrace(); } } // 來個物件就要在工廠創建一個 // public static UserDao getMysqlBean() { // return new UserDaoMysqlImpl(); // } // // public static UserDao getOracleBean() { // return new UserDaoOracleImpl(); // } // 來個物件就要在工廠創建一個,冗余代碼太多 // public static UserDao getBean(String key){ // // 2.使用key獲得value // String className = properties.getProperty(key); // // 3.使用value利用反射技術創建物件 // try{ // return (UserDao) Class.forName(className).newInstance(); // }catch(Exception e){ // e.printStackTrace(); // return null; // } // } /** * 通用工廠方法,不必要一個新來物件就要創建一個getBean * @param key * @return */ public static Object getBean(String key){ Object ret = null; String className = properties.getProperty(key); // 3.使用value利用反射技術創建物件 try{ ret = Class.forName(className).newInstance(); }catch(Exception e){ e.printStackTrace(); } return ret; } }這樣的話,是不是我們只需要在組態檔中這么寫:
userDao=com.chenxin.gmall.user.demo.dao.UserDaoSqlServerImpl userService=com.chenxin.gmall.user.demo.service.UserServiceImpl在需要創建物件的地方,我們只需要強制轉換下:
UserDao userDao = (UserDao) BeanFactory.getBean("userDao"); ......我們想在哪里生成一個介面的實作類,只要你存在這個介面的實作,我們就可以定義在組態檔中,然后在你需要生成的地方呼叫即可!
后續我繼續發布spring的原始碼級別的課程和一些基礎知識,總之,一切都是為了解耦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/260391.html
標籤:其他
上一篇:ABAP設計模式之---“橋接模式(Bridge Pattern)”
下一篇:python 全堆疊開發 Django_ billshop 商城_ 注冊功能的全部實作、含前后端和所有全功能驗證
