spring入門

Struts1hibernate不能提高效率

多個session可以使用同一個事物

Struts1其實不能提高效率,自始自終都是單例,雖然保證了安全,但是沒有效率。

Spring的引入使代碼清晰,提高了效率

1.Spring可以自動生成session和事務

2.Hibernatestruts集成必須要有攔截器,而spring可以自動提供編碼過濾器和懶加載過濾器。

 

 

Spring是以一種業務層框架:

1.會自動生成業務對象

 

 

功能

1.IOC容器

  利用Spring來創建對象並完成關係組裝,比如能自動生成單例對象。

 

自動生成對象

完成對象之間的關聯

根據需求決定生成單例還是多例

 

2.AOP面向切面編程的技術,採用動態代理技術,比如增刪改查,代碼已經寫好了,但有新的需求,要加權限驗證和加日誌,按照傳統的方式,要修改源代碼,但這樣代價太大了,風險很大,如可能會引入新的錯誤。如果按照AOP,在不知道源碼的情況下,可以增加功能。

 比如過濾器Filter,和利用spring進行事務處理

 如今開發需求,也是用AOP的思想去考慮

  對原有的方法的基礎上,爲其增加新的功能,這種方式也叫做橫切性問題。

3.代替其他框架完成新的功能

 

比如替struts1生成多例的Action

hibernate生成全局性的事務,真正的做到了安全性和併發性的統一

替很多的框架生成很多自動的功能:比如懶加載和編碼過濾器。

springmvcspring家族的一部分,可以自動集成

作用:

1.生成session工廠:表示層struts1作爲表示層,因爲Action就是單例的。然而spring生成Action雖然表面上市單例的,但實質上是多例的。

2.對持久層:可以生成全局性的事務,session對每個事務共享,把安全級別降低到session上,假如有100session,而且併發,事務一提交,但只有一個session去臨時集合中生成緩存。

3.替很多的框架生成很多自動的功能:比如懶加載和編碼過濾器。

 

 

DAOORMAOPJEEWEBCORE

 

傳統裝配:

    1.通過set方法去裝配

2.通過構造函數的參數簽名去裝配(提供一個持久層接口的變量)

 

   這種方式,業務對象依賴於持久對象,一旦用戶需求改變,源代碼必須要修改。

   手工裝配量太大。

 

   

 

問題拋出?之前我們用工廠的方式隔離開業務層和持久層,降低了耦合性。而且我們裝配的時候,如果有多個對象需要裝配,這樣工作量太大了。假如我們用原生的工廠裝配,需要寫大量的代碼。

     這時候,我們便可以使用spring的依賴注入。。。

 

 

依賴注入:

     1.spring提供了工廠,我們只需從工廠中拿到相應的對象即可

     2.不用修改源碼,直接修改配置即可

 

<bean id=”mysqlDao” class=””>//id,相當於map中的key class相當於value

//工廠在讀配置文件的時候,會根據id,和value,把id放入在map中,把通過反射生成的對象放入到value中。

 

<bean id=”userManager” class=””>

   對構造方法注入

  <constructor-arg ref=”userDao4Mysql”>//給構造方法注入,

   使用屬性的setting方法進行注入

  <property name=”userDao” ref=”mysql4Dao”/>// property是一個屬性,有屬性名,ref是把一個bean注入到該bean

   //給該bean屬性注入,就是通過ref的值從map中拿到以該值對應的對象,並通過set方法給該屬性設值。調用的是Set方法,如果沒有該方法就會出錯

</bean>

 

 

創建bean工廠:

BeanFactory factory=new ClassPathXmlApplicationContext();

UserManager userManager=(UserManager)factory.getBean(“userManager”);//拿到的是一個接口的實現類

userManager.save();

 

好處:沒有創建對象的過程,都是工廠自動生成相應的對象,實現了依賴注入。

 

spring最大的優點:自動創建對象,並且完成對象之間關係的裝配

 

<customEditConfigurer class=””>

這是一個map,裏面放置的是轉換器,key對應的類型,value是轉換器對象。

1.首先創建的是,

2.

 

 

裝配:

  如果屬性的類型是整形,則在工廠中配置的是字符串類型

  <property name=”intValue” value=”123”/>

 

 

   就會從bean工廠中找到對象,拿到map,根據key找到屬性編輯器,最後進行轉化。

 

 

如果裝配的是list類型

 1.會創建一個ArrayList類型的對象

 2.會把list裏面的value數據通過add把對象的地址加入到list(基本類型轉化爲包裝類)

      <list>

          <value>list1</value>

          <value>list2</value>

      </list>

如果裝配的是set類型的數據

      <set>

          <ref bean=””></ref>

      </set>

 

如果裝配的是數組類型

<list>

   <value>array1</value>//會把list類型轉化爲String類型

</list>

 

如果裝配的是map類型

<map>

   <entry key=”k1” value=”v1”/>

   <entry key=”k2” value=”v2”/>

   <entry key=”k3” ref=”bean3”/>

</map>

 

 

 <!--定義屬性編輯器    -->     

就算不配屬性編輯器,工廠一創建,就會自動把屬性轉化器註冊進工廠中

<bean

      id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">

<property name="customEditors">

<map>

<entry key="java.util.Date" 或者 ref=utilDataFormat>

                    <!-- 將日期類型的轉化器註冊進map-->

<bean class="com.bjsxt.spring.UtilDatePropertyEditor">

<property name="format" value="yyyy:MM:dd"/>

</bean>

</entry>

</map>

</property>

</bean>

 

 <!-- 將日期類型的轉化器註冊進map-->

<bean

 id=utilDataFormat  class="com.bjsxt.spring.UtilDatePropertyEditor">

<property name="format" value="yyyy:MM:dd"/>

</bean>

 

 

   

 

/*

   繼承一個PropertyEditsupport,並覆寫setASText方法

*/

import java.beans.PropertyEditorSupport;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

 

/**

 * java.util.Date屬性編輯器

 * @author Administrator

 *

 */

public class UtilDatePropertyEditor extends PropertyEditorSupport {

/*

 *

 *

*/

 

private String format ;

@Override

public void setAsText(String text) throws IllegalArgumentException {//一定要覆寫setAsText方法,傳入的text一定是個字符串類型

System.out.println("UtilDatePropertyEditor.saveAsText() -- text=" + text);

SimpleDateFormat sdf = new SimpleDateFormat(format);

try {

Date d = sdf.parse(text);

this.setValue(d);

} catch (ParseException e) {

e.printStackTrace();

}

}

 

public void setFormat(String format) {

this.format = format;

}

 

}

 

 

 

<property name="dateValue">

  <value>2015:09:11</value>

 </property>

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章