spring學習(轉載)

wzdoxu88發表於2007-08-01

spring學習筆記
一、Spring中兩個十分重要的概念——IOC/DI & AOP
1.IOC/DI(Inverse of control/Dependence Injection)
IOC:控制反轉,看起來比較牛B,說起來十分簡單。就是不使用傳統的將類的依賴關係用硬編碼來維護的方式,而是讓容器來管理類之間的依賴,依賴關係在全在一個配置檔案上。這樣,就將造成耦合的根源——複雜的依賴關係,進行了統一的,集約式管理。

DI:依賴注入,其實就是控制反轉。只是比IOC的表達稍微好點,更能望文生意些。依賴注入,簡單地說,就是在執行期間,由容器將元件之間的依賴關係注入到元件中。

IOC/DI的作用:有了這樣的設計,我們只需要專心編寫一個個高內聚的零件,而不用關心這些零件如何組合起來工作。這個問題是由依賴關係的配置檔案需要關注的。這樣將元件和依賴分離,提高了元件的可重用性。

三種IOC/DI方式:
1.介面注入:
將實現類的物件賦給介面的引用。實現類的物件是透過配置檔案描述,由容器負責建立的。
注意:目前部門使用的BS,就是這種方式。
2.值注入:
透過setxxx方法,將依賴關係注入到某個具體的物件中。Spring使用最多的依賴注入方式就是值注入。
3.構造子注入:
容器呼叫實現類的購造器,將依賴作為構造器的引數注入,一次性構建一個穩定的物件。

後兩種依賴注入方式的比較:
1.值注入:自然,直接,簡潔,但不穩定(如果在set的時候發生併發訪問,可能會出現很嚴重的狀況)
2.構造子注入:複雜,但很穩定(一次性建立,在建立階段就將依賴注入了,建立完成後,就已經是一個完成的,穩定的物件),而且可以很好地控制依賴注入的順序關係。


2.AOP(Aspect Oriented Programming)
AOP:翻譯為面向方法程式設計,網上說比較確切的說法是面向切面程式設計。我個人認為,說成是面向動作程式設計好象更加貼切。因為AOP是將某類動作高度內聚的程式設計方法。

AOP的特點:1.切分動作 2.原始碼無關性

AOP在Spring中的應用:事務管理機制

Spring事務管理機制的基本原理:
1.用一個動態Proxy類載入所有的配有事物管理的Bean
2.根據配置的事務觸發點做if判斷,然後在方法的前後加上事務處理的程式碼

Spring中的兩種AOP方式:
1.Proxy:面向介面
2.CGLIB:面向Class

對於AOP在Spring中的應用還不是十分清楚,需要加強。

二、struts+spring+hibernate 整合
1.在Eclipse中建立專案
2.加入struts
3.加入spring
4.加入hibernate
5.整合struts&spring
1)透過plug-in將struts與spring對接
2)透過action的type屬性將Action的控制權轉給spring
3)spring中配置action的實現類
6.整和spring+hibernate
1)只需要配置spring中的sessionFactory就可以了。十分方便。
2)為資料庫訪問類配置spring的事務管理,使得持久層的操作可以在spring的控制範圍之內。


(注意:以上內容比較簡單,純屬記錄個人學習過程。而且由於剛剛接觸spring,水平有限。不足之處,請多多原諒)

附:登入模組示例

配置檔案部分


Struts配置:struts-config.xml









type="org.springframework.web.struts.DelegatingActionProxy"
name="loginForm"
scope="request"
parameter="method">








Spring配置:applicationContext.xml


class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

/WEB-INF/classes/hibernate.cfg.xml



class="org.springframework.orm.hibernate3.HibernateTransactionManager">





class="com.neusoft.apps.login.bp.LoginBSImp">




from LOGIN login where login.aae011=? and login.aae012=?



class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">










PROPAGATION_REQUIRED
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly




class="com.neusoft.apps.login.rp.LoginAction"
singleton="false">





Hibernate配置:hibernate.cfg.xml:略,沒什麼好看的,就是配了個資料來源


程式碼部分:

Action:

package com.neusoft.apps.login.rp;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import com.neusoft.apps.login.LoginBS;

public class LoginAction extends DispatchAction{

private LoginBS dao;

public ActionForward login(ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
LoginForm form = (LoginForm) actionForm;
if(dao.isValidUser(form.getAae011(),form.getAae012()))
return actionMapping.findForward("ok");
else
return actionMapping.findForward("failed");
}

public LoginBS getDao() {
return dao;
}

public void setDao(LoginBS dao) {
this.dao = dao;
}
}

DAOImp:

package com.neusoft.apps.login.bp;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.neusoft.apps.login.LoginBS;

public class LoginBSImp extends HibernateDaoSupport implements LoginBS{
private SessionFactory sessionFactory;

private String hql;

public boolean isValidUser(String username, String password) {
// TODO Auto-generated method stub
List userList = this.getHibernateTemplate().find(hql, new Object[]{username,password});
if(userList.size() > 0)
return true;
else
return false;
}

public String getHql() {
return hql;
}

public void setHql(String hql) {
this.hql = hql;
}


}

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9294812/viewspace-930029/,如需轉載,請註明出處,否則將追究法律責任。

相關文章