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();
    }
}

执行结果:

类结构图:

快捷键:Ctrl+Alt+Shift+U

执行过程:

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

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();
    }
}

代码执行过程:

IOC本质

控制反转(IOC)是一种设计思想,DI(依赖注入)是实现IOC的一种方法。

通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值