1. 程式人生 > 其它 >新手,關於字典的keys()和value()方法要注意的一個小點

新手,關於字典的keys()和value()方法要注意的一個小點

技術標籤:springaop

學習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:銷燬方法
    • spring注入bean的四種方法
      • 通過註解注入的一般形式:@Bean
        • @Bean是一個方法級別上的註解,主要用在@Configuration註解的類裡,也可以用在@Component註解的類裡
      • 通過構造方法注入Bean:執行有參建構函式時自動裝配
      • 通過set方法注入Bean 顯式呼叫setter方法時自動裝配
      • 通過屬性去注入Bean 直接在屬性上自動裝配
  • 在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的作用域:使用scope屬性配置
      • singleton單例模式(多執行緒不安全)
      • prototype原型模式
      • request單次請求模式:<bean id="loginAction" class="com.cnblogs.Login" scope="request"/>
      • session會話模式
      • global Session全域性會話模式:在一個全域性的 Http Session 中,容器會返回該 Bean 的同一個例項,僅在使用 portlet context 時有效。
<!--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主要應用場景

    1. Authentication 許可權
    2. Caching 快取
    3. Context passing 內容傳遞
    4. Error handling 錯誤處理
    5. Lazy loading 懶載入
    6. Debugging 除錯
    7. logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準
    8. Performance optimization 效能優化
    9. Persistence 持久化
    10. Resource pooling 資源池
    11. Synchronization 同步
    12. 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代理機制
  • 通過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動態代理只能對實現了介面的類生成代理,而不能針對類。

框架——可以進行事務管理、安全、日誌、持久化框架整合

  • 事務管理 是對於一系列資料庫操作進行管理。 

    • 一個事務包含一個或多個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 類似的操作;
注意:在 A 方法內,呼叫 B 方法時,存在以下規則: 1. REQUIRED 當兩個方法的傳播機制都是 REQUIRED 時,如果一旦發生回滾,兩個方法都會回滾; 2. REQUIRES_NEW 當 A 方法傳播機制為 REQUIRES_NEW ,會開啟一個新的事務,並單獨提交方法,所以 B 方法的回滾並不影響 A 方法事務提交; 3. NESTED 當 A 方法為 REQUIRED,B 方法為 NESTED 時,A 方法開啟一個巢狀事務; 當 A 方法回滾時,B 方法也會回滾;反之,如果 B 方法回滾,則並不影響 A 方法的提交。
  • 事務隔離級別
    • 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