作为一个初学者,想要在这方面获得巨大的提升,必然要耐得住寂寞,和源码死磕
- 我们通过创建一个类使BeanFactory使用用工厂模式进行解耦
- 同时通过bean.properties映射 service 和 dao 对象的全限定类名
package cn.itycu.factory;
import java.io.InputStream;
import java.util.Properties;
/**
* @author 披风少年
* @version 1.0
* @date 2020/5/23 15:47
* 一个创建bean对象的工厂
* Bean:在计算机英语中有可重用组件的含义
* 通过工厂创建service和dao对象
*/
public class BeanFactory {
//定义一个properties对象并用static代码块儿对对象进行赋值
private static Properties props;
static {
try {
//实例化对象,耦合只能减小不能消除,所以必要的new我们还是需要的
props = new Properties();
/**
* 获取properties文件的流对象
* 使用类加载器来获取bean.properties文本对象
* 创建在resources目录下的文件最终会成为类根目录下的文件
*/
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
props.load(in);
} catch (Exception e) {
throw new ExceptionInInitializerError("初始化 properties 失败!");
}
}
/**
* 根据Bean的名词获取bean对象
* 采用泛型编程,增加工厂的复用性
* @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 披风少年
* @version 1.0
* @date 2020/5/23 15:21
* 模拟一个表现层,用于调用业务层
*/
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 披风少年
* @version 1.0
* @date 2020/5/23 15:11
* 账户的业务层实现类
*/
public class AccountServiceImpl implements IAccountService {
// private IAccountDao accountDao = new AccountDaoImpl();
private IAccountDao accountDao = (IAccountDao)BeanFactory.getBean("accountDao");
public void saveAccount() {
accountDao.saveAccount();
}
}
这样我们就实现了工厂模式解耦
但是我们的代码中仍然存在一些问题