現(xiàn)在開始寫寫Spring,Spring它是一個非常優(yōu)秀的 框架,在之前我已經(jīng)寫過Struts和Hibernate,大家知道現(xiàn)在流行的框架體系結(jié)構(gòu)就是Struts + Spring + Hibernate,現(xiàn)在也有的公司用jsf+ajax代替struts, 就是用來做用戶界面層UI。一般是Struts導(dǎo)過來,它有一個表單Bean,以前表單的action就用Struts來做,但現(xiàn)在有了Spring,就由Spring來接手,以后就是由Spring的反轉(zhuǎn)控制以及它的面向切面性,來接手Struts里面的一些東西,也包括日志服務(wù)! 上圖顯示出Spring的七個模塊,第一個AOP主要是面向切面性部分,先簡單的介紹下什么是面向切面性,其實(shí)面向切面性是面向?qū)ο笮灾械囊环N特殊情況,它其實(shí)也是面向?qū)ο笮灾械囊环N概念,只是它不是一種面向?qū)ο蟮囊环N方式了,它把其中的一些方法以及服務(wù)呢做成一種切面!它“你”去通過!在后面再詳說~Spring,它也提供了ORM,學(xué)到現(xiàn)在已經(jīng)對ORM不陌生了,關(guān)系對象模型,大家可能會首先想到Hibernate.,其實(shí)在Spring中它已經(jīng)集成了Hibernate,因此我們需要將 Hibernate加入到Spring中來是非常方便的!我們可以將 其數(shù)據(jù)源直接配在我們的applicationcontext.xml中, 另外它也提供一個Spring Web服務(wù),以及DAO,所謂的數(shù)據(jù)訪問對象,還有就是Spring context對象,所謂的上下文對象,它里面提供了一個ApplicationContext,當(dāng)然它自身也提供了MVC,而最終它底層依賴一個核心的庫,是這樣一種結(jié)構(gòu)! 我們可以在玩游戲的時候經(jīng)常有這樣情景,假如存在一個通道,其中有二個門,假設(shè)當(dāng)我們的角色通過第一道門的時候,我們的紅會加100,而再通過第二道門的時候我們的藍(lán)會加100,現(xiàn)在提出一個問題,就是假如我們這個游戲里面該通道上沒有這二個門,是正常的嗎?當(dāng)然是,也行!只不過人物角色不能在通過該通道的時候加紅和藍(lán),并不影響游戲的整體!就是說有一些服務(wù)在我們的WEB應(yīng)用程序中不是一些必須的服務(wù),就像是Log4J,日志服務(wù)!假如說沒有它,我們的程序也行,就是像這樣的一些服務(wù),它與我們的應(yīng)用程序需求無關(guān),但我們又提供了,那么程序中其實(shí)有時候有許多這樣的情景,就是程序并不是必須,好比上面的門,我們看整個通道,那么這二個門是不是好比是二個切面呢?我們穿過一個門的時候是不是穿過一個空間的切面了!這種就叫做面向切面性,把一種技術(shù)做成一種切面的形式,你只要通過這個切面的形式,你就獲得了這個服務(wù),它其實(shí)是面向?qū)ο蟮囊环N補(bǔ)長,因為面向?qū)ο笮运荒茏鰹橐粋€對象,我們就必須把一個對象完整的做出來,那么好比上面的游戲,有這樣一個戰(zhàn)士,我們做一個戰(zhàn)士類,那么當(dāng)它經(jīng)過那二門的時候,我們?nèi)绻悦嫦驅(qū)ο髞砜紤],那么 我們要在戰(zhàn)士這個類中定義二扇門,一扇加紅一扇加藍(lán),那么這樣這二扇門就變成戰(zhàn)士的二屬性了,那如果這二扇門不存在了,那戰(zhàn)士豈不……這應(yīng)該是不行的!這樣我們以切面性來做的話,就可以將戰(zhàn)士二扇門屬性去掉,然后做二個祝福門,只要戰(zhàn)士經(jīng)過這二門,就會得到紅藍(lán)!這其實(shí)就是一種AOP概念! package fengyan; /** * * @author: fengyan * date: 2006-12-31 02:37 * */ public class User { private String userName; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } } 我們再寫一個主函數(shù):TestMain.java package fengyan; /** * * @author: fengyan * date: 2006-12-31 02:39 * */ public class TestMain { public static void main(String[] args){ //依賴注入 User user = new User(); user.setUserName("fengyan"); System.out.println(user.getUserName()); } } 這樣在運(yùn)行的時候會輸出:fengyan 但這種看一下,我們的User與TestMain 之間就有關(guān)系了,也就是如果我們要將fengyan改為efly那么我們就需要在TestMain類中修改,這樣就形成了一種緊藕合,它們二個類邊在一塊了,那么 我們能不能有一種方法可以在二個類內(nèi)部都不改動的情況下可以輸出efly呢,肯定是可以的,那么我們現(xiàn)在在Myeclipse給我們生成的spring配置文件 applicationContext.xml中修改,我們先打開該文件,然后鼠標(biāo)移至其內(nèi)部空白地,右鍵,如下: 看到上圖,就想到在Struts中,與我們在Struts的配置文件中操作相似,那個里面是也有new action form,等等! 我們設(shè)置bean ID為user 存放于我們建立的fengyan包下,然后選擇properties屬性,添加一個value屬性userNane,變量名一定要對應(yīng)類中,值就改為我們需要的efly,單擊完成后看該文件代碼如下: <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www./dtd/spring-beans.dtd"> <beans> <bean id="user" class="fengyan.User" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default"> <property name="userName"> <value>efly</value> </property> </bean> </beans> 看起來有點(diǎn)像我們的jsp中的<jsp:usebean class="">。那么產(chǎn)生后我們?nèi)绾稳フ{(diào)用呢,回頭改改TestMain package fengyan;
import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; /** * * @author: fengyan * date: 2006-12-31 02:39 * */ public class TestMain { public static void main(String[] args){ /* //依賴注入 User user = new User(); user.setUserName("fengyan"); System.out.println(user.getUserName()); */ //ICO 反轉(zhuǎn)控制 ApplicationContext context = new FileSystemXmlApplicationContext("fengyan/applicationContext.xml"); //這樣我們獲取了一個全局的應(yīng)用程序上下文對象 //下面我們創(chuàng)建實(shí)例就不是先前的直接new 了 User user = (User)context.getBean("user");//是對象類型,需轉(zhuǎn)換 System.out.println(user.getUserName()); } } 這樣efly就輸出了,那么現(xiàn)在我們要再換為xuanfly就不需要動該二個類文件了,直接改配置文件,這就是IOC技術(shù)。 |
|