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文件創建容器
Spring如何創建對象?——spring容器依據配置文件創建對象。
方式一: 無參構造器(或者缺省構造器)
step1:為類添加無參構造器(內部有了這個無參構造的類就可以省略這一步)
step2:配置文件中添加一個bean元素
step3:啟動創建容器,調用容器的getBean方法就是實例化這個類返回對象<---重要思想!!!!!!!!!!!!!
Step1:
step2:
step3:
方式二: 用靜態工廠方法創建(了解即可)---解決抽象類
Calendar c = ac.getBean("cal",Calendar.class);
方式三: 用實例工廠方法創建(了解即可)---解決抽象類
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.添加相應構造器:
step2:配置文件xml
xml的啟動相當於容器的啟動,constructor-arg意思是構造器,相當於寫了Manager類的構造方法ref=cp相當於Computer類型的對象cp,因為構造方法里面有this.cp=cp;所以就相當與給Manager類里面的cp賦值了(類型必須是匹配的,都是Computer類型)相當於就在xml表里面寫了Manager(Computer cp){},xml一啟動就調用了
1.4.2:setter方法注入:是容器通過調用無參構造器或無參static 工廠方法實列化bean之后,調用該bean的setter方法, 即實現了基於setter的依賴注入
set方法注入步驟:
step1.為A類添加 IB類型常量並寫上setB():
step2.配置文件xml:
這個name=b相當於寫了A類里面的setB方法,ref=c相當於C類型的對象c,因為set方法里面是this.b=b,所以一旦調用set方法就相當於給A類里面的b賦值了
一.使用注解簡化配置文件------------------------------------------------
組件掃描: 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
STEP1.在類前面加注釋,方法前面加注釋
STEP2.配置里面掃描包
測試結果1 :
測試結果2:
測試結果3:
Restaurant是set注入, Leader是有參構造方法注入, Manager是@Resource(name="")注入<
測試
測試結果5:
測試結果6:
測試結果7:
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
step2. 配置spring-aop.xml
step3.寫一個代理類,這個類相當於切面,注解@Aspect@Component,英文意思就是切面,掃描,
@Order(1)多個切面類時執行順序注解,數字越小越先執行,在方法前面加你要的功能注解並指向被代理類,稱為切入點如:@Before("bean(projectServiceImpl)"),實現類開頭字母小寫
@AfterThrowing @AfterReturning @After 分別為目標方法異常后,目標方法正常結束后,目標方法之后,
空間想象就是當被代理類進來的時候會先經過代理類這個'橫切面'過濾,在被代理類方法運行前后記錄日志
step4. 被代理類實質上就是業務層,必須有注解@Service
step5. 測試的時候getBean("業務層類名開頭字母小寫",指向業務層實現的那個接口的名字);
step6. 對面向切面的接入點封裝,之后就直接調用,如:@Before("method()")
@Pointcut("bean(projectServiceImpl)")
public void method(){}