ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

03_IOC本质推导

2021-06-08 21:57:44  阅读:206  来源: 互联网

标签:03 UserServiceImpl userDao 推导 UserDao getUser new IOC public


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

代码执行过程:

标签:03,UserServiceImpl,userDao,推导,UserDao,getUser,new,IOC,public
来源: https://blog.csdn.net/gsj9086/article/details/117715572

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有