Spring Framework5.X快速入門

什麼是Spring

輕量級的 DI / IoC 和 AOP 容器的開源框架php

spring.io/projects/sp…java

  • 好處
    • 管理建立和組裝對象之間的依賴關係 使⽤前:⼿⼯建立
Controller -> Service -> Dao
UserControoler
private UserService userService = new UserService();
複製代碼

使用後:由spring建立,自動導入web

⾯向切⾯編程(AOP)

能夠解耦核⼼業務和邊緣業務的關係redis

  • 場景:⽤戶調⽤下單購買視頻接⼝,須要判斷登陸,攔截器是AOP思想的⼀種實現
  • 使⽤前:代碼寫邏輯,每次下單都調⽤⽅法判斷,多個⽅法須要判斷登陸則都須要 登陸⽅法 判斷
  • 使⽤後:根據⼀定的⽅法或者路徑規則進⾏判斷是否要調⽤,下降代碼耦合度
  • 包含java⼤型項⽬⾥⾯常⻅解決⽅案 web層、業務層、數據訪問層等
  • 極其便利的整合其餘主流技術棧,⽐如redis、mq、mybatis、jpa
  • 社區龐⼤和活躍,在微服務、⼤數據、雲計算都有對應的組件

使⽤ IDEA + Maven + Spring5建立項⽬

  • pom.xml添加依賴
<dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>
    </dependencies>
複製代碼
  • 添加配置⽂件applicationContext.xml

id是別名,property是給實體類的屬性注入值spring

<?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="video" class="cn.junko.domain.Video">
        <property name="id" value="1"></property>
        <property name="name" value="jjbq"></property>
    </bean>

</beans>
複製代碼
  • 編寫Bean 引用上面配置的bean的id,就可以依賴容器自動獲得對象
public class app {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Video video = (Video) applicationContext.getBean("video");
        System.out.println(video.getName());
    }
}
複製代碼

打印一下,可以成功獲得對象和數據編程

Spring的applicationContext.xml配置文件

這裏講一下基礎的xml配置標籤緩存

  • bean標籤 id屬性:指定Bean的名稱,在Bean被別的類依賴時使⽤
  • name屬性:⽤於指定Bean的別名,若是沒有id,也能夠⽤name
  • class屬性:⽤於指定Bean的來源,要建立的Bean的class類,須要全限定名

ApplicationContext是spring 的核心接口,應用程序上下文,只要是spring對象被掃描以後,就能夠在這裏進行管理獲取,而ClassPathXmlApplicationContext就可以在這個類路徑下面去找xml,而後根據bean的id和name去取對應容器裏面的對象。包括後續哪裏須要注入的時候就能注入進去,不須要手工去new,只須要get一下session

spring的IOC設計思想

什麼是IOC

IOC Inverse of Control(控制反轉)是⼀種設計思想 將本來在程序中⼿動建立對象的流 程,交由Spring框架來管理 核⼼:把建立對象的控制權反轉給Spring框架,對象的⽣命週期由 Spring統⼀管理,即mybatis

  • 把spring ioc 當成⼀個容器,⾥⾯存儲管理的對象稱爲Bean類實例,對象的建立,依賴都能進行統一的管理

spring的依賴注入講解

什麼是依賴注入

DI Dependency Injection ,依賴注⼊ IOC容器在運⾏期間,動態地將對象某種依賴關係注⼊到對象之中,⽐如視頻訂單對象,依賴⽤視 頻對象 建立另外一個實體類,在裏面加入Video的對象,而後編寫xml文件app

<bean id="video" class="cn.junko.domain.Video">
        <property name="id" value="1"></property>
        <property name="name" value="jjbq"></property>
    </bean>
    <bean id="videoOrder" class="cn.junko.domain.VideoOrder">
        <property name="id" value="1"></property>
        <property name="outTrade" value="123123123"></property>
        <property name="video" ref="video"></property>
    </bean>
複製代碼

