spring框架中常用到的8種設(shè)計模式清單如下:
設(shè)計模式 |
使用地方 |
備注 |
工廠模式 |
BeanFactory |
|
單例模式 |
Spring中的Bean |
|
代理模式 |
Spring AOP |
java反射實現(xiàn)動態(tài)代理 |
模板方法模式 |
Spring中以Template結(jié)尾的類 |
使用繼承的方式實現(xiàn) |
觀察者模式 |
Spring事件驅(qū)動模型 |
|
適配器模式 |
Spring AOP中的AdvisorAdapter |
|
裝飾器模式 |
Spring中含有Wrapper和含有Decorator的類 |
|
策略模式 |
資源訪問Resource接口 |
一、工廠模式
- Spring框架中BeanFactory和ApplicationContext類使用工廠模式創(chuàng)建Bean對象
1、BeanFactory
是一種懶漢模式,即使用到某個Bean時才會進行注入和ApplicationContext相比會占用更少的內(nèi)存,程序啟動速度更快
2、ApplicationContext
是一種惡漢模式,容器啟動時就創(chuàng)建所有的Bean和BeanFactory相比 ,BeanFactory僅提供了最基本的依賴注入支持 . ApplicationContext擴展了BeanFactory, 除了BeanFactory的功能外還包含其余更多的功能,通常使用ApplicationContext創(chuàng)建BeanApplicationContext的三個實現(xiàn)類: ClassPathXmlApplication: 將上下文文件作為類路徑資源
FileSystemXmlApplication: 從文件系統(tǒng)中的XML文件中載入上下文定義信息
XmlWebApplicationContext: 從Web系統(tǒng)中的XML文件中載入上下文定義信息
二、單例模式
Spring中的Bean的作用域默認就是單例Singleton的 . Spring中的Bean還可以定義以下作用域: prototype: 每次請求都會創(chuàng)建一個新的Bean實例
request: 每一次HTTP請求都會創(chuàng)建一個新的Bean實例,該Bean實例僅在當前HTTP request中有效 session: 每一次HTTP請求都會創(chuàng)建一個新的Bean實例,該Bean實例僅在當前HTTP session中有效
Spring實現(xiàn)單例Bean的方式:
xml的方式: <bean id="bean" class="com.oxford.Bean" scope="singleton"/>
????? 注解的方式: @Scope(value="singleton")
Spring底層通過ConcurrentHashMap實現(xiàn)單例注冊表來實現(xiàn)單例模式:
Java |
三、代理模式
面向切面編程AOP: Aspect-Oriented Programming 面向切面編程能夠?qū)⒑蜆I(yè)務無關(guān),但是是業(yè)務模塊中所共同調(diào)用的邏輯或者業(yè)務功能封裝起來, 比如事務管理,日志管理,權(quán)限控制等 有利于減少重復代碼,降低模塊之間的耦合度,并有利于面向未來的可拓展性和可維護性 使用AOP可以將一些通用功能抽象出來,在需要使用的地方直接使用,這樣可以大大簡化代碼量 需要增加新功能也會更加簡單方便,這樣可以提高系統(tǒng)的擴展性
Spring AOP基于動態(tài)代理實現(xiàn)的: 代理對象實現(xiàn)了接口: Spring AOP會使用Java動態(tài)代理JDK Proxy創(chuàng)建代理對象 完成對象的代理操作 代理對象沒有實現(xiàn)接口: Spring AOP會使用Cglib Proxy生成一個被代理對象的子類作為代理類完成對象的代理操作
Spring AOP集成了AspectJ,AspectJ是Java中最為完整的AOP框架
AspectJ和Spring AOP比較
AspectJ
AspectJ是編譯時增強
AspectJ基于字節(jié)碼操作Bytecode Manipluation實現(xiàn)
AspectJ在切面較多的情況下要比Spring AOP的性能強很多
Spring AOP
Spring AOP是運行時增強
Spring AOP基于代理Proxy實現(xiàn)
Spring AOP中集成了AspectJ
Spring AOP比較簡單,在切面比較少的情況下和AspectJ的性能相似
四、模板模式
- 模板方法模式: 是一種行為型模式,基于繼承的代碼復用 定義一個操作的算法骨架,將一些實現(xiàn)步驟延遲到子類中 模板方法使得子類可以不改變一個算法結(jié)構(gòu)的情況下即可重新定義算法的某些特定步驟的實現(xiàn)方式
- Spring中以Template結(jié)尾的類,比如jdbcTemplate等,都是使用了模板方法模式 通常情況下,都是使用繼承來實現(xiàn)模板模式 在Spring中,使用了Callback與模板方法相結(jié)合的方式,既達到了代碼復用的效果,又增加了系統(tǒng)的靈活性
五、觀察者模式
觀察者模式: 是一種對象行為模式 表示的是一種對象和對象之間具有依賴關(guān)系,當一個對象發(fā)生改變,依賴于這個對象的對象也會發(fā)生改變
Spring事件驅(qū)動模型就是基于觀察者模式實現(xiàn)的 Spring事件驅(qū)動模型可以在很多應用場景中解耦代碼 比如每次添加商品時都需要更新商品索引,這時就可以使用觀察者模式
Spring事件驅(qū)動模型
- Spring事件驅(qū)動模型包含三種角色: 事件Event角色 事件監(jiān)聽者Listener角色 事件發(fā)布者Publisher角色
Spring事件流程
1、定義一個事件: 實現(xiàn)一個繼承自ApplicationEvent的事件類,并寫出相應的構(gòu)造函數(shù)
2、定義一個事件監(jiān)聽者: 實現(xiàn)ApplicationListener接口 重寫onApplicationEvent() 方法
3、使用事件發(fā)布者發(fā)布消息: 使用ApplicationEventPublisher的publishEvent() 方法 重寫publishEvent() 方法發(fā)布消息
事件角色Event
ApplicationEvent: org.springframework.context 事件角色抽象類 繼承java.util.Event并實現(xiàn)了java.io.Serializable接口
Spring中默認存在以下事件,都是繼承自ApplicationContext事件角色抽象類: ContextStartedEvent: ApplicationContext啟動后觸發(fā)的事件 ContextStoppedEvent: ApplicationContext停止后觸發(fā)的事件 ContextRefreshedEvent: ApplicationContext初始化或者刷新后觸發(fā)的事件 ContextClosedEvent: ApplicationContext關(guān)閉后觸發(fā)的事件
事件監(jiān)聽者角色Listener
ApplicationListener: 事件監(jiān)聽者角色 ApplicationListener接口中定義了一個onApplicationEvent() 方法來處理ApplicationEvent. 只要實現(xiàn)onApplicationEvent() 方法即可完成監(jiān)聽事件
事件發(fā)布者角色Publisher
ApplicationEventPublisher: 事件發(fā)布者角色 ApplicationEventPublisher接口中定義了publishEvent() 方法來發(fā)布事件,這個方法在AbstractApplicationContext中實現(xiàn) 在AbstractApplicationContext中,事件是通過ApplicationEventMulticaster廣播的
六、適配器模式
- 適配器模式: 是結(jié)構(gòu)型模式,也是各種結(jié)構(gòu)型模式的起源 將一個接口轉(zhuǎn)換為調(diào)用方需要的接口 適配器使得接口不兼容的類之間可以一起工作.適配器又被稱為包裝器Wrapper
Spring AOP中的適配器模式文章來源:http://www.zghlxwxcb.cn/news/detail-401856.html
- Spring AOP中的增強和通知Advice使用了適配器模式,接口是AdvisorAdapter
- 常用的Advice類型包括: BeforeAdvice: 前置通知. 目標方法調(diào)用前增強 AfterAdvice: 后置通知. 目標方法調(diào)用后增強 AfterReturningAdvice: 目標方法執(zhí)行結(jié)束之后 ,return之前
- 每個通知Advice都有對應的攔截器: BeforeAdvice - MethodBeforeAdviceInterceptor AfterAdvice - MethodAfterAdviceInterceptor AfterReturningAdvice - MethodAfterReturningAdviceInterceptor
- Spring中預定義的通知要通過對應的適配器,適配成為MethodInterceptor接口類型的對象
Spring MVC中的適配器模式文章來源地址http://www.zghlxwxcb.cn/news/detail-401856.html
- Spring MVC中 ,DispatchServlet根據(jù)請求信息調(diào)用HanlderMapping, 解析請求對應的Handler, 解析到對應的Handler后,開始由HandlerAdapter適配器進行處理
- HandlerAdapter作為期望接口,具體的適配器實現(xiàn)類對具體目標類進行適配 .controller作為需要適配的類
- 通過使用適配器AdapterHandler可以對Spring MVC中眾多類型的Controller通過不同的方法對請求進行處理
七、裝飾器模式
- 裝飾器模式: 動態(tài)地給對象添加一些額外的屬性或者行為 和繼承相比,裝飾器模式更加靈活
- 裝飾器模式使用場景: 當需要修改原有的功能,但是不想直接修改原有的代碼,就可以設(shè)計一個裝飾器Decorator類在原有的代碼的外面,這樣可以在不修改原有的類的基礎(chǔ)上擴展新的功能
- Spring中配置DataSource時 ,DataSource可以是不同的數(shù)據(jù)庫和數(shù)據(jù)源.為了在少修改原有類的代碼下動態(tài)切換不同的數(shù)據(jù)源,這時就用到了裝飾器模式
- Spring中含有Wrapper和含有Decorator的類都用到了裝時期模式,都是動態(tài)地給一個對象添加一些額外的屬性或者功能
八、策略模式
- 在策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運行時更改。這種類型的設(shè)計模式屬于行為型模式。
- 在策略模式中,我們創(chuàng)建表示各種策略的對象和一個行為隨著策略對象改變而改變的 context 對象。策略對象改變 context 對象的執(zhí)行算法
- Spring框架的資源訪問Resource接口。該接口提供了更強的資源訪問能力,Spring 框架本身大量使用了 Resource 接口來訪問底層資源。
到了這里,關(guān)于設(shè)計模式_spring框架中常用的8種設(shè)計模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!