1. 程式人生 > 其它 >Spring框架課堂筆記

Spring框架課堂筆記

1、spring

1.1 簡介

spring 春天----給軟體行業帶來了春天

  • 2002年,spring前身interface 21框架

  • 2004年3月24號,spring框架誕生

  • Rod johnson,spring創始人

  • spring理念:使現有的技術更加的容易使用,本身是一個大雜燴,整合了現有的技術框架!

 

  • SSH:Struct2+Spring+Hibernate

  • SSM:SpringMvc + Spring + Mybatis

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

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

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

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

1.2 優點

  • Spring是一個開源的免費的框架(容器)

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

  • 控制反轉{IOC},面向切面程式設計(AOP)

  • 支援事務的處理,對框架整合的支援

 

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

1.3 Spring的組成

1.4 擴充套件

在Spring的官網有這個介紹:現代化的Java開發,說白了就是spring的開發

  • Spring Boot

    • 一個快速開發的腳手架

    • 基於SpringBoot可以快速的開發單個微服務

    • 約定大於配置

  • Spring Cloud

    • SpringCloud是基於SpringBoot實現的

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

 

弊端:發展了太久之後,違背了原來的理念 ,配置十分繁瑣

2. IOC理論推導

  1. UserDao 介面

  2. UserDaoImpl 實現類

  3. UserService 業務介面

  4. UserServiceImpl 業務實現類

在我們之前的業務中,使用者的需求可能會影響我們原來的程式碼,我們需要根據使用者的需求去修改原始碼,如果程式程式碼量很大,修改代價十分昂貴!

 

我們使用一個set介面實現,已經發現革命性變化

 private UserDao userDao;
 //利用set進行動態實現值得植入
 public void setUserDao(UserDao userDao) {
     this.userDao = userDao;
 }
  • 之前程式是主動建立物件,控制權在程式設計師手上

  • 使用了set注入後,程式不在具有主動性,而是變成了被動的接受物件

 

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

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

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

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

3. HelloSpring

Hello.java

 package com.kuang.pojo;
 
 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
         http://www.springframework.org/schema/beans/spring-beans.xsd">
 <!--   使用spring建立物件,在spring中這些都稱之為bean
         型別 變數名 = new 型別();
         Hello hello = new Hello();
         id = 變數名
         class = new 的物件
         property = 相當於給物件中的屬性設定一個值
 -->
     <bean id="hello" class="com.kuang.pojo.Hello">
         <property name="str" value="Spring"></property>
     </bean>
 
 </beans>
 

MyTest.java

 import com.kuang.pojo.Hello;
 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");
         //我們的物件現在都在spring中管理了,我們要使用,直接取出來就可以
         Hello hello = (Hello) context.getBean("hello");
         System.out.println(hello.toString());
    }
 }

思考問題?

  • Hello物件是誰建立的?

    hello物件是由Spring建立的.

  • Hello物件的屬性是怎麼設定的? hello物件的屬性是由Spring容器設定的

這個過程就叫控制反轉:

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

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

依賴注入:就是利用set方法來進行注入的.

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

可以通過newClassPathXmlApplicationcontext去瀏覽一下底層原始碼. OK,到了現在,我們徹底不用再程式中去改動了,要實現不同的操作,只需要在xml配置檔案中進行修改,所謂的loc.一句話搞定;物件由Spring來建立,管理,裝配!

4. IOC建立物件的方式

  1. 使用無參構造建立物件,預設

  2. 假設我們要使用有參構造建立物件

    1. 下標賦值

       <!--1. 下標賦值    -->
       <bean id="user" class="com.kuang.pojo.User">
           <constructor-arg index="0" value="kuangshenshuo"></constructor-arg>
       </bean>
    2. 型別賦值

       <!--2. 通過型別建立不建議使用    -->
       <bean id="user" class="com.kuang.pojo.User">
           <constructor-arg type="java.lang.String" value="qinjiangshuo"></constructor-arg>
       </bean>
    3. 引數名

       <!--3. 直接通過引數名 -->
       <bean id="user" class="com.kuang.pojo.User">
           <constructor-arg name="name" value="qinjiangshuo"></constructor-arg>
       </bean>

    總結:在配置檔案載入的時候,容器中管理的物件就已經初始化了

