IOC思想

通过工厂模式(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();
    }

}

工厂创建对象的改良版本:

  1. 通过配置文件的方式,解决了对具体实现的依赖
  2. 如果需要修改为其它的实现类对象,不需要再修改java代码,只需要修改配置文件即可
  3. 这里可以统一创建我们需要的全部目标对象

猜你喜欢

转载自blog.csdn.net/Kato_op/article/details/80220705