Spring討論班


簡單回顧

1、什麼是Spring框架?

Spring是一個開放源代碼的設計層面框架,他解決的是業務邏輯層和其他各層的鬆耦合問題,因此它將面向接口的編程思想貫穿整個系統應用

Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson創建。簡單來說,Spring是一個分層的JavaSE/EEfull-stack(一站式) 輕量級開源框架。

2、Spring框架有哪些特徵?

(1)輕量:完整的Spring框架可以在1MB多的JAR文件發佈,而且是非侵入式的:Spring應用中的對象不依賴於Spring的特定類。
(2)控制反轉(Inversion of Control ):促進低耦合,當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創建或者查找依賴對象。你可以認爲IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它

JNDI http://blog.csdn.net/zhaosg198312/article/details/3979435

(3)面向切面(Aspect Oriented Program):Spring提供了面向切面編程的豐富支持,允許通過分離應用的業務邏輯與系統級服務進行內聚性的開發。應用對象只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支持。

(4)容器:Spring**包含並管理應用對象的配置和生命週期,在這個意義上它是一種容器,你可以配置你的每個bean如何被創建——基於一個可配置原型(prototype)**,你的bean可以創建一個單獨的實例或者每次需要時都生成一個新的實例——以及它們是如何相互關聯的。
(5)框架:Spring可以將簡單的組件配置、組合成爲複雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件裏。Spring也提供了很多基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發留給了你。

環境初步搭建

開發環境:idea

1、選擇左側箭頭Create New Project,出現右側彈框後,選擇Spring,記得在右側箭頭處打鉤,然後就可以Next。

這裏寫圖片描述

2、Iidea會自動幫你下好Spring的jar包(所以上步操作需要聯網)和spring-config.xml文件
這裏寫圖片描述


舉個例子介紹框架

普通寫法:

1、創建一個實體類HelloJoiner,有三個屬性name,grade,department以及對應的set方法爲了輸出重寫了tostring方法。

這裏寫圖片描述

2、創建一個TestHelloJoiner類,要輸出HelloJoiner的實例化對象需要三步(如圖)。
開啓debug測試,發現在(1、創建對象時)初始化構造器,之後的set方法逐步調用。

這裏寫圖片描述


框架寫法

1、第一步實體類不用動,在spring-config裏面加上(如下圖)

<?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="helloJoiner" class="com.entity.HelloJoiner">
        <property name="name" value="卓小音"></property>
        <property name="grade" value="2015級"></property>
        <property name="department" value="產品部"></property>
    </bean>
</beans>

這裏寫圖片描述
2、配置好HelloJoiner的信息後,要輸出HelloJoiner的實例化對象也需要三步(如圖)。
開啓Debug,發現在(1、創建Spring的IOC對象時)就已經調用了初始化,和所有的set方法
這裏寫圖片描述


IOC和DI

IOC控制反轉

應用程序不再負責依賴對象的創建和維護,而是由外部容器負責創建和維護。

舉一個例子:

在我們卓音工作室,每位部門成員都有一件屬於自己部門的文化衫。

這裏寫圖片描述

定義一個文化衫接口類

這裏寫圖片描述

其中,前端,後端,產品部分別實現這個文化衫接口類

package com.entity.goods.impl;

import com.entity.goods.CultureClothes;

/**
 * FrontClothesImpl前端文化衫的實現類
 *
 * @author zhaiaxin
 * @time: 2017/9/24 18:29.
 */
public class FrontClothesImpl implements CultureClothes{

    @Override
    public void printClothes() {
        System.out.println("my clothes has a cute lion");
    }
}

package com.entity.goods.impl;

import com.entity.goods.CultureClothes;

/**
 * BackClothesImpl後端文化衫的實現類
 *
 * @author zhaiaxin
 * @time: 2017/9/24 18:26.
 */
public class BackClothesImpl implements CultureClothes{

    @Override
    public void printClothes() {
        System.out.println("my clothes has a cute orang");
    }
}

package com.entity.goods.impl;

import com.entity.goods.CultureClothes;

/**
 * ProductClothesImpl產品文化衫的實現類
 *
 * @author zhaiaxin
 * @time: 2017/9/24 18:30.
 */
public class ProductClothesImpl implements CultureClothes{

    @Override
    public void printClothes() {
        System.out.println("my clothes has a cute dog");
    }
}

