03_IOC本质推导

使用Spring之前

UserDao.java

package com.geng.dao;

public interface UserDao {
    void getUser();
}

UserDaoImpl.java

package com.geng.dao;

public class UserDaoImpl implements UserDao{

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

UserService.java

package com.geng.service;

public interface UserService {
    public void getUser();
}

UserServiceImpl.java

package com.geng.service;

import com.geng.dao.UserDao;
import com.geng.dao.UserDaoImpl;

public class UserServiceImpl implements UserService{
    // 调dao层,除了继承还有组合的概念
    // 把dao引到service里面了
    private UserDao userDao = new UserDaoImpl();

    @Override
    public void getUser() {
        // 业务层调dao层
        userDao.getUser();
    }
}

测试类:MyTest.java

import com.geng.service.UserServiceImpl;

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

        userService.getUser();
    }
}

执行结果:

03_IOC本质推导

类结构图:

03_IOC本质推导快捷键:Ctrl+Alt+Shift+U

执行过程:

03_IOC本质推导

03_IOC本质推导

03_IOC本质推导

03_IOC本质推导

03_IOC本质推导

03_IOC本质推导

03_IOC本质推导

03_IOC本质推导

此处没有理解怎么执行的原因:

1.new的过程,为什么只创建了那个类的属性,而到执行这个类的方法的时候才回去执行这个类的方法?

2.多态的理解,不知道 UserServiceImpl userService = new UserServiceImpl()是怎样的一个执行过程。

上述代码的弊端:

当我们有多种方法获取数据的时候,必须手动的修改 UserServiceImpl.java中的代码。当方式很多,代码量很大的时候就很不方便了:如下

public class UserServiceImpl implements UserService{
	// 方式一
	private UserDao userDao = new UserDaoImpl();
	// 方式二
	private UserDao userDao = new UserDaoMysqlImpl();
	// 方式三
	private UserDao userDao = new UserDaoOracleImpl();
	// 方式四
	private UserDao userDao = new UserDaoSqlServerImpl();
}

上述这种方式是程序控制对象的创建。

用控制反转(IOC)的思想对上述代码进行修改,把创建对象的方式交到用户手里。

IOC改进代码

如果每次获取数据的方式不同的话,在 UserServiceImpl中修改很麻烦,干脆就在里面设置一个 setUserDao()方法用来对后面new的对象的控制交到 最外面测试类里面。这样当用户需要什么方式获取数据的时候,就传一个什么类型的数据就可以啦。

对 UserServiceImpl.java 的改进:

public class UserServiceImpl implements UserService{
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

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

对 MyTest.java 的改进:

public class MyTest {
    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();
        userService.setUserDao(new UserDaoOracleImpl());
        userService.getUser();
    }
}

代码执行过程:

03_IOC本质推导

03_IOC本质推导

03_IOC本质推导

03_IOC本质推导

03_IOC本质推导

03_IOC本质推导

03_IOC本质推导

03_IOC本质推导

03_IOC本质推导

上一篇:Spring 5框架教程(二):IOC


下一篇:Spring注解的方式管理bean