通过工厂模式(IOC思想)+反射技术+配置文件解耦
之前对于对象的创建,由在程序代码中主动new对象,转变为由工厂创建提供,我们使用的地方被动接收的方式。称为控制反转。
主动创建对象
被动获取对象
spring框架就是帮我们干好了这些活
代码
工厂类
public class BeanFactory {
/**
* 编写工厂类的四个基本步骤:
* 1.声明一个私有的工厂对象引用
* 2.把构造方法私有化
* 3.使用静态代码块初始化
* 4.提供共有的静态的方法,获取工厂类对象的引用
*/
// 1.声明一个私有的工厂对象引用
private static BeanFactory beanFactory= null;
private static Properties prop;
// 2.把构造方法私有化
private BeanFactory(){
}
// 3.使用静态代码块初始化
static{
beanFactory = new BeanFactory();
//通过加载本类的字节码对象,然后加载并获得输入流
InputStream inStream = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
prop = new Properties();
try {
//读取properties文件的属性
prop.load(inStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 4.提供共有的静态的方法,获取工厂类对象的引用
public static BeanFactory getBeanFactory(){
return beanFactory;
}
/**
* 在这里提供创建Dao对象
* 存在的问题:
* 1.只是把客户dao具体实现的依赖转移到了工厂类,问题并没有得到解决
* 2.这里只能创建一个dao对象,其它对象创建不了
*/
// public CustomerDao getCustomerDao(){
// return new CustomerDaoImpl();
// }
/**
* 工厂创建对象的改良版本:
* 1.通过配置文件的方式,解决了对具体实现的依赖
* 2.如果需要修改为其它的实现类对象,不需要再修改java代码,只需要修改配置文件即可
* 3.这里可以统一创建我们需要的全部目标对象
*
*/
public Object getInstance(String beanName){
String className = (String) prop.get(beanName);
Object result = null;
try {
result = Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
properties文件
CUSTOMERDAO=com.dao.impl.CustomerDaoImpl
获取对象
public class CustomerServiceImpl implements CustomerService {
// 定义客户dao对象
//private CustomerDao customerDao = new CustomerDaoImpl();
//private CustomerDao customerDao = BeanFactory.getBeanFactory().getCustomerDao();
//通过properties文件的属性名去调度工厂获取对象
private CustomerDao customerDao = (CustomerDao) BeanFactory.getBeanFactory().getInstance("CUSTOMERDAO");
/**
* 保存客户
*/
public void saveCustomer() {
customerDao.saveCustomer();
}
}
工厂创建对象的改良版本:
- 通过配置文件的方式,解决了对具体实现的依赖
- 如果需要修改为其它的实现类对象,不需要再修改java代码,只需要修改配置文件即可
- 这里可以统一创建我们需要的全部目标对象