從零開始學習Spring Framework 5

點擊藍字java

關注咱們面試


Hi~新朋友,記得點藍字關注咱們喲spring


1. Spring


1.1 簡介

  • Spring框架是因爲軟件開發的複雜性而建立的, 簡化企業開發的複雜性,可適用於任何JAVA應用微信

  • Spring最大的特色:①控制反轉 ②面向切面網絡

  • SSM:  Spring+ Spring MVC + Mybatis架構

  • Spring framework:  5.3.3 RELEASE, https://spring.io/projects/spring-frameworkapp

  • Spring中文文檔 (4.3.21)框架

    https://www.docs4dev.com/docs/zh/spring-framework/4.3.21.RELEASE/referenceide


1.2 特色:

  • 是一個開源的免費的框架svg

  • 是一個輕量級的、非侵入式的框架

  • 控制反轉 IOC 和 面向切面AOP

  • 支持事務以及框架的整合


1.3 架構體系

1.4 拓展

Spring Boot是構建全部基於spring應用程序的起點,是快速開發的腳手架。開發必備!面試必問!

Spring Cloud 是基於spring boot實現的。


2 .  IOC 思想推導


UserDao 接口 :數據訪問層,具體到對某個表或實體進行crud,

UserDaoImpl 實現類 : 編寫具體的對數據操做的具體crud的代碼

UserService 業務接口 :業務層,根據具體的業務邏輯來訪問不一樣的DAO層,須要對事務進行控制

UserServiceImpl 實現類 :編寫具體的業務代碼


(1) UserDao.java

public interface UserDao {
  public void getUser();
}


(2) UserAssetDaoImpl.java

public class UserAssetDaoImpl implements UserDao{

  @Override
  public void getUser() {
      System.out.println("get User Asset from DB");
  }
}


(3) UserInfoDaoImpl.java

public class UserInfoDaoImpl implements UserDao {

  @Override
  public void getUser() {
      System.out.println("get USER INFO from DB");
  }
}


(4) UserService.java

public interface UserService {
    public void getUser();
}


(5) UserServiceImpl.java

public class UserServiceImpl implements UserService {

  // service calls dao
  private UserDao info = new UserInfoDaoImpl();

  @Override
  public void getUser() {
      userDao.getUser();
  }


(6) MyTest.java

public static void main(String[] args) {

  //用戶實際調用的業務層,而不接觸DAO層
  UserServiceImpl ui = new UserServiceImpl();
ui.getUser();
}


當前外層調用的是UserInfoDaoImpl的業務邏輯,若是想要調用UserAssetDaoImpl,就要修改業務層代碼。

在原有的業務裏,須要根據用戶需求頻繁改動原有代碼,代價比較大。

可是利用set進行動態綁定DAO,實現業務動態查詢,其實質發生革命性的變化!

優化後的UserServiceImpl.java

public class UserServiceImpl implements UserService {

  private UserDao userDao;

  // 利用set進行動態綁定DAO,實現業務動態查詢
  public void setUserDao(UserDao userDao) {
      this.userDao = userDao;
  }

  @Override
  public void getUser() {
      userDao.getUser();
  }
}

MyTest.java

UserServiceImpl ui = new UserServiceImpl();
  ui.setUserDao(new UserHealthDaoImpl());
  ui.getUser();
  • 前者是外層控制內層,只要外層想改需求,內層必須修改大量代碼。控制權在外層!

  • 後者是內層控制外層,提供多個可選的接口,供外層調用。控制權在內層!

這種思想本質上就是控制反轉(Inversion of Control)的核心——控制權反轉,下降的系統的耦合性。


3. IOC本質


控制反轉是一種設計思想,DI ( Dependency Injection) 是實現IOC的一種手段。對象的建立不是徹底硬編碼在程序中,而是經過注入依賴的方式去動態建立對象。

IOC官方說明:

 It is a process whereby objects define their dependencies (that is, the other objects they work with) only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method. The container then injects those dependencies when it creates the bean.

在此過程當中,對象僅經過構造函數參數,工廠方法的參數或在對象實例從工廠方法構造或返回後設置的屬性來定義其依賴關係,即與它們一塊兒使用的其餘對象。而後,容器在建立 Bean 時「注入」那些依賴項。

接口org.springframework.context.ApplicationContext表明 Spring IoC 容器,並負責實例化,配置和組裝上述 bean。

容器經過讀取配置元數據來獲取有關要實例化,配置和組裝哪些對象的指令。配置元數據以 XML,Java 註解或 Java 代碼表示。


4. IOC Demo


User.java

package com.fullstack.pojo;

/**
* @author Horace
*/
public class User {
   private String name;
   private int age;
 
   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public int getAge() {
       return age;
  }

   public void setAge(int age) {
       this.age = age;
  }

   @Override
   public String toString() {
       return "User{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
  }
}

Beans.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
       http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置元數據-->

   <!--spring中建立的對象統稱爲bean-->
   <bean id="user" class="com.fullstack.pojo.User">
       <property name="name" value="Horace"/>
       <property name="age"  value="30"/>
   </bean>
   <!-- more bean definitions go here -->

</beans>


Test.java

import com.fullstack.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {

   public static void main(String[] args) {
       /**
        * 實例化容器
        */

       // 獲取 spring 上下文對象
       ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
       User user = (User) context.getBean("user");
       System.out.println(user.toString());

  }
}

思考:

Q1: 沒有任何new的代碼,User 是誰建立出來的?

A1: Spring

Q2: User中的屬性是如何賦值的?

A2: Spring 中xml配置, 即spring 容器設置的


這個過程就是控制反轉。

傳統上對象是程序顯式地主動地new出來   <——> spring 建立管理對象,動態地綁定所須要注入的對象

要實現不一樣的操做,只須要再xml配置生成對應的Bean便可直接使用。


總之, 對象由spring來建立,管理和裝配


Spring 5 系列文章還在更新...

參考:

https://www.bilibili.com/video/BV1WE411d7Dv?p=5&spm_id_from=pageDriver 

《碰見狂神說》


聲明:本文歸 「Java全棧」 版權全部,如需轉載請聯繫。文章封面圖來源於網絡,爲非商業用途使用,若有侵權聯繫刪除。


Java全棧開發
一個軟實力硬技術同步成長的公衆號
長按識別二維碼,關注公衆號


本文分享自微信公衆號 - Java全棧學習(taoquanquansh)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索