Spirng
設計層面框架,解決業務邏輯層與其他層面的松耦問題。
Spring IOC控制反轉:一種編程思想,藉助容器來管理對象之間的依賴關係。
Spring DI依賴注入:DI是實現IOC的一種手段,其內部是通過Java的反射機制來實現的。
Spring AOP:聲明式事務(切點、方法攔截器)。是一種OOP的延伸,用於給不存在繼承關係的對象之間引用一個公共行爲。
Spring Bean的生命週期
Bean的生命週期(10個):
Bean建立、Setter、BeanName、BeanFactory、加工構造前、參數注入後、構造、加工構造後、默認銷燬、自定義銷燬
SpringMVC
SpringMVC怎麼處理請求的 (Handler:處理器 、resolver解析器、Adapter適配器)
Model模型:存取數據
View視圖:展示數據
Controller控制器:與用戶進行交互
DispatcherServlet 前端控制器:接收用戶請求
HandlerAdapter 處理器適配器:選擇合適的處理器,並且調用相應功能處理方法
ViewResolver 視圖解析器
用戶發送請求和返回響應的流程:
1.發送請求 至DispatcherServlet
2.映射處理器 獲取處理器映射至 DispatcherServet
3.HandlerAdapter進行處理器適配
4.調用處理器相應功能處理方法 (獲得 View 和model 至DispatcherServlet ) 這裏涉及Controller
5.ViewResolver 接收View 進行視圖解析
6.Model加入到View 中進行視圖渲染
7.DispatcherServlet返回響應
Spring Security
Spring Security是什麼?
Spring Security是一個強大且高度可定製的身份驗證和訪問控制架構。
SpringSecurity的兩個操作:
認證:確認用戶可以訪問當前系統。
授權:確認用戶可以執行操作的權限。
SpringSecurity的組件
核心模塊:包含核心的驗證和訪問控制類以及接口、遠程支持和基本的配置的API。
遠程調用:提供與Spring Remoting的集合。
Web網頁:包含網站安全的基礎代碼,包含Spring Security頁面驗證服務和基於URL的訪問控制。
配置:如果使用Spring Security XML命令空間進行配置,需要使用該模塊。
LDAP:LDAP驗證和配置代碼
ACL訪問控制表:用於在應用程序中對特定域對象實例應用安全性。
CAS:用於CAS的SSO服務器使用Spring Security網頁驗證
OpenID:使用外部的OpenID服務器驗證用戶
Test:支持Spring Security的測試
注:
Spring Remoting :Spring提供遠程調用的模塊;
LDAP:是輕量級的目錄訪問協議
CAS:中央認證服務
OpenID 是一個以用戶爲中心的數字身份識別框架
RBAC
RBAC 是基於角色的訪問控制(Role-Based Access Control )在 RBAC 中,權限與角色相關聯,用戶通過成爲適當角色的成員而得到這些角色的權限。這就極大地簡化了權限的管理。這樣管理都是層級相互依賴的,權限賦予給角色,而把角色又賦予用戶,這樣的權限設計很清楚,管理起來很方便。
權限數據庫設計:
總共由5張表組成,用戶表、角色表、資源表、用戶角色表和角色資源表。一個用戶可以擁有多個角色,一個角色擁有多個資源。
攔截器控制權限:(URL權限映射文件 .properties)
界面通過url進行請求,由攔截器進行攔截,根據用戶的信息,去數據庫中查詢此用戶是否具有本次請求了url權限,如果有就通過請求,讓他訪問資源,如果沒有就返回,提示用戶不具有該資源的反問權限.
Spring中設計的設計模式
單例模式:
使用場景:資源共享的情況
描述:單例模式自行實例化且實例化一次 構造函數必須是私有的
類別:懶漢單例模式和飢漢單例模式
懶漢單例模式:在調用資源時,如果沒有進行實例化的話,就進行一次實例化。爲了避免重複線程干擾要標記臨界區或者藉助鎖機制。
飢漢單例模式:在沒有調用時就已經自行實例化了。
注:對象屬性和get方法都要用static標記
public class SingleA
{
public static SingleA singleA=null;
private SingleA()
{
System.out.println("這是懶漢單例模式");
}
public static synchronized SingleA getSingleA() {
if(singleA==null)
{
singleA=new SingleA();
}
return singleA;
}
}
public class SingleB
{
public static SingleB singleB=new SingleB();
private SingleB()
{
System.out.println("這是飢漢單例模式");
}
public static SingleB getSingleB() {
return singleB;
}
}
//測試類
import org.junit.Test;
public class 單例模式 {
@Test
public void test()
{
SingleA.getSingleA();
SingleB.getSingleB();
}
}
觀察者模式
描述:定義了一種一對多的依賴關係讓多喝觀察者同時監聽某一個主體對象。這個主體對象當狀態發生改變時,會通知所有觀察者對象,使他們能夠自動更新自己。
一個觀察者,多個通知者。
應用場景:Serlvet基於此思想
控制反轉:把改變自己權限給別人。
public interface State {
void doAction(Soldier soldier);
}
public class StartState implements State {
@Override
public void doAction(Soldier soldier) {
// TODO Auto-generated method stub
System.out.println("士兵開始攻擊");
soldier.setState(this);
}
@Override
public String toString() {
return "士兵正在攻擊";
}
}
public class StopState implements State{
@Override
public void doAction(Soldier soldier) {
// TODO Auto-generated method stub
System.out.println("士兵停止攻擊");
soldier.setState(this);
}
@Override
public String toString() {
return "士兵已停止攻擊";
}
}
public class Soldier {
private State state;
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class Observer {
private List <Soldier>list=new ArrayList<>();
private State state;
//進入觀察
public void add(Soldier soldier)
{
list.add(soldier);
}
//離開觀察
public void remove(Soldier soldier)
{
list.remove(soldier);
}
//設置情報
public State getState() {
return state;
}
//獲取情報
public void setState(State state) {
this.state = state;
}
//通知獲取情報
public void inform()
{
for(Soldier s :list)
{
if(this.state!=null)
{
this.state.doAction(s);
}else
{
System.out.println("請先設置狀態");
}
}
}
}
public class testDemo {
public static void main(String[] args) {
Soldier a =new Soldier();
Soldier b=new Soldier();
Observer observer=new Observer();
//僱傭觀察者
observer.add(a);
observer.add(b);
//發出進攻指令
observer.setState(new StartState());
observer.inform();//進行通知
System.out.println(a.getState());
System.out.println(b.getState());
//發出進攻指令
observer.setState(new StopState());
observer.inform();//進行通知
System.out.println(a.getState());
System.out.println(b.getState());
}
}