Spring學習筆記(一)

愛寫部落格的小菜鳥發表於2020-09-25

Spring

1.1、簡介

  • Spring:翻譯為:春天------> 可以理解為是給軟體行業帶來了春天

  • 範圍:任何 Java 應用

  • 目的:解決企業級伺服器的開發

  • 歷史

    • 2002 ,首次推出 Spring框架的雛形 Interface21框架
    • 2004年3月24號 ,正式釋出 Spring 1.0
    • Rod Johnson Spring Framework創始人。悉尼大學音樂學博士
    • **Spring 的理念:**使現有的技術更加容易使用,本身是一個大雜燴,整合了現有的技術框架!
  • SSH:Struct2 + Spring + Hibernate !

  • SSM:SpringMVC + Spring + Mybatis !

官網:https://spring.io/projects/spring-framework#learn

官方下載地址:https://repo.spring.io/release/org/springframework/spring/

GITHUB:https://github.com/spring-projects/spring-framework

Maven:https://mvnrepository.com/artifact/org.springframework/spring-webmvc/5.2.8.RELEASE

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>


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

1.2、優點

  • Spring 是一個開源的免費的框架(容器)!
  • Spring 是一個輕量級的,非入侵式的框架 !
  • 控制反轉(IOC)、面向切面程式設計(AOP)
  • 支援事務的處理,對其他框架整合支援。
    • 事務:對一系列資料庫統一的提交和回滾

總結:Spring 就是一個 輕量級的控制反轉(IOC) 和 面向切面程式設計(AOP) 的框架!

1.3、組成

img

1.4、

現代化的 Java 開發

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-bNelsPC4-1600994927103)(C:\Users\acer\AppData\Roaming\Typora\typora-user-images\image-20200908142859533.png)]

  • Spring Boot
    • 快速開發的腳手架
    • 基於springboot可以快速開發單個微服務
    • 使 ==> 約定大於配置
  • Spring Cloud
    • Spring Cloud 是基於Spring Boot實現的。

現在大多數公司都在使用 Springboot 進行快速開發,學習SpringBoot的前提,需要完全掌握Spring 及 SpringMVC!!(承上啟下的作用!)

弊端:發展了太久之後,違背了原來的理念!配置十分繁瑣,人稱:“配置地獄”。

2、IOC理論推導

在我們之前的業務中,使用者需求可能會影響我們原來的程式碼,我們需要根據使用者的需求就行修改原始碼!如果程式的程式碼量非常大,修改一次程式碼的代價是否昂貴!

在這裡插入圖片描述

我們使用一個Set介面實現。

//    private UserDao userDao = new UserDaoImpl();
      private UserDao userDao;
//  利用set 進行動態實現值的注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
  • 之前,程式是主動建立物件的:UserDao userDao = new UserDaoImpl();
  • 使用Set注入後,程式不再具有主動性,而是程式設計了被動的接收物件。(使用者需要用到什麼我們就傳入到 set 什麼,少了可以在進行建立新的。)

這種思想,從本質上解決了問題,我們不用再去管理物件的建立了。系統的耦合性大大的降低,可以更加專注在業務的實現上。這是 IOC 的原型!

在這裡插入圖片描述

IOC本質

控制反轉IoC(Inversion of Control),是一種設計思想,DI(依賴注入)是實現IoC的一種方法,也有人認為DI只是IoC的另一種說法。沒有IoC的程式中 , 我們使用物件導向程式設計 , 物件的建立與物件間的依賴關係完全硬編碼(完全寫死的)在程式中,物件的建立由程式自己控制,控制反轉後將物件的建立轉移給第三方,個人認為所謂控制反轉就是:獲得依賴物件的方式反轉了

在這裡插入圖片描述

IoC是Spring框架的核心內容,使用多種方式完美的實現了IoC,可以使用XML配置,也可以使用註解,新版本的Spring也可以零配置實現IoC。

Spring容器在初始化時先讀取配置檔案,根據配置檔案或後設資料建立與組織物件存入容器中,程式使用時再從Ioc容器中取出需要的物件。

在這裡插入圖片描述

採用XML方式配置Bean的時候,Bean的定義資訊是和實現分離的,而採用註解的方式可以把兩者合為一體,Bean的定義資訊直接以註解的形式定義在實現類中,從而達到了零配置的目的。