接着去運行打印,能夠發如今建立videoOrder對象的時候,Video的對象也被建立,而且成功注入數據

VideoOrder videoOrder= (VideoOrder) applicationContext.getBean("videoOrder");
        System.out.println(videoOrder.getId());
        System.out.println(videoOrder.getVideo().getName());
複製代碼

Spring的bean的scope做用域講解

在bean標籤中,可讓咱們告訴spring何時產生一個新的bean,仍是用單個bean,這就是scope的做用

  • scope屬性(默認是singleton)
    • singleton:單例, 默認值,調⽤getBean⽅法返回是同⼀個對象,實例會被緩存起來,效率⽐較⾼ 當⼀個bean被標識爲singleton時候,spring的IOC容器中只會存在⼀個該bean
  • prototype: 多例,調⽤getBean⽅法建立不一樣的對象,會頻繁的建立和銷燬對象形成很⼤的開銷
  • 其餘不經常使用的:
    • request :每一個Http請求都會建立⼀個新的bean
    • session: 每一個Http Session請求都會建立⼀個新的bean
    • global session(基本不⽤)

當使用scope=singleton建立對象,地址是同樣的

spring的常見的注入方式

  • 使⽤set⽅法注⼊
<bean id="video" class="cn.junko.domain.Video" scope="singleton">
        <property name="id" value="1"></property>
        <property name="name" value="jjbq"></property>
    </bean>
複製代碼
  • 使⽤帶參的構造函數注⼊
<bean id="video" class="cn.junko.domain.Video" scope="singleton">
        <constructor-arg name="id" value="2"></constructor-arg>
        <constructor-arg name="name" value="123123"></constructor-arg>
    </bean>
複製代碼
  • POJO類型注⼊(property 沒有使⽤value屬性,⽽是使⽤了ref屬性)
<bean id="video" class="cn.junko.domain.Video" scope="singleton">
        <constructor-arg name="id" value="2"></constructor-arg>
        <constructor-arg name="name" value="123123"></constructor-arg>
    </bean>
    
    <bean id="videoOrder" class="cn.junko.domain.VideoOrder">
        <property name="id" value="1"></property>
        <property name="outTrade" value="123123123"></property>
        <property name="video" ref="video"></property>
    </bean>
複製代碼

注意: 類的構造函數重寫的時候,⼀定要保留空構造函數!!!

List和Map類型的注入

在實體類中添加list和map並生成對應的方法

<bean id="video" class="cn.junko.domain.Video" scope="singleton">
        <property name="id" value="1"></property>
        <property name="name" value="jjbq"></property>
        <property name="list1">
            <list>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </list>
        </property>
        <property name="map1">
            <map>
                <entry key="1" value="1111111"></entry>
                <entry key="2" value="2222222"></entry>
                <entry key="3" value="3333333"></entry>
            </map>
        </property>
    </bean>
複製代碼

spring裏面bean的依賴和繼承

bean繼承:兩個類之間⼤多數的屬性都相同,避免重複配置,經過bean標籤的parent屬性重⽤已 有的Bean元素的配置信息 繼承指的是配置信息的復⽤,和Java類的繼承沒有關係

<bean id="video" class="cn.junko.domain.Video" scope="singleton" parent="video">
            <property name="name" value="這是video2"></property>
    </bean>
複製代碼
  • 屬性依賴

若是類A是做爲類B的屬性, 想要類A⽐類B先實例化,設置兩個Bean的依賴關係

<bean id="video" class="cn.junko.domain.Video" scope="singleton">
 <property name="id" value="9"/>
 <property name="title" value="spring1" />
</bean>
<!--設置兩個bean的關係,video要先於videoOrder實例化-->
<bean id="videoOrder" class="cn.junko.domain.VideoOrder" dependson="video">
 <property name="id" value="8" />
 <property name="outTradeNo" value="777777"/>
 <property name="video" ref="video"/>
</bean>
複製代碼
相關文章
相關標籤/搜索