Spring的四大優點,你是如何理解的?

一、方便解耦,簡化開發

Spring是分層的 Java SE/EE 應用 full-stack輕量級開源框架,以IoC(Inverse Of Control:反轉控制)和 AOP(Aspect Oriented Programming:面向切面編程)爲內核,提供了展示層SpringMVC和持久層 Spring JDBC 以及業務層事務管理等衆多的企業級應用技術,還能整合開源世界衆多著名的第三方框架和類庫,逐漸成爲使用最多的Java EE企業應用開源框架。html

用戶也沒必要再爲單例模式類、屬性文件解析等這些很底層的需求編寫代碼,能夠更專一於上層的應用。spring

經過Spring提供的 IoC 容器,能夠將對象間的依賴關係交由 Spring 進行控制,避免硬編碼所形成的過分程序耦合。sql

spring方便解耦的實現代碼:數據庫

ContextStartedEvent:ApplicationContext啓動後觸發的事件ContextStoppedEvent:ApplicationContext中止後觸發的事件ContextRefreshedEvent:ApplicationContext初始化或刷新完成後觸發的事件ContextClosedEvent:ApplicationContext關閉後觸發的事件

·  在tomcat中ContextRefreshedEvent 可能會觸發兩次,SpringBoot中只觸發一次

二、AOP編程的支持

AOP便是面向切面編程,是對OOP面向對象編程的補充和完善。express

實現AOP的技術,主要分爲兩大類:一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引用特色的語法建立「方面」,從而使能夠在編譯期間織入有關「方面」的代碼。編程

AOP的使用場景:權限,緩存,日誌記錄,事務,性能優化,異常處理。緩存

經過Spring的 AOP 功能,方便進行面向切面的編程,許多不容易用傳統 OOP 實現的功能能夠經過AOP 輕鬆應付。tomcat

spring AOP編程支持的實現代碼:性能優化

開發步驟:        

               (1):先引入aop相關的jar文件           

                    spring-aop-3.2.5.RELEASE.jar【去spring3.2源碼裏面找】            aopalliance.jar【去spring2.5源碼/lib/aopalliance文件裏面找】            aspectjweaver.jar【去spring2.5源碼/lib/aspectj文件裏面找】或者【aspectj-1.8.2/lib/aspectjweaver.jar】            aspectjrt.jar【去spring2.5源碼/lib/aspectj文件裏面找】或者【aspectj-1.8.2/lib/aspectjrt.jar】  

                     《注意:用到的spring2.5版本的jar本艦,若是用jd1.7版本可能會出現問題,              

                     須要升級如下aspectj組件,即便用aspectj-1.8.2版本中提供的jar文件aspectjweaver.jar和aspectjrt.jar》    

                  (2)bean.xml中引入aop名稱空間 

           技巧:找到文件

spring-framework-3.2.5.RELEASE/docs/spring-framework-reference/htmlsingle         

                  打開index.html搜索xmlns:aop而後找到下面紅色三句話,分別拷貝到bean.xml中         

                 <?xml version="1.0" encoding="UTF-8"?>                                               <beans xmlns="http://www.springframework.org/schema/beans" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                                                                                          xmlns:aop="http://www.springframework.org/schema/aop"          

xsi:schemaLocation="http://www.springframework.org/schema/beans         

      http://www.springframework.org/schema/beans/spring-beans.xsd     

http://www.springframework.org/schema/aop 

http://www.springframework.org/schema/aop/spring-aop.xsd">

 

三、聲明式事務的支持

能夠將咱們從單調煩悶的事務管理代碼中解脫出來,經過聲明式方式靈活的進行事務的管理,提升開發效率和質量。app

聲明式事務管理創建在AOP之上的。其本質是對方法先後進行攔截,而後在目標方法開始以前建立或者加入一個事務,在執行完目標方法以後根據執行狀況提交或者回滾事務。

聲明式:使用TransactionProxyFactoryBean:

圍繞Poxy的動態代理可以自動的提交和回滾事務

org.springframework.transaction.interceptor.TransactionProxyFactoryBean

PROPAGATION_REQUIRED–支持當前事務,若是當前沒有事務,就新建一個事務。這是最多見的選擇。

