对spring中IOC的理解-01

传统架构的思想

业务层调用dao层来实现,dao调用dao的实现类来实现功能,代码结构如下:
在这里插入图片描述

ObjectDao.java

package com.hhx.dao;
/**
 * @author 黄河祥
 * @create 2020/2/20  23:18
 */
public interface ObjectDao {
    void getObject();
}

ObjectDaoImpl.java

package com.hhx.dao;
/**
 * @author 黄河祥
 * @create 2020/2/20  23:18
 */
public class UserDaoImpl implements ObjectDao {
    public void getObject() {
        System.out.println("获取到user用户了");
    }
}

ObjectService.java

package com.hhx.service;
/**
 * @author 黄河祥
 * @create 2020/2/20  23:20
 */
public interface ObjectService {
    void getObject();
}

ObjectServiceImpl.java

package com.hhx.service;
import com.hhx.dao.ObjectDao;
import com.hhx.dao.UserDaoImpl;
/**
 * @author 黄河祥
 * @create 2020/2/20  23:23
 */
public class ObjectServiceImpl implements ObjectService {
    private ObjectDao objectDao = new UserDaoImpl();
    public void getObject() {
        objectDao.getObject();
    }
}

注意:以上这里是关键点了!

先运行一下测试类

public class MyTest {
    public static void main(String[] args) {
        ObjectService objectService = new ObjectServiceImpl();
        objectService.getObject();
    }
}

运行结果:
在这里插入图片描述

试想一下这样一个情况,现在我们通过一个UserDao的实现类,得到到User对象了,某一天出现了新的需求,我们需要一个Car的实现类,来得到car对象,则我们必须要修改源代码,需要修改ObjectServiceImpl.java下的代码。
在这里插入图片描述
CarImpl.java代码如下:

package com.hhx.dao;
/**
 * @author 黄河祥
 * @create 2020/2/20  23:53
 */
public class CarImpl implements ObjectDao {
    public void getObject() {
        System.out.println("得到car对象了");
    }
}

修改一两个还好,可是要是又有需求来要得到一个Dog对象,Train对象…,则在这个上面花费的人力和财力将是极其浪费的,也是没有必要的,故因此我们只需要在如下地方做变动,把ObjectServiceImpl.java中的ObjectDao 生成一个Setter方法。

package com.hhx.service;

import com.hhx.dao.CarImpl;
import com.hhx.dao.ObjectDao;
import com.hhx.dao.UserDaoImpl;

/**
 * @author 黄河祥
 * @create 2020/2/20  23:23
 */
public class ObjectServiceImpl implements ObjectService {
    private ObjectDao objectDao;
//通过set实现动态的注入
    public void setObjectDao(ObjectDao objectDao) {
        this.objectDao = objectDao;
    }

    public void getObject() {
        objectDao.getObject();
    }
}

之前,程序员主动创建对象,控制权在程序员手上,使用set注入后,程序不再具有主动性,而是变成了被动的接收对象,这样一来,以后每需要扩充实现类的时候,只需要传递实现类的对象就可以了,原本的代码则因此不需要修改,这就是IOC的思想。

package com.hhx;

import com.hhx.dao.CarImpl;
import com.hhx.dao.UserDaoImpl;
import com.hhx.service.ObjectService;
import com.hhx.service.ObjectServiceImpl;

/**
 * @author 黄河祥
 * @create 2020/2/20  23:27
 */
public class MyTest {
    public static void main(String[] args) {
        ObjectService objectService = new ObjectServiceImpl();
        ((ObjectServiceImpl)objectService).setObjectDao(new CarImpl());//传递要实例化的实现类
        ((ObjectServiceImpl)objectService).setObjectDao(new UserDaoImpl());
        objectService.getObject();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值