Spring学习之IOC理论推导

本文算是观看狂神说Java视频的笔记吧,视频链接:https://space.bilibili.com/95256449

第一次使用IDEA,记录下使用过程以及IOC理论推导过程,算是今天一天学习的总结复习。

在引入IOC思想之前,要想进行MVC开发,一般模式为:

  • UserDao接口
  • UserDaoImpl实现类
  • UserService业务接口
  • UserServiceImpl业务实现类

按照传统编程,将这个模式一一实现,过程如下:

一、IDEA创建项目

1、创建项目:"Create New Project"——>点击左边的"Maven"——>next,并将"GroupId"命名(如com.kuang),"ArtifactId"命名(如spring-study)——>next,project name改为"spring-study",即需要加"-"。

2、导入jar包:导入Spring所需的包,点击"pom.xml",添加以下代码:

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>
 </dependencies>

3、为了能创建自己的子项目,可以将spring study的src删掉

4、创建Moudle:new——>"moudle"——>ArtifactId命名为:"spring-01-ioc1"——>next,moubld name 命名为"spring-01-ioc1" 

5、创建包:spring study——>spring-01-ioc1——>src——>main——>java,新建包"com.kuang.dao"与"com.kuang.service",并在包dao下创建UserDao接口与UserDaoImpl实现类,在包service下创建UserService业务接口与UserServiceImpl业务实现类

二、MVC实现

各个模块代码如下:

  • UserDao接口
package com.kuang.dao;

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

public class UserDaoImpl implements UserDao{
    public void getUser(){
        System.out.println("默认获取用户的数据");
    }
}
  • UserService业务接口
package com.kuang.service;

public interface UserService {
    void getUser();
}
  • UserServiceImpl业务实现类
package com.kuang.service;

import com.kuang.dao.UserDaoImpl;
import com.kuang.dao.UserDaoMysqlImpl;

public class UserServiceImpl implements UserService{
   private UserDao userDao = new UserDaoImpl();

    public void getUser(){
     //业务层调DAO层,使用了组合方式
        userDao.getUser();
    }

接下来需要创建一个测试类,spring study——>spring-01-ioc1——>src——>test——>java,创建一个"MyTest.java",内容如下:

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

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

        userService.getUser();
    }
}

运行MyTest.java,控制台会输出“默认获取用户数据”,表示运行成功。

三、IOC思想引入

假设用户需求从“默认获取用户数据”变成“使用Mysql获取用户数据”,则需要在dao包下增加一个UserDaoMysqlImpl类,并将UserServiceImpl业务实现类变为:

package com.kuang.service;

import com.kuang.dao.UserDaoImpl;
import com.kuang.dao.UserDaoMysqlImpl;

public class UserServiceImpl implements UserService{
   private UserDao userDao = new UserDaoMysqlImpl();

    public void getUser(){
     //业务层调DAO层,使用了组合方式
        userDao.getUser();
    }

 这样就带来一个问题:用户需求一旦发生变化,就需要改动原有代码,要是代码量庞大,则维护与开发成本太大,费时费力。

为了解决这个问题,可以这样改变:

UserServiceImpl业务实现类变为:

package com.kuang.service;

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

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

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

    public void getUser(){
     //业务层调DAO层,使用了组合方式
        userDao.getUser();
    }
}

MyTest.java变为:

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

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

        userService.setUserDao(new UserDaoOracleImpl());
        userService.getUser();
    }
}

引入set方法,就可以将控制权从程序员手上转为用户手上,之前是程序主动创建对象,改变之后程序变成了被动接受对象。这就是IOC原型,从本质上解决了上述问题,大大降低了系统的耦合性,使得程序员能够专注于业务的实现。 

发布了32 篇原创文章 · 获赞 4 · 访问量 5712

猜你喜欢

转载自blog.csdn.net/buer219/article/details/103930884
今日推荐