天天看點

SSM架構-----Spring篇

SSM架構是spring MVC,spring和mabatis架構的整合,是标準的MVC模式,将整個系統劃分為表現層,controller層,service層,DAO層四層。

spring MVC:負責請求的轉發和視圖管理。

spring        :實作業務對象管理。

mybatis      :作為資料對象的持久化引擎。

一.談談你對Spring架構的了解

1.Spring是什麼?

    Spring一個開源的,用來簡化企業級應用開發的應用開發架構。Spring的核心就是IOC(控制反轉)和AOP(面向切面程式設計)。

  Spring容器:spring架構中的一個核心子產品,用來管理對象(包括對象的建立,銷毀和初始化等)。它幫助完成類的初始化與裝配工作,讓開發者從這些底層類的執行個體化,依賴關系裝配類的工作中脫離出來,專注于更有意義的業務邏輯開發工作。

    啟動spring容器:

        step1.導3.2.8的包

        step2.配置xml檔案+junit包(這個包是為了測試用的)

        step3.讀xml檔案建立容器

SSM架構-----Spring篇
SSM架構-----Spring篇
SSM架構-----Spring篇
SSM架構-----Spring篇

Spring如何建立對象?——spring容器依據配置檔案建立對象。

方式一: 無參構造器(或者預設構造器) 

step1:為類添加無參構造器(内部有了這個無參構造的類就可以省略這一步) 

step2:配置檔案中添加一個bean元素

step3:啟動建立容器,調用容器的getBean方法就是執行個體化這個類傳回對象<---重要思想!!!!!!!!!!!!!

Step1:                                                                                                                                              

SSM架構-----Spring篇

 step2:

SSM架構-----Spring篇

step3:

SSM架構-----Spring篇

方式二: 用靜态工廠方法建立(了解即可)---解決抽象類

SSM架構-----Spring篇

Calendar c = ac.getBean("cal",Calendar.class);

方式三: 用執行個體工廠方法建立(了解即可)---解決抽象類

SSM架構-----Spring篇

Date time = ac.getBean("time",Date.class);

2.Spring的作用:

  a.簡化開發:spring對常用的API都做了一些簡化和封裝(比如,用spring jdbc通路資料庫,就不用考慮如何擷取連接配接和關閉連接配接)。

  b.解耦:spring幫我們管理對象的依賴關系,這樣對象間的耦合度低,友善維護。

  c.內建其他架構:spring可以将其他的架構內建進來。(比如可以将Mybatis等架構內建進來)

1.1 ioc是什麼?

     IOC——:inversion of control,即“控制反轉”,ioc不是一種技術,是一種設計思想,一個重要的面向對象程式設計的法則。在java開發中,IOC意味着将你設計好的對象交給容器控制,而不是在傳統的在你的對象内部直接控制。

  何為“控制”:傳統的JAVA SE程式設計,我們是從對象内部通過new建立對象,是程式控制對象的建立,而IOC有一個專門的容器(IOC容器)建立對象,IOC容器控制外部資源的擷取(包括對象,檔案等)。

  何為“反轉”:傳統應用程式是由我們自己在對象中主動控制去直接擷取依賴對象,即“正轉”。而“反轉”,是由容器來幫我們去建立及注入依賴對象。對象隻是被動的接受依賴對象。依賴對象的擷取被反轉了。

1.2 ioc有什麼用?

   ioc容器能幫我們管理對象的依賴關系,這樣對象與對象的耦合度低,友善代碼的維護。對于spring架構來說,ioc就是由spring來負責控制對象的生命周期和對象間的關系。

1.3 DI

  DI——dependenc injection,即“依賴注入”。IOC與DI有什麼關系呢?其實它們是同一個概念的不同角度描述。“依賴注入”,相對ioc而言,“依賴注入”明确地描述了“被注入對象”依賴ioc容器配置依賴對象。IOC的一個重點是在系統運作中,動态的向某個對象提供所需要的其他對象,這一點通過DI實作。DI如何實作?這就要引入java 1.3之後的一個重要特征——反射(reflection)。它允許程式在運作的時候動态生成對象、執行對象的方法、改變對象的屬性。spring就是通過反射注入的。

