Spring總結及不同版本間的區別
一 Spring中有一個IOC物件容器(Spring內部的一個HashMap容器),用於盛放物件的!
Spring中全部生成的物件都放在IOC物件容器中的!是以name或id的值做鍵存在容器中的!
給物件注入值的方式:---以下的4種全部都是交給Spring框架去注入的!
1. 用不帶引數的構造子依賴注入
2. Set依賴注入
3. 帶引數的構造子依賴注入
4. 介面依賴注入
5. LookUp-Method(使用CGLIB的動態位元組碼增強功能)注入,重寫方法!
<ref bean="p3"/>---表示可以引用其他Xml中的Bean;
<ref local="a"/>---local表示只能引用本Xml中的Bean;
Spring中載入上下文的三種方式:
ApplicationContext act=new ClassPathXmlApplicationContext(“applicationContext.xml”);
Resource resource=new ClassPathResource("application.xml");
ApplicationContext act = new FileSystemXmlApplicationContext (“F:/絕對路徑/application.xml”) ;
二 Spring配置工廠Bean
呼叫getBean(“工廠bean的id”)方法,Spring返回的不是直接建立的工廠Bean的例項,而是由工廠Bean建立的Bean例項(工廠bean生產的產品例項).
三 Spring的IOC容器用於管理Struts和Hibernate
SessionFactory和事務都是Hibernate中的東西,而不是Spring 的,Spring只是進行了封裝,本質上是Hibernate的,Spring通過SpringORM封裝了Hibernate!
注意:在使用Spring的時候,由Hibernate生成的影射檔案中要取消指定的資料庫名,否則查詢資料庫是要報錯!
----------整合部分!
四 Stirng1.2+Spring1.2+Hibernate3.1的整合(重點)
1. Struts1.2的配置檔案: Struts-config.xml檔案都是自動生成的!
<action-mappings >
<action
attribute="userForm"
parameter="m"
path="/user"
name="userForm"
type="org.springframework.web.struts.DelegatingActionProxy"—不同點就在這裡,不是Action的包路徑了,而是使用Spring的代理類交給Spring去建立Action的事例!讓它享受Spring的服務!
validate="false">
<forward name="user" path="/user.jsp"></forward>
</action>
</action-mappings>
<message-resources parameter="org.tongying.www.ApplicationResources" />
</struts-config>
2. Spring的配置檔案 ApplicationContext.xml檔案標頭檔案自動生成
<beans>
<!--session工廠-->
使用的事務和事務的管理都是用的Hibernate裡面的東西,都在Spring的.orm.hibernate3的下面
<bean id="sf" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!--事務管理-->
<bean id="tm" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sf"></property>
</bean>
配置的繼承
下面的配置可以使用配置繼承的方法來減少Spring的配置氾濫
先寫個基礎的代理,不指定target的代理目標,並且告訴Spring是抽象的不能使用,abstract=”true”!
當建對於具體的目標的Bean的時候,繼承上面的基礎代理就可以了!parent=”baseProxy”
再把target指定代理目標!
<!--servicei代理-->這就是代理,可以在其中加工處理的!
用事務攔截機的代理工廠Bean,針對業務層進行事務的監控--
<bean id="basePoxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"></property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="merge*">PROPAGATION_REQUIRED</prop>
根據不同的動作而執行事務!
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
針對業務層進行事務的監控
<bean id="userserviceproxy" parent="baseproxy">
<property name="target" ref="userservicei"></property>
</bean>
<!--daoimpl-->要使用SessionFactory查詢持久層!
<bean id="userdaoi" class="org.wllt.www.daoi.UserDaoi">
<property name="sessionFactory" ref="sf"></property>
</bean>
<!--serviceimpl-->要使用Dao介面的資料
<bean id="userservicei" class="org.wllt.www.servicei.UserServicei">
<property name="dao" ref="userdaoi"></property>
</bean>
<!--Action-->要使用業務層的資料
<bean name="/user" class="org.wllt.www.action.UserAction" singleton=”true”>--預設就是true
<property name="userservice" ref="userservicePoxy"></property>
但是不能直接來自於Servicei,因為在業務層需要事務,資料庫才會生效!只有先用代理處理!
</bean>
</beans>
3.Web.xml檔案
Struts1.2的配置檔案自己會載入的,但是Spring則要我們自己來寫配置!
---上下文的載入Spring的配置檔案!
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
---Spring載入監聽器
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
注意:在整合的過程中,Spring的jar包和Hibernate的jar包有許多的衝突,我們的處理方法是把Hibernate的相容性先新增到專案中,讓它可以幫我們產生配置檔案和po影射檔案,再移出全部的jar 包,把Hibernate的一個.jta拷到專案中就夠使用了!。在和Struts2.0的整合過程中也是如此!(只不過還有一個Struts2到Spring的外掛.jar)
兩個.jar包都是倒到專案的WebRoot下的Web-Inf下的lib下就可以了!
Struts1.2和Struts2.0配合Spring1.2時的區別:
(1)1.2在Struts-config.xml中使用代理類來來把Action的事例交給Spring的
org.springframework.web.struts.DelegatingActionProxy
2.0中是在Actions.xml中使用class=”Action在Spring 中的id名”
(2)1.2在Application中定義Action是使用的name=”/useraction”
2.0 ------------------------------- id=”useraction”
(3)2.0在struts.xml中使用了<constant name="struts.objectFactory" value="spring"/>
(4)web.xml都是一樣的!
五.Struts2.0+Spring1.2+Hibernate3.1的整合!
1.自己建actions.xml檔案
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"struts-2.0.dtd">
<struts>
<package name="one" namespace="/one" extends="struts-default">
<!--利用class="useraction"到Spring容器中去找生成的物件-->
<action name="user" method="list" class="useraction">-原來是action的包路徑,Spring整合不同
<result name="user">/user.jsp</result>
</action>
</package>
</struts>
2.自己建struts.xml檔案
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.locale" value="zh_CN" />
<constant name="struts.i18n.encoding" value="GBK" />
<constant name="struts.action.extension" value="action,itfuture,do"/>
<!--利用Struts2到Spring的外掛把Struts和Spring聯絡起來 -->[不用也可以]
<constant name="struts.objectFactory" value="spring"/>
<!--載入了action.xml-->
<include file="actions.xml"/>
</struts>
3.Spring中的applicationContext.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--SessionFactory-->
<bean id="sf" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!--事務的管理-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sf"></property>
</bean>
<!--serviceiproxy用事務攔截機的代理工廠Bean,針對業務層進行事務的監控,可以先做成代理的一個模版(其他的地方引用即可!)-->
<bean id="baseproxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"></property>
//去掉--<property name="target" ref="servicei"></property>--//
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="merge*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
此處引用定義代理(都可以適用的,部分什麼版本的配合!)
<bean id="deptserviceiproxy" parent="baseproxy">
<property name="target" ref="deptservicei"></property>
</bean>
<!--daoimpl-->
<bean id="daoi" class="org.wllt.www.daoi.UserDaoi">
<property name="sessionFactory" ref="sf"></property>
</bean>
<!--serviceimpl-->
<bean id="servicei" class="org.wllt.www.servicei.UserServicei">
<property name="dao" ref="daoi"></property>
</bean>
<!--action-->
<bean id="useraction" class="org.wllt.www.action.UserAction" singleton=”true”>
<property name="service" ref="serviceproxy"></property>
</bean>
</beans>
LookUp(利用CGLIB增強技術完成)
<lookup-method name=”方法名” bean=”返回型別”>
六.Spring2.0的使用!
(Struts2.0+Spring2.0+Hibernate3.1)
1. Spring2.0完全向下相容Spring1.2,程式碼不經過改動就可以執行專案!
2. Spring1.2和Spring2.0的區別在哪裡?
區別就是在applicationContext.xml的檔案中!(在.jar包裡有)
a.標頭檔案不同1.2是.dtd規則,而2.0是.xsd規則
b.下面的<action>配置單態性不同!
<!--action-->
<!--spring2.0用scope="singleton/prototype"替代spring1.2中的singleton="true/false"-->
<bean id="deptAction" class="org.itfuture.www.actions.DeptAction" scope="prototype">
<property name="service" ref="deptserviceiproxy"></property>
</bean>