PROPAGATION_SUPPORTS–支持當前事務,若是當前沒有事務,就以非事務方式執行。

spring聲明式事務的支持的實現代碼:

<!-- 

<tx:advice>定義事務通知,用於指定事務屬性,其中「transaction-manager」屬性指定事務管理器,並經過<tx:attributes>指定具體須要攔截的方法    

     <tx:method>攔截方法,其中參數有:    

     name:方法名稱,將匹配的方法注入事務管理,可用通配符   

    propagation:事務傳播行爲,   

    isolation:事務隔離級別定義;默認爲「DEFAULT」  

    timeout:事務超時時間設置,單位爲秒,默認-1,表示事務超時將依賴於底層事務系統;

    read-only:事務只讀設置,默認爲false,表示不是隻讀;

    rollback-for:須要觸發回滾的異常定義,可定義多個,以「,」分割,默認任何RuntimeException都將致使事務回滾,而任何Checked Exception將不致使事務回滾;

    no-rollback-for:不被觸發進行回滾的 Exception(s);可定義多個,以「,」分割; -->

<tx:advice id="advice" transaction-manager="transactionManager">   

   <tx:attributes> 

       <!-- 攔截save開頭的方法,事務傳播行爲爲:REQUIRED:必需要有事務, 若是沒有就在上下文建立一個 --> 

       <tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED" timeout="" read-only="false" no-rollback-for="" rollback-for=""/>

        <!-- 支持,若是有就有,沒有就沒有 -->        <tx:method name="*" propagation="SUPPORTS"/>

    </tx:attributes></tx:advice>

<!-- 定義切入點,expression爲切人點表達式,以下是指定impl包下的全部方法,具體以自身實際要求自定義  -->

<aop:config>

    <aop:pointcut expression="execution(* com.kaizhi.*.service.impl.*.*(..))" id="pointcut"/> 

   <!--<aop:advisor>定義切入點,與通知,把tx與aop的配置關聯,纔是完整的聲明事務配置 -->

    <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/></aop:config>

 

 

四、方便程序的測試

能夠用非容器依賴的編程方式進行幾乎全部的測試工做,測試再也不是昂貴的操做,而是隨手可作的事情。

編程式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於編程式事務管理,spring推薦使用TransactionTemplate。

編程式,比較靈活,可是代碼量大,存在重複的代碼比較多;聲明式的比編程式的更靈活。

編程式主要使用transactionTemplate。省略了部分的提交,回滾,一系列的事務對象定義,需注入事務管理對象

spring方便程序測試的實現代碼:

1)基類,其實就是用來加載配置文件的@RunWith(SpringJUnit4ClassRunner.class)  //使用junit4進行測試  @ContextConfiguration({"/spring/app*.xml","/spring/service/app*.xml"}) 

//加載配置文件 

 //------------若是加入如下代碼,全部繼承該類的測試類都會遵循該配置,也能夠不加,在測試類的方法上

//控制事務,參見下一個實例  

//這個很是關鍵,若是不加入這個註解配置,事務控制就會徹底失效!

//@Transactional 

 //這裏的事務關聯到配置文件中的事務控制器(transactionManager = "transactionManager"),同時

//指定自動回滾(defaultRollback = true)。這樣作操做的數據纔不會污染數據庫!//@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)  

//------------  

public class BaseJunit4Test {

  }  

2)接着是咱們本身的測試類public class UserAssignServiceTest extends BaseJunit4Test{

         @Resource  //自動注入,默認按名稱 

          private IBaseDao baseDao;      

  @Test   //標明是測試方法   

   @Transactional   //標明此方法需使用事務  

    @Rollback(false)  //標明使用完此方法後事務不回滾,true時爲回滾    

   public void insert( ) {                                                                                                                  String sql="insert into user(name,password) values(?,?)";     

              Object[] objs=new Object[{"00","000"};                                                                        baseDao.insert( sql , objs );              

             String sql1="select * from user where name=? and password=? ";         

            List<Map<String,Object>> list=baseDao.queryForList( sql1 , objs );       

            System.out.println(list);        

            assertTrue(list.size( )>0);      

      } 

 } 

                                                               -END-

相關文章
相關標籤/搜索