新手,關於字典的keys()和value()方法要注意的一個小點
阿新 • • 發佈:2021-01-21
學習spring筆記,自用
什麼是Spring
Spring框架是一個開放原始碼的J2EE應用程式框架,由Rod Johnson發起,是針對bean的生命週期進行管理的輕量級容器(lightweight container)。 Spring解決了開發者在J2EE開發中遇到的許多常見的問題,提供了功能強大IOC、AOP及Web MVC等功能。Spring可以單獨應用於構築應用程式,也可以和Struts、Webwork、Tapestry等眾多Web框架組合使用,並且可以與 Swing等桌面應用程式AP組合。因此, Spring不僅僅能應用於JEE應用程式之中,也可以應用於桌面應用程式以及小應用程式之中。 Spring框架主要由七部分組成,分別是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。 Spring是全面的和模組化的。Spring有分層的體系結構,這意味著你能選擇使用它孤立的任何部分,它的架構仍然是內在穩定的。 它的設計從底部幫助你編寫易於測試的程式碼。Spring是用於測試驅動工程的理想的framework。IOC控制反轉——由容器控制程式之間的(依賴)關係
-
在Spring當中定義和配置JavaBean:註解方式
-
註解:使用前需要在xml檔案中配置自動掃描—— <context:component-scan base-package="com.mgy"></context:component-scan>
-
@AutoWired自動裝配,預設按照型別匹配
- 如果容器中沒有一個和標註變數型別匹配的Bean,Spring容器啟動時將報NoSuchBeanDefinitionException的異常。如果希望Spring即使找不到匹配的Bean完成注入也不用丟擲異常,那麼可以使用@Autowired(required=false)進行標註
- 如果容器中有一個以上匹配的Bean時,則可以通過@Qualifier註解限定Bean的名稱
-
@Componet(預設單例模式)元件
- @Controller標註在Controller層
- @Service標註在Service層
- @Pepository標註在Dao層
- @ComponentScan 掃描元件
- @Resource :功能等同於 @Autowired + @Qualifier,等同配置檔案標籤<property name=""ref="" >;只能注入方法和屬性,不支援注入構造方法
- @Configuration作為配置注入Spring
- @PostConstruct:初始化方法
- @PreDestroy:銷燬方法
-
@AutoWired自動裝配,預設按照型別匹配
-
spring注入bean的四種方法
-
通過註解注入的一般形式:@Bean
- @Bean是一個方法級別上的註解,主要用在@Configuration註解的類裡,也可以用在@Component註解的類裡
- 通過構造方法注入Bean:執行有參建構函式時自動裝配
- 通過set方法注入Bean 顯式呼叫setter方法時自動裝配
- 通過屬性去注入Bean 直接在屬性上自動裝配
-
通過註解注入的一般形式:@Bean
-
註解:使用前需要在xml檔案中配置自動掃描—— <context:component-scan base-package="com.mgy"></context:component-scan>
-
在Spring當中定義和配置JavaBean:xml配置方式
-
bean的宣告週期有四個階段
-
例項化:通過構造器或工廠方法建立 Bean 例項
- id:容器中查詢Bean的id(唯一且不能以/開頭)
- class:bean的完整類名
- name:在容器中查詢bean的名字(唯一、允許以/開頭,允許多個值且以逗號或空格隔開)
- scope:作用域 singleton、prototype 等
- abstract:將bean定義成抽象bean,不能例項化
- parent:父bean,必須存在繼承關係
- init-method:指定bean物件的初始化方法
-
屬性賦值:
- 簡單屬性賦值:<property name="name"> <value>zs</value> </property>
- 構造器賦值:<constructor-arg index="0"><value>zzz</value></constructor-arg>
- 值為javabean:<bean id="ss" class="p1.Student"><property name="helloworld"><ref bean="helloworlds"></property>
- 值為list或陣列:<property name="arr/list"><list><value>aa</value><value>bb</value><value>cc</value><value>dd</value></list></property>
- 值為map:<property name="map"><map><entry><key><value>zs</value></key><value>張三</value></entry><entry><key><value>ls</value></key><value>李四</value></entry></map></property>
- 值為properties:<property name="properties"><props><prop key="a2">222</prop></props></property>
- 初始化:init-method引數配置初始化方法
- 銷燬:destroy-method引數配置銷燬方法
-
例項化:通過構造器或工廠方法建立 Bean 例項
-
bean的作用域:使用scope屬性配置
- singleton單例模式(多執行緒不安全)
- prototype原型模式
- request單次請求模式:<bean id="loginAction" class="com.cnblogs.Login" scope="request"/>
- session會話模式
- global Session全域性會話模式:在一個全域性的 Http Session 中,容器會返回該 Bean 的同一個例項,僅在使用 portlet context 時有效。
-
bean的宣告週期有四個階段
<!--xml方式配置bean-->
<!--屬性注入-->
<bean class="com.baobaotao.anno.LogonService">
<property name="logDao" ref="logDao"></property>
<property name="userDao" ref="userDao"></property>
<!--構造方法注入-->
<bean class="com.baobaotao.anno.LogonService">
<constructor-argref="logDao"></constructor-arg>
<constructor-arg ref="userDao"></constructor-arg>
</bean>
<!--靜態工廠方法注入-->
<bean id="car6" class="com.baobaotao.ditype.CarFactory"
factory-method="createCar"></bean>
AOP面向切面——分離應用的業務邏輯與系統級服務
-
AOP主要應用場景
- Authentication 許可權
- Caching 快取
- Context passing 內容傳遞
- Error handling 錯誤處理
- Lazy loading 懶載入
- Debugging 除錯
- logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準
- Performance optimization 效能優化
- Persistence 持久化
- Resource pooling 資源池
- Synchronization 同步
- Transactions 事務
-
AOP 領域中的特性術語:
- 通知(Advice): AOP 框架中的增強處理。通知描述了切面何時執行以及如何執行增強處理。
- 連線點(join point): 連線點表示應用執行過程中能夠插入切面的一個點,這個點可以是方法的呼叫、異常的丟擲。在 Spring AOP 中,連線點總是方法的呼叫。
- 切點(PointCut): 可以插入增強處理的連線點。
- 切面(Aspect): 切面是通知和切點的結合。
- 引入(Introduction):引入允許我們向現有的類新增新的方法或者屬性。
- 織入(Weaving): 將增強處理新增到目標物件中,並建立一個被增強的物件,這個過程就是織入。
-
Spring AOP實現
-
註解實現
-
通過註解宣告切點指示器
- arg():限制連線點匹配引數為執行味蕾的執行方法
- @arg():限制連線點匹配引數由指定註解標註的執行方法
- *execution():用於匹配是連線點的執行方法
- this():限制連線點匹配AOP代理的Bean應用為指定型別的類
- target():限制連結點匹配目標物件為指定型別的類
- @target():限制連線點匹配特點的執行物件,這些物件相應的類要具備執行型別的註釋
- within():限制連線點匹配指定的型別
- @within():限制連線點匹配指定註解所標註的型別(當使用Spring AOP時, )
- @annotation:限制匹配帶有指定註解連線點
- bean():指定使用切面的bean
-
通過註解宣告5種通知型別
- @Before通知方法會在目標方法呼叫之前執行
- @After通知方法會在目標方法返回或異常後呼叫
- @AfterReturning通知方法會在目標方法返回後呼叫
- @AfterThrowing通知方法會在目標方法丟擲異常後呼叫
- @Around通知方法會將目標方法封裝起來
- 通過註解宣告切點表示式: @Pointcut 宣告切點表示式
-
通過註解宣告切點指示器
-
註解實現
@Pointcut("execution(* com.sharpcj.aopdemo.test1.IBuy.buy(..))")
public void point(){}
-
- 通過註解處理通知中的引數:args(引數)
@Pointcut("execution(String com.sharpcj.aopdemo.test1.IBuy.buy(double)) && args(price) && bean(girl)")
public void gif(double price) {}
-
通過註解配置織入的方式
- @EnableAspectJAutoProxy( proxyTargetClass=true):掃描並解析aop註解的入口。
-
proxyTargetClass引數值預設為false;
-
true
- 目標物件實現了介面——使用CGLIB代理機制
- 目標物件沒有介面(只有實現類)——使用CGLIB代理機制
-
false
- 目標物件實現了介面——使用JDK動態代理機制(代理所有實現了的介面)
- 目標物件沒有介面(只有實現類)——使用CGLIB代理機制
-
true
-
通過XML配置檔案宣告切面
-
AOP常用元素
- <aop:advisor>:定義AOP通知器
- <aop:after>:定義一個後置通知(不管目標方法是否執行成功)
- <aop:afterreturning>:定義AOP返回通知
- <aop:afterthrowing>:定義AOP異常通知
- <aop:around>:定義環繞通知
- <aop:aspect>:定義一個切面
- <aop:aspectj-autoproxy>:啟動@AspectJ註解驅動的切面
- <aop:before>:定義一個AOP前置通知
- <aop:config>:頂層AOP配置元素
- <aop:decare-parents>:以透明方式為被通知的物件引入額外的介面
- <aop:pointcut>:定義一個切點
- <aop:aspectj-autoproxy> :自動代理AspectJ註解的通知類
- XML配置檔案中切點指示器:與註解類似,&&需要換成and,其他同理
- XML檔案配置宣告切點: <aop:pointcut id="apoint" expression="execution(* com.sharpcj.aopdemo.test2.IBuy.buy(..))"/>
- XML檔案配置為通知傳遞引數:與註解一致
-
XML檔案配置織入的方式
-
CGlib代理:<aop:config proxy-target-class="true"> </aop:config>
- 利用ASM開源包,對代理物件類的class檔案載入進來,通過修改其位元組碼生成類來處理。
- 如果目標實現了介面,可以強制使用CGLIB實現AOP
- 如果目標物件沒有實現了介面,必須採用CGLIB庫,spring會自動在JDK動態代理和CGLIB之間轉換。
-
如何強制使用CGLIB實現AOP
- 新增CGLIB庫:aspectjrt-xxx.jar、aspectjweaver-xxx.jar、cglib-nodep-xxx.jar
- 在spring配置檔案中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
- CGLIB是針對類實現代理的,主要是對指定的類生成一個子類,覆蓋其中的方法,並覆蓋其中方法實現增強,但是因為採用的是繼承,所以該類或方法最好不要宣告成final,因為final類或方法,是無法繼承的。
-
JDK代理方式:<aop:config proxy-target-class="false"> </aop:config>
- 利用攔截器(攔截器必須實現InvocationHandler)加上發射機制生成一個實現代理介面的匿名類;在呼叫具體方法前呼叫InvokeHander來處理
- 如果目標實現了介面,預設情況下會採用JDK的動態代理來實現AOP
- JDK動態代理只能對實現了介面的類生成代理,而不能針對類。
-
CGlib代理:<aop:config proxy-target-class="true"> </aop:config>
-
AOP常用元素
框架——可以進行事務管理、安全、日誌、持久化框架整合
-
事務管理 是對於一系列資料庫操作進行管理。
- 一個事務包含一個或多個SQL語句,是邏輯管理的工作單元(原子單元)。
- 一個事務開始於第一次執行的SQL語句,結束於Commit或Rollback或DDL(datadefinitionlanguage ,資料定義語言)語句
- 事務處理(TRANSACTION)是由一個或多個SQL語句序列結合在一起所形成的一個邏輯處理單元。
-
在Spring專案中,我們可以通過四種方式來實現事務管理
- 程式設計式事務管理
- 基於 TransactionProxyFactoryBean的宣告式事務管理 : <tx:annotation-driven transaction-manager="transactionManager"/>
- 基於 @Transactional 的宣告式事務管理 : @Transactional(transactionManager = "transactionManager", rollbackFor = Exception.class)
- 基於Aspectj AOP配置事務
<!-- 事務管理器 -->
<bean id="tracnsactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="myTracnsactionManager">
<tx:attributes>
<!-- 為連線點指定事務屬性 -->
<tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED"/>
<tx:method name="stockChange" isolation="DEFAULT" propagation="REQUIRED" rollback-for="StockException"/>
</tx:attributes> </tx:advice> <aop:config>
<!-- 切入點配置 -->
<aop:pointcut expression="execution(* *..service.*.*(..))" id="point"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="point"/>
</aop:config>
-
事務傳播機制
- REQUIRED:如果有事務則加入事務,如果沒有事務,則建立一個新的(預設值);
- NOT_SUPPORTED:Spring 不為當前方法開啟事務,相當於沒有事務;
- REQUIRES_NEW:不管是否存在事務,都建立一個新的事務,原來的方法掛起,新的方法執行完畢後,繼續執行老的事務;
- MANDATORY:必須在一個已有的事務中執行,否則報錯;
- NEVER:必須在一個沒有的事務中執行,否則報錯;
- SUPPORTS:如果其他 bean 呼叫這個方法時,其他 bean 聲明瞭事務,則就用這個事務,如果沒有宣告事務,那就不用事務; SUPPORTS型別的事務傳播機制,是否使用事務取決於呼叫方法是否有事務,如果有則直接用,如果沒有則不使用事務。
- NESTED:如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與 REQUIRED 類似的操作;
-
事務隔離級別
- ISOLATION_DEFAULT:使用後端資料庫預設的隔離界別,MySQL預設採用的REPEATABLE_READ 隔離級別,Oracle 預設採用的 READ_COMMITTED 隔離級別;
- ISOLATION_READ_UNCOMMITTED:最低的隔離級別,允許讀取,允許讀取尚未提交的的資料變更,可能會導致髒讀、幻讀或不可重複讀;
- ISOLATION_READ_COMMITTED:允許讀取併發事務已經提交的資料,可以阻止髒讀,但是幻讀或不可重複讀仍有可能發生;
- ISOLATION_REPEATABLE_READ:對同一欄位的多次讀取結果都是一致的,除非資料是被本身事務自己所修改,可以阻止髒讀和不可重複讀,但幻讀仍有可能發生;
- ISOLATION_SERIALIZABLE:最高的隔離級別,完全服從 ACID 的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就說,該級別可以阻止髒讀、不可重複讀以及幻讀。但是這將嚴重影響程式的效能。通常情況下也不會用到該級別。
-
持久化框架整合
- Hibernate框架整合
- Mybatis框架整合
-
安全
-
日誌
容器——Ioc容器負責容納此前所描述的bean,並對bean進行管理。
- IOC 容器主要由 BeanFactory 和 ApplicationContext 組成。BeanFactory 是 Spring 框架的基礎設施,面向 Spring 本身;ApplicationContext 面向使用 Spring 框架的開發者,幾乎所有的應用場合我們都直接使用 ApplicationContext 而非底層的 BeanFactory。
-
BeanFactory 是 Spring 框架的基礎設施,面向 Spring 本身,BeanFactory 主要有以下元件:
- BeanDefinitionRegistry:登錄檔,提供了向容器手工註冊 BeanDefinition 物件的方法。Spring 配置檔案中每一個節點元素在 Spring 容器裡都通過一個 BeanDefinition 物件表示,它描述了 Bean 的配置資訊;
- BeanFactory:頂層介面。它最主要的方法就是 getBean(String beanName),該方法從容器中返回特定名稱的 Bean;
- ListableBeanFactory:該介面定義了訪問容器中 Bean 基本資訊的若干方法,如檢視 Bean 的個數、獲取某一型別 Bean 的配置名、檢視容器中是否包括某一 Bean 等方法;
- HierarchicalBeanFactory:父子級聯 IOC 容器的介面,子容器可以通過介面方法訪問父容器; 通過HierarchicalBeanFactory 介面, Spring 的 IOC 容器可以建立父子層級關聯的容器體系,子容器可以訪問父容器中的 Bean,但父容器不能訪問子容器的 Bean。Spring 使用父子容器實現了很多功能,比如在 Spring MVC 中,展現層 Bean 位於一個子容器中,而業務層和持久層的 Bean 位於父容器中。這樣,展現層 Bean 就可以引用業務層和持久層的 Bean,而業務層和持久層的 Bean 則看不到展現層的 Bean;
- ConfigurableBeanFactory:定義了設定類裝載器、屬性編輯器、容器初始化後置處理器等方法,增強了 IOC 容器的可定製性;
- AutowireCapableBeanFactory:定義了將容器中的 Bean 按某種規則(如按名字匹配、按型別匹配等)進行自動裝配的方法;
- SingletonBeanRegistry:定義了允許在執行期間向容器註冊單例項 Bean 的方法;對於單例項( singleton)的 Bean 來說,BeanFactory 會快取 Bean 例項,所以第二次使用 getBean() 獲取 Bean 時將直接從IOC 容器的快取中獲取 Bean 例項。Spring 在 DefaultSingletonBeanRegistry 類中提供了一個用於快取單例項 Bean 的快取器,它是一個用 HashMap 實現的快取器,單例項的 Bean 以 beanName 為鍵儲存在這個 HashMap 中。
- 依賴日誌框架:在初始化 BeanFactory 時,必須為其提供一種日誌框架,比如使用 Log4J, 即在類路徑下提供 Log4J 配置檔案,這樣啟動 Spring 容器才不會報錯。
-
*ApplicationContext 面向開發應用
- ApplicationContext 由 BeanFactory 派 生 而 來 , 提 供 了 更 多 面 向 實 際 應 用 的 功 能 。ApplicationContext 繼承了 HierarchicalBeanFactory 和 ListableBeanFactory 介面,在此基礎上,還通過多個其他的介面擴充套件了 BeanFactory 的功能:
- ClassPathXmlApplicationContext:預設從類路徑載入配置檔案
- FileSystemXmlApplicationContext:預設從檔案系統中裝載配置檔案;
- ApplicationEventPublisher:讓容器擁有釋出應用上下文事件的功能,包括容器啟動事件、關閉事件等
- MessageSource:為應用提供 i18n 國際化訊息訪問的功能;
- ResourcePatternResolver: 所有 ApplicationContext 實現類都實現了類似於 PathMatchingResourcePatternResolver 的功能,可以通過帶字首的 Ant 風格的資原始檔路徑裝載 Spring 的配置檔案;
- LifeCycle:該介面是 Spring 2.0 加入的,該介面提供了 start()和 stop()兩個方法,主要用於控制非同步處理過程。在具體使用時,該介面同時被 ApplicationContext 實現及具體Bean 實現, ApplicationContext 會將 start/stop 的資訊傳遞給容器中所有實現了該介面的 Bean,以達到管理和控制 JMX、任務排程等目的;
- ConfigurableApplicationContext:擴充套件於 ApplicationContext,它新增加了兩個主要的方法: refresh()和 close(),讓 ApplicationContext 具有啟動、重新整理和關閉應用上下文的能力。在應用上下文關閉的情況下呼叫 refresh()即可啟動應用上下文,在已經啟動的狀態下,呼叫 refresh()則清除快取並重新裝載配置資訊,而呼叫 close()則可關閉應用上下文。
-
WebApplicationContext
- WebApplicationContext 是專門為 Web 應用準備的,它允許從相對於 Web 根目錄的路徑中裝載配置檔案完成初始化工作。從 WebApplicationContext 中可以獲得ServletContext 的引用,整個 Web 應用上下文物件將作為屬性放置到 ServletContext 中,以便 Web 應用環境可以訪問 Spring 應用上下文。
MVC——Spring MVC
參考文件: https://baike.baidu.com/item/spring/85061?fr=aladdin https://blog.csdn.net/weixin_33933118/article/details/91472377 https://www.cnblogs.com/joy99/p/10941543.html https://blog.csdn.net/andy_zhang2007/article/details/83960798 https://www.jianshu.com/p/46d092bb737d https://www.cnblogs.com/wpcnblog/p/7991599.html https://blog.csdn.net/qq_35972907/article/details/97765979 https://www.cnblogs.com/weechang/p/12608964.html https://www.cnblogs.com/weechang/p/12578180.html https://www.cnblogs.com/weechang/p/12570922.html https://blog.csdn.net/qq_42914528/article/details/83684321