1.4 spring的兩種注入方式

 1.4.1. 構造器注入:通過調用的類的構造函數,将接口實作類通過構造函數變量傳入。

構造器注入步驟:

step1.添加相應構造器:                                                                                                                               

SSM架構-----Spring篇
SSM架構-----Spring篇

step2:配置檔案xml

SSM架構-----Spring篇
SSM架構-----Spring篇

xml的啟動相當于容器的啟動,constructor-arg意思是構造器,相當于寫了Manager類的構造方法ref=cp相當于Computer類型的對象cp,因為構造方法裡面有this.cp=cp;是以就相當與給Manager類裡面的cp指派了(類型必須是比對的,都是Computer類型)相當于就在xml表裡面寫了Manager(Computer cp){},xml一啟動就調用了

SSM架構-----Spring篇
SSM架構-----Spring篇

1.4.2:setter方法注入:是容器通過調用無參構造器或無參static 工廠方法實列化bean之後,調用該bean的setter方法, 即實作了基于setter的依賴注入

  set方法注入步驟:

  step1.為A類添加 IB類型常量并寫上setB():                                                                                              

SSM架構-----Spring篇
SSM架構-----Spring篇
SSM架構-----Spring篇
SSM架構-----Spring篇

 step2.配置檔案xml:

SSM架構-----Spring篇

這個name=b相當于寫了A類裡面的setB方法,ref=c相當于C類型的對象c,因為set方法裡面是this.b=b,是以一旦調用set方法就相當于給A類裡面的b指派了

SSM架構-----Spring篇
SSM架構-----Spring篇
SSM架構-----Spring篇

一.使用注解簡化配置檔案------------------------------------------------

元件掃描: Spring容器啟動之後會檢查某個包以及子包下面的所有的類,如果類前面有特定注解(比如@Component),

則容器會将該類納入容器進行管理(就相當于配置了一個bean元素)          

其中init跟destroy的注釋@PostConstruct跟@PreDestroy是sun公司的,要導annotation包

生命周期相關注解:@PostConstruct/@PreDestroy

延遲加載和作用域相關注解:@Lazy(true)/@Scope("prototype")/@Scope("singleton")

依賴注入相關注解(就是set注入和構造器注入):@Autowired和@Qualifier("wt") ,@Qualifier如果不加的話,會按照byType的方式來自動裝配,就有可能找到多個,建議最好使用該注解,明确指定被注入的bean的id。

@Resource(name="wt"): 1.隻支援set方法的注入. 2.使用name屬性指定被注入的bean的id

SSM架構-----Spring篇
SSM架構-----Spring篇

STEP1.在類前面加注釋,方法前面加注釋

SSM架構-----Spring篇

STEP2.配置裡面掃描包

SSM架構-----Spring篇

SSM架構-----Spring篇

測試結果1 :         

SSM架構-----Spring篇

測試結果2:                       

SSM架構-----Spring篇

測試結果3:

SSM架構-----Spring篇

Restaurant是set注入, Leader是有參構造方法注入, Manager是@Resource(name="")注入<

SSM架構-----Spring篇

SSM架構-----Spring篇
SSM架構-----Spring篇
SSM架構-----Spring篇

 測試

SSM架構-----Spring篇

測試結果5:

SSM架構-----Spring篇

 測試結果6:

SSM架構-----Spring篇

測試結果7:

SSM架構-----Spring篇

2.1 AOP

2.1.1   Aop是什麼?

 AOP——(Aspect-Oriented Programming),即面向切面程式設計。AOP可以說是OOP的補充和完善,是Spring架構核心功能之一。

2.1.2   AOP的特點(優勢)?

