Struts1和hibernate不能提高效率
多個session可以使用同一個事物
Struts1其實不能提高效率,自始自終都是單例,雖然保證了安全,但是沒有效率。
Spring的引入使代碼清晰,提高了效率
1.Spring可以自動生成session和事務
2.Hibernate和struts集成必須要有攔截器,而spring可以自動提供編碼過濾器和懶加載過濾器。
Spring是以一種業務層框架:
1.會自動生成業務對象
功能
1.IOC容器
利用Spring來創建對象並完成關係組裝,比如能自動生成單例對象。
自動生成對象
完成對象之間的關聯
根據需求決定生成單例還是多例
2.AOP面向切面編程的技術,採用動態代理技術,比如增刪改查,代碼已經寫好了,但有新的需求,要加權限驗證和加日誌,按照傳統的方式,要修改源代碼,但這樣代價太大了,風險很大,如可能會引入新的錯誤。如果按照AOP,在不知道源碼的情況下,可以增加功能。
比如過濾器Filter,和利用spring進行事務處理
如今開發需求,也是用AOP的思想去考慮
對原有的方法的基礎上,爲其增加新的功能,這種方式也叫做橫切性問題。
3.代替其他框架完成新的功能
比如替struts1生成多例的Action
替hibernate生成全局性的事務,真正的做到了安全性和併發性的統一
替很多的框架生成很多自動的功能:比如懶加載和編碼過濾器。
springmvc是spring家族的一部分,可以自動集成
作用:
1.生成session工廠:表示層struts1作爲表示層,因爲Action就是單例的。然而spring生成Action雖然表面上市單例的,但實質上是多例的。
2.對持久層:可以生成全局性的事務,session對每個事務共享,把安全級別降低到session上,假如有100個session,而且併發,事務一提交,但只有一個session去臨時集合中生成緩存。
3.替很多的框架生成很多自動的功能:比如懶加載和編碼過濾器。
DAO,ORM,AOP,JEE,WEB,CORE
傳統裝配:
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>