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");
......
我們想在哪裡生成一個介面的實現類,只要你存在這個介面的實現,我們就可以定義在配置檔案中,然後在你需要生成的地方呼叫即可!