作為一個(gè)初學(xué)者,想要在這方面獲得巨大的提升乳乌,必然要耐得住寂寞,和源碼死磕
- 我們通過(guò)創(chuàng)建一個(gè)類使BeanFactory使用用工廠模式進(jìn)行解耦
- 同時(shí)通過(guò)bean.properties映射 service 和 dao 對(duì)象的全限定類名
package cn.itycu.factory;
import java.io.InputStream;
import java.util.Properties;
/**
* @author 披風(fēng)少年
* @version 1.0
* @date 2020/5/23 15:47
* 一個(gè)創(chuàng)建bean對(duì)象的工廠
* Bean:在計(jì)算機(jī)英語(yǔ)中有可重用組件的含義
* 通過(guò)工廠創(chuàng)建service和dao對(duì)象
*/
public class BeanFactory {
//定義一個(gè)properties對(duì)象并用static代碼塊兒對(duì)對(duì)象進(jìn)行賦值
private static Properties props;
static {
try {
//實(shí)例化對(duì)象,耦合只能減小不能消除市咆,所以必要的new我們還是需要的
props = new Properties();
/**
* 獲取properties文件的流對(duì)象
* 使用類加載器來(lái)獲取bean.properties文本對(duì)象
* 創(chuàng)建在resources目錄下的文件最終會(huì)成為類根目錄下的文件
*/
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
props.load(in);
} catch (Exception e) {
throw new ExceptionInInitializerError("初始化 properties 失敽翰佟!");
}
}
/**
* 根據(jù)Bean的名詞獲取bean對(duì)象
* 采用泛型編程蒙兰,增加工廠的復(fù)用性
* @param beanName
* @return
*/
public Object getBean(String beanName) {
Object bean = null;
try {
String beanPath = props.getProperty(beanName);
bean = Class.forName(beanPath).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
}
-----------------------------分割線-------------------------------
// bean.properties 文件
// accountService=cn.itycu.service.impl.AccountServiceImpl
// accountDao=cn.itycu.dao.impl.AccountDaoImpl
-----------------------------分割線-------------------------------
package cn.itycu.ui;
import cn.itycu.factory.BeanFactory;
import cn.itycu.service.IAccountService;
import cn.itycu.service.impl.AccountServiceImpl;
/**
* @author 披風(fēng)少年
* @version 1.0
* @date 2020/5/23 15:21
* 模擬一個(gè)表現(xiàn)層磷瘤,用于調(diào)用業(yè)務(wù)層
*/
public class Client {
public static void main(String[] args) {
// IAccountService accountService = new AccountServiceImpl();
IAccountService accountService = (IAccountService) BeanFactory.getBean("accountService");
accountService.saveAccount();
}
}
-----------------------------分割線-------------------------------
package cn.itycu.service.impl;
import cn.itycu.dao.IAccountDao;
import cn.itycu.dao.impl.AccountDaoImpl;
import cn.itycu.factory.BeanFactory;
import cn.itycu.service.IAccountService;
/**
* @author 披風(fēng)少年
* @version 1.0
* @date 2020/5/23 15:11
* 賬戶的業(yè)務(wù)層實(shí)現(xiàn)類
*/
public class AccountServiceImpl implements IAccountService {
// private IAccountDao accountDao = new AccountDaoImpl();
private IAccountDao accountDao = (IAccountDao)BeanFactory.getBean("accountDao");
public void saveAccount() {
accountDao.saveAccount();
}
}
這樣我們就實(shí)現(xiàn)了工廠模式解耦
但是我們的代碼中仍然存在一些問(wèn)題