Java Spring 学习笔记 003(IOC理论推导)

来自B站【狂神说Java】Spring5最新完整教程IDEA版通俗易懂

一、传统开发业务的实现方式

  1. UserDao 接口
package com.kuang.dao;

public interface UserDao {
    void getUser();
}
  1. UserDaoImpl 实现类
package com.kuang.dao;

public class UserDaoImpl implements UserDao {
    @Override
    public void getUser() {
        System.out.println("默认获取用户的数据!");
    }
}
package com.kuang.dao;

public class UserDaoMysqlImpl implements UserDao {
    @Override
    public void getUser() {
        System.out.println("Mysql获取用户数据!");
    }
}
package com.kuang.dao;

public class UserDaoOracleImpl implements UserDao {
    @Override
    public void getUser() {
        System.out.println("Oracle获取用户数据!");
    }
}
package com.kuang.dao;

public class UserDaoSqlserverImpl implements UserDao {
    @Override
    public void getUser() {
        System.out.println("Sqlserver获取用户数据!");
    }
}
  1. UserService 业务接口
package com.kuang.service;

public interface UserService {
    void getUser();
}

  1. UserServiceImpl 业务实现类
package com.kuang.service;

import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpl;

public class UserServiceImpl implements UserService {

    // 当需要改成不同的实现时,需要修改这一块的代码
    private UserDao userDao = new UserDaoImpl();

    @Override
    public void getUser() {
        userDao.getUser();
    }
}
  1. 客户调用类
import com.kuang.service.UserService;
import com.kuang.service.UserServiceImpl;

public class MyTest {
    public static void main(String[] args) {
        // 用户实际调用的是业务层,DAO层他们不需要接触
        UserService userService = new UserServiceImpl();
        userService.getUser();
    }
}

在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!如果程序代码量十分大,修改一次的成本代价十分昂贵!

我们使用一个Set接口实现,已经发生了革命性的变化!客户调用的时候自己通过set方法注入不同的DAO层实现类,不用调整自己是Service层代码。

package com.kuang.service;

import com.kuang.dao.UserDao;

public class UserServiceImpl implements UserService {

    private UserDao userDao;

    // 利用set进行动态实现值的注入!
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void getUser() {
        userDao.getUser();
    }
}

import com.kuang.dao.UserDaoMysqlImpl;
import com.kuang.service.UserService;
import com.kuang.service.UserServiceImpl;

public class MyTest {
    public static void main(String[] args) {
        // 用户实际调用的是业务层,DAO层他们不需要接触
        UserService userService = new UserServiceImpl();
        ((UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl());
        userService.getUser();
    }
}

  • 之前,程序是主动创建对象!控制权在程序员手上!
  • 使用了set注入后,程序不再具有主动性,而是变成了被动的接收对象!

这种思想,从本质上解决了问题,我们程序员不用再去管理对象的创建了。系统的耦合性大大降低,可以更加专注在业务的实现上!这是IOC的原型!

posted @ 2022-01-05 23:05  君子键  阅读(9)  评论(0)    收藏  举报