控制反轉是一種通過描述(XML或註解)並通過第三方去生產或獲取特定物件的方式。在Spring中實現控制反轉的是IoC容器,其實現方法是依賴注入(Dependency Injection,DI)。

3、HelloSpring

實體類

public class Hello {
    private String str;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    @Override
    public String toString() {
        return "Hello{" +
                "str='" + str + '\'' +
                '}';
    }
}

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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    使用 spring 來建立物件。在spring中都成文bean

        bean = 物件  new Hello()
        id = 變數名
        class = new 的物件
        property 相當於給物件中的屬性設定一個值
-->
    <bean id="hello" class="com.lsw.pojo.Hello">
        <property name="str" value="Spring"/>
    </bean>

</beans>
  • bean => 物件 new Hello() ——>進行物件的託管
  • id => 變數名/物件名
  • class => new 的class物件
  • property => 相當於給物件中的屬性設定一個值
  • name:屬性名
    • ref 是引用 Spring 容器中建立好的物件
    • value 是具體建立的值,基本資料型別!

這個過程稱為 控制反轉

控制:誰來控制物件的建立,傳統的應用程式的物件是由程式本身控制建立的,使用Spring後,物件是由Spring來建立的。

反轉:程式本身不建立物件,而變成被動的接收物件。

依賴注入:就是利用 Set 的方法來進行注入【必須要有set方法】。

IOC 是一種程式設計思想,由主動的程式設計程式設計 被動的接收

可以通過該 newClassPathXmlApplicationContext 去瀏覽一下底層的原始碼。

到現在,我們可以不用在程式中去改動了,要實現不同的操作,只需要在xml配置檔案中進行修改,所謂的IOC ,一句話就是 物件由Spring建立,管理,裝配!

測試類

public class MyTest {
    public static void main(String[] args) {
//        獲取spring 的上下文物件!
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//        我們的物件都在 Spring中管理,我要使用,直接去裡面取出來就可以了。
//      get我們需要的bean的id,強轉成我們需要的物件
        Hello hello = (Hello) context.getBean("hello");
        System.out.printf( hello.toString());
    }
}

例項化容器

獲取 spring 的上下文物件。**Spring 例項化容器就相當於 “婚介網站” **

我們的物件都在 Spring 中管理,我要使用,直接去beans.xml裡面取出來就可以了。

getBean 取出我們需要的bean,通過 bean 的 id 進行標記,強轉成我們需要的物件

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

提供給ApplicationContext建構函式的一個或多個位置路徑是資源字串,可讓容器從各種外部資源(例如本地檔案系統,Java等)載入配置後設資料CLASSPATH

例項化的時候會把裡面的所有物件都建立出來

<?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="UserMysqlImpl" class="com.lsw.dao.UserMysqlImpl"/>
    <bean id="UserOracleImpl" class="com.lsw.dao.UserOracleImpl"/>
  
    <bean id="UserServiceImpl" class="com.lsw.service.UserServiceImpl">

        <property name="userDao" ref="UserMysqlImpl"/>

    </bean>
</beans>

總結

  • 所有的類都需要裝備到 Bean 中
  • 所有的Bean 都需要容器去取
  • 容器中取得的 Bean 就是一個物件

4、IOC建立物件的方式

使用無參構造方法建立物件(預設)

 public User() {
        System.out.println("User 的無參構造方法。");
    }
    <bean id="user" class="com.lsw.pojo.User">
        <property name="name" value="時傾"/>
    </bean>
public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//      get我們需要的bean的id,強轉成我們需要的物件
        User user = (User) context.getBean("user");
        user.show();
    }

使用有參構造方法建立物件

    public User(String name) {
        this.name = name;
    }

1.引數下標賦值

<!--  第一種方式,下標賦值 -->
    <bean id="user" class="com.lsw.pojo.User">
        <constructor-arg index="0" value="盧大大"/>
    </bean>

2.型別匹配

不建議使用

        <bean id="user" class="com.lsw.pojo.User">
            <constructor-arg type="java.lang.String" value="asdf..."/>
        </bean>

3.直接通過引數名

        <bean id="user" class="com.lsw.pojo.User">
            <constructor-arg type="name" value="asdf..."/>
        </bean>

總結:

在配置檔案 beans.xml 載入的時候,例項化容器中的物件都已經被全部建立初始化出來了

無論是不是用,都會初始化容器裡面的東西。

相關文章