2-ioc控制反转思想

 

IOC控制反转思想举例

仓库地址:点击跳转

1. 创建工程

利用Maven创建一个空白工程spring1,其目录结构如下:

image-20210728212756154

然后创建以下几个接口和类:

  1. Dao层
  2. Service业务层
  3. 用户层(test表示用户测试)

image-20210728213117047

2. 代码实现

目标:用户要在test1中创建一个对象,调用Dao层的某个方法 getUser()来实现某种功能

Dao层

UserDao接口:

package com.ajream.Dao;

public interface UserDao {
    void getUser();
}

UserDaoImpl:

package com.ajream.Dao;

public class UserDaoImpl implements UserDao{
    @Override
    public void getUser() {
        System.out.println("默认获取用户数据。。。");
    }
}

UserMysqlDaoImpl:

package com.ajream.Dao;

public class UserMysqlDaoImpl implements UserDao{

    @Override
    public void getUser() {
        System.out.println("MySQL获取用户数据。。。");
    }
}


没有使用控制反转时的业务层

UserService接口:

package com.ajream.Service;

public interface UserService {
    void getUser();
}

UserServiceImpl:

image-20210728215047346

即:

package com.ajream.Service;

import com.ajream.Dao.UserDao;
import com.ajream.Dao.UserDaoImpl;

public class UserServiceImpl implements UserService {
    
    private UserDao userDao = new UserDaoImpl();        //注意此处

    public UserServiceImpl() {
    }

    public void getUser() {
        this.userDao.getUser();
    }
}

注意没有使用IOC时第8行代码,这样写的缺点:

这样指定创建了一个对象UserDaoImpl,假如我要创建另一个对象UserMysqlDaoImpl,用户就需要修改业务层这一行代码,例如改为:

private UserDao userDao = new UserMysqlDaoImpl();

很明显,这样有些不方便,作为用户,应该不需要关心业务的具体实现

使用控制反转后的业务层

UserService接口不变

UserServiceImpl使用setUser来创建对象:

image-20210728220123436

package com.ajream.Service;

import com.ajream.Dao.UserDao;


public class UserServiceImpl implements UserService{
    private UserDao userDao;
    @Override
    public void getUser() {
        userDao.getUser();
    }
    public void setUser(UserDao userDao){
        this.userDao = userDao;
    }
}

用户可以通过调用setUser()方法来创建不同对象(只需要传入不同参数即可)

对比:

image-20210728221513985


test1(这里是用户调用业务层实现业务的部分)

  • 没有使用IOC时
package com.ajream;

import com.ajream.Dao.UserDaoImpl;
import com.ajream.Dao.UserMysqlDaoImpl;
import com.ajream.Service.UserService;
import com.ajream.Service.UserServiceImpl;

public class test1 {
    public static void main(String[] args) {
        
        UserService userService = new UserServiceImpl();

        userService.getUser();
    }
}

  • 使用了IOC的思想后
package com.ajream;

import com.ajream.Dao.UserDaoImpl;
import com.ajream.Dao.UserMysqlDaoImpl;
import com.ajream.Service.UserService;
import com.ajream.Service.UserServiceImpl;

public class test1 {
    public static void main(String[] args) {
        
        UserService userService = new UserServiceImpl();
        
//         通过修改setUser参数来反向创建不同对象
        ((UserServiceImpl) userService).setUser(new UserDaoImpl()); 
        userService.getUser();
        
        ((UserServiceImpl) userService).setUser(new UserMysqlDaoImpl());
        userService.getUser();
    }
}

对比:

image-20210728221756345

3. 一张图表示三者之间关系

在这里插入图片描述

用户希望通过调用业务层来实现各个具体的业务如 MysqlOracle,…

posted @ 2021-07-28 22:28  aJream  阅读(35)  评论(0编辑  收藏  举报