為了解決當我們需要為分散的對象引入公共行為的時候,如程式中交叉業務邏輯(系統日志,事務處理,系統安全驗證,系統資料緩存等等),這是我們應當把它封裝成一個切面,注入到目标對象(具體邏輯)中去。可以簡化代碼開發和效率,能夠在不改變原有代碼的基礎上擴充新的功能實作。

2.1.3AOP 核心概念、術語

AOP把軟體系統分為兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關系不大的部分是橫切關注點。其相關概念術語如下: 

切面(aspect): 橫切面對象,一般為一個具體類對象(本質就是加了@Aspect注解的類)

通知(advice):攔截到連接配接點之後隻要執行的方法

切入點(pointcut):對連接配接點攔截内容的一種定義

連接配接點(joinpoint):程式執行過程中某個特定的點,一般指被攔截到的的方法

目标對象(target):代理的目标對象。

通知(Advice):在切面的某個特定連接配接點上執行的動作,例如before,after等 

知識點術語強化:

1) 切面(可以簡單了解為要植入的新的業務功能,這個功能交給某個類負責,這個類就是切面)

2) 通知(可以簡單了解為一個業務中的擴充邏輯的若幹步驟,例如先做什麼(before),再做什麼(afterReturn),最後做什麼)

3) 切入點(在原有的哪些業務方法上擴充新的業務,可以将切入點了解為方法的集合)

4) 連接配接點(可以簡單了解為切入點中的一個具體方法)

5) 目标對象(需要擴充功能的那個對象,一般為被代理對象)

6) 代理對象(負責調用切面中的方法為目标對象植入新的功能)

2.1.4 Spring AOP 的程式設計實作

Spring中AOP代理由Spring的IOC容器負責生成、管理。

其依賴關系也由IOC容器負責管理。

是以,AOP代理可以直接使用容器中的其它bean執行個體作為目标,

這種關系可由IOC容器的依賴注入提供。Spring建立代理的規則為:

1、預設使用Java動态代理來建立AOP代理,這樣就可以為任何接口執行個體建立代理了

2、當需要代理的類不是代理接口的時候,Spring會切換為使用CGLIB代理。

AOP程式設計其實是很簡單的事情,縱觀AOP程式設計,程式員隻需要參與三個部分:

1. 定義普通業務元件(切面)

2. 定義切入點,一個切入點可能橫切多個業務元件

3. 定義增強處理,增強處理就是在AOP架構為普通業務元件織入的處理動作。

是以進行AOP程式設計的關鍵就是定義切入點和定義增強處理,一旦定義了合适的切入點和增強處理,AOP架構将自動生成AOP代理

2.1.5 AOP怎麼用?

面向切面@Aspect

step1. 導入3個Maven jar包,spring-context(裡面包含了spring-aop),aspectjrt,aspectjweaver

SSM架構-----Spring篇

step2. 配置spring-aop.xml

SSM架構-----Spring篇

step3.寫一個代理類,這個類相當于切面,注解@Aspect@Component,英文意思就是切面,掃描,

@Order(1)多個切面類時執行順序注解,數字越小越先執行,在方法前面加你要的功能注解并指向被代理類,稱為切入點如:@Before("bean(projectServiceImpl)"),實作類開頭字母小寫

  @AfterThrowing @AfterReturning @After 分别為目标方法異常後,目标方法正常結束後,目标方法之後, 

  空間想象就是當被代理類進來的時候會先經過代理類這個\'橫切面\'過濾,在被代理類方法運作前後記錄日志

SSM架構-----Spring篇
SSM架構-----Spring篇

step4. 被代理類實質上就是業務層,必須有注解@Service

SSM架構-----Spring篇

step5. 測試的時候getBean("業務層類名開頭字母小寫",指向業務層實作的那個接口的名字);

SSM架構-----Spring篇

SSM架構-----Spring篇

SSM架構-----Spring篇

step6. 對面向切面的接入點封裝,之後就直接調用,如:@Before("method()")

    @Pointcut("bean(projectServiceImpl)")

    public void method(){}