5. Spring配置

5.1 別名

 <!--    別名,如果添加了別名,我們可用別名-->
 <alias name="user" alias="asdvcda"></alias>

5.2 Bean的配置

 <!--
 id:bean的唯一識別符號,也就是我們學的物件名
 class:bean物件所對應的許可權命名:包名+型別
 name:也是別名,而且name可以取多個別名
 -->
 <bean id="userT" class="com.kuang.pojo.UserT" name="u2,user2;u4">
     <property name="name" value="西部開源"></property>
 </bean>

5.3 import

import一般用於團隊開發使用,可以將多個配置檔案匯入合併為一個

假設現在專案中有多個人開發,這三個人負責不同的類開發,不同的類需要註冊在不同的bean當中

用import將所有人的beans.xml合併為總的

  • 張三

  • 李四

  • 王五

  • applicationContext.xml

 <import resource="beans.xml"></import>
 <import resource="beans2.xml"></import>
 <import resource="beans3.xml"></import>

6. DI依賴注入

6.1 構造器注入

前面已經說過

6.2 Set方式注入[重點]

  • 依賴注入:Set注入

    • 依賴:bean物件的建立依賴於容器

    • 注入:bean物件中的所有屬性,由容器來注入

 

【環境搭建】

  1. 複雜型別

     package com.kuang.pojo;
     
     public class Address {
         private String address;
     
         public String getAddress() {
             return address;
        }
     
         public void setAddress(String address) {
             this.address = address;
        }
     }
  2. 真實測試物件

 private String name;
 private Address address;
 private String[] books;
 private List<String> hobbies;
 private Map<String,String> card;
 private Set<String > games;
 private Properties info;
 private String wife;
  1. 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">
         <bean id="student" class="com.kuang.pojo.Student">
     <!--       1. 普通值注入,value-->
             <property name="name" value="宋晨旭"></property>
         </bean>
     </beans>
     
  2. 測試類

     import com.kuang.pojo.Student;
     import org.springframework.context.ApplicationContext;
     import org.springframework.context.support.ClassPathXmlApplicationContext;
     
     public class MyTest {
         public static void main(String[] args) {
             ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
             Student student = (Student) context.getBean("student");
             System.out.println(student.getName());
             //System.out.println(student.getAddress());
        }
     }
  3. 完善注入資訊

     <bean id="student" class="com.kuang.pojo.Student">
     <!--       1. 普通值注入,value-->
             <property name="name" value="宋晨旭"></property>
     
             <!--2. bean注入,ref:引用spring容器中建立好的物件-->
             <property name="address" ref="address"></property>
     
             <!--3. 陣列注入,array-->
             <property name="books">
                 <array>
                     <value>紅樓夢</value>
                     <value>西遊記</value>
                     <value>水滸傳</value>
                     <value>三國演義</value>
                 </array>
             </property>
     
             <!--4. list注入,list-->
             <property name="hobbies">
                 <list>
                     <value>聽歌</value>
                     <value>玩遊戲</value>
                     <value>看電影</value>
                 </list>
             </property>
     
             <!--5. map注入,map-->
             <property name="card">
                 <map>
                     <entry key="身份證" value="1234567823"></entry>
                     <entry key="銀行卡" value="12345562315677"></entry>
                 </map>
             </property>
     
             <!--6. set注入,set-->
             <property name="games">
                 <set>
                     <value>LOL</value>
                     <value>COC</value>
                     <value>BOB</value>
                 </set>
             </property>
     
             <!--7. null注入-->
             <property name="wife">
                 <null></null>
             </property>
     
             <!--8. Properties注入-->
             <property name="info">