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原型,從本質上解決了上述問題,大大降低了系統的耦合性,使得程序員能夠專注於業務的實現。 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章