剛開始,身爲一個正式的成員,必須在new自己的同時new自己部門的文化衫(找一件白短袖自己去畫上自己部門的logo)

這裏寫圖片描述

後來,由於潮流的改變,大家不滿足於過去文化衫陳舊的款式,每年都想要最新樣式的文化衫,但是每個人按照之前的方式再去自己new,這樣做太過麻煩,於是把文化衫製作的任務交給服裝廠。

這裏寫圖片描述

大家只需要給服裝廠說出自己的部門logo,就可以撒手不管了,很省事。

這裏寫圖片描述

直到今天,卓音的成員已成爲懶癌患者,連自己去聯繫服裝廠做文化衫都懶得動,於是將全部的任務都交給一個負責人,負責人統一管理各個部門的文化衫。
這裏寫圖片描述

當自己需要自己部門的文化衫時,給負責人說一下,負責人就分發給你。(負責人的作用就相當於IOC容器)

這裏寫圖片描述

上述例子簡要介紹了下IOC是怎麼產生的。

首先就是當joiner需要一個cultureClothes對象的時候,這時候就產生了依賴關係,各種文化衫就是joiner的依賴對象,剛開始的時候,joiner需要依賴對象的時候,需要自己去new一個對象,這時候joiner和依賴對象的耦合度是最高的

在依賴對象類型多的時候,joiner來管理就變得很麻煩,所以後來就產生了工廠,採用工廠設計模式,把依賴對象的創建過程交給工廠去管理,我們只需要管理一個工廠就好,這時候person和依賴對象的耦合程度就降低了。

後來又產生了使用IOC容器去管理我們的依賴對象,這時候在我們的代碼不會看到new依賴對象,只需要配置文件就好,通過IOC達到鬆耦合的目的,讓Spring管理應用對象的配置和生命週期,而我們不需要去new對象。

DI依賴注入

構造注入

就是通過構造方法把依賴對象傳入,在Spring配置文件這麼寫就好。 (圖中Joiner的構造方法是有參方法,且參數是一個引用類型,若爲基本類型,則把 <constructor-arg type="com.entity.goods.CultureClothes" ref="backClothes">
</constructor-arg>
中的ref屬性改爲value即可)
這裏寫圖片描述

設值注入

設值注入就是通過setter方法把依賴的對象傳入,在Spring中做如下配置即可。
這裏寫圖片描述


IOC容器

IOC容器的基礎

org.springframework.beansorg.springframework.context這兩個包是IOC容器的基礎,要使用Spring的IOC功能,需要導入這兩個jars。

IOC容器的作用

這裏寫圖片描述

IOC容器的主要作用就是管理我們beans,只需要我們把配置文件寫好,IOC容器就會根據配置信息提供給我們想要的beans,在需要對象的時候可以直接和IOC容器去要,不需要手動去new一個對象。

IOC容器的實現

Spring提供了兩種類型的IOC容器的實現:

BeanFactory:IOC容器的基本實現。他是訪問bean的頂層接口,提供了能夠管理任何類型的對象的高級配置機制,就是提供了配置bean的框架和一些基本的功能。

ApplicationContext 提供了更多高級特性,是BeanFactory的子接口,在BeanFactory的基礎上添加了 許多企業專用的功能,它是BeanFactory的超集,所以大多數情況下org.springframework.context.ApplicationContext這個接口代表着IOC容器,它負責對象的實例化配置和裝配。這是他們的繼承關係:

這裏寫圖片描述

ApplicationContext的兩個主要實現類:

        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//從ClassPath中加載XML配置文件
       ApplicationContext context1 = new FileSystemXmlApplicationContext("F:\\workSpace\\axin\\Spring\\src\\spring-config.xml");//從文件系統中加載XML配置文件

Bean作用域

默認作用域:單例模式scope="singleton"
這裏寫圖片描述
1、 prototype:允許Bean的定義可以被實例化多次。每次調用都創建一個新的實例。
2、request:在一次http請求中,每個Bean對應一個實例。僅在基於web的Spring上下文中才有效。
3、 session:在一個HTTP Session中,每個Bean對應一個實例。僅在基於web的Spring上下文中才有效。
4、global-session:在一個全局的HTTP Session中,每個Bean對應一個實例。僅在Portlet上下文中才有效。

參考

Spring系列http://blog.csdn.net/cflys/article/category/6882976

Spring官方文檔:https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-introduction

發佈了53 篇原創文章 · 獲贊 114 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章