1. 程式人生 > 程式設計 >Java spring webmvc如何實現控制反轉

Java spring webmvc如何實現控制反轉

概述

本文基於示例的方式解釋控制反轉,再看控制反轉之前,我們先看下常規控制流程,以資料庫訪問為例

示例並沒有實際訪問資料,而是基於service和dao,模擬請求資料

建立專案

注意:本例項基於Idea開發工具

開啟建立專案選項(New Project),選擇Maven,不要選擇“Create from crchetype”,點選Next

GroupID:com.example和ArtifactID:Demo,點選Next和Finish

新生成的專案目錄結構如下:

  • src
  • main
  • java
  • resources
  • test
  • pom.xml

常規流程

main.java下面新增Package:com.example.dao

dao下面新增訪問介面,同時新增兩種資料訪問方式:

public interface UserDao {
  String getUser();
}
public class UserDaoMSSqlImpl implements UserDao {
  public String getUser() {
    return "從SQL Server查詢使用者";
  }
}
public class UserDaoMySqlImpl implements UserDao {
  public String getUser() {
    return "從MySQL查詢使用者";
  }
}

新增服務層

main.java下面新增Package:com.example.service

新增訪問類

public interface UserService {
  void getUser();
}
public class UserServiceImpl implements UserService {
  // 如果想更換資料庫,這個地方需要改一下
  private UserDao userDao = new UserDaoMSSqlImpl();

  public void getUser() {
    System.out.println(userDao.getUser());
  }
}

新增測試,在src.test下面新增UserTest

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

從上面的例子中看到,如果想更改資料連線,必須修改程式碼,也就是service類中,更新dao的初始化

控制反轉流程

專案pom.xml檔案新增MVC依賴

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

resources新增配置檔案services.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="mssqlImpl" class="com.example.dao.UserDaoMSSqlImpl"></bean>
  <bean id="mysqlImpl" class="com.example.dao.UserDaoMySqlImpl"></bean>

  <bean id="userServiceImpl" class="com.example.service.UserServiceImpl">
    <!-- 更新ref:mssqlImpl或mysqlImpl,即可實現資料庫切換 -->
    <property name="userDao" ref="mysqlImpl"></property>
  </bean>
</beans>

改寫UserServiceImpl類

public class UserServiceImpl implements UserService {
  private UserDao userDao;

  public void getUser() {
    System.out.println(userDao.getUser());
  }

  // 程式被動接受入口,依賴注入就是利用set方法注入
  public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
  }
}

改寫測試型別

public class UserTest {
  public static void main(String[] args) {
    // 獲取Spring上下文物件
    ApplicationContext context = new ClassPathXmlApplicationContext("services.xml");
    UserService userService1 = (UserService)context.getBean("userServiceImpl");
    userService1.getUser();
  }
}

從上面兩個示例裡面看出:

常規流程的控制,程式相互的呼叫由程式碼控制
控制反轉把控制權交給使用者,也就是由配置檔案管理,程式本身不建立物件,變成被動接受

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。