欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Spring入門(mén)
作者:Xuefeng    文章來(lái)源:本站原創(chuàng )    點(diǎn)擊數:656    更新時(shí)間:2006-4-2
提示:如果您有任何疑問(wèn),請到開(kāi)發(fā)論壇提問(wèn)或討論。
Spring是一個(gè)非常優(yōu)秀的輕量級框架,通過(guò)Spring的IoC容器,我們的關(guān)注點(diǎn)便放到了需要實(shí)現的業(yè)務(wù)邏輯上。對AOP的支持則能讓我們動(dòng)態(tài)增強業(yè)務(wù)方法。編寫(xiě)普通的業(yè)務(wù)邏輯Bean是非常容易而且易于測試的,因為它能脫離J2EE容器(如Servlet,JSP環(huán)境)單獨進(jìn)行單元測試。最后的一步便是在Spring框架中將這些業(yè)務(wù)Bean以XML配置文件的方式組織起來(lái),它們就按照我們預定的目標正常工作了!非常容易!
本文將給出一個(gè)基本的Spring入門(mén)示例,并演示如何使用Spring的AOP將復雜的業(yè)務(wù)邏輯分離到每個(gè)方面中。
1.開(kāi)發(fā)環(huán)境配置
2.編寫(xiě)Bean接口及其實(shí)現
3.在Spring中配置Bean并獲得Bean的實(shí)例
4.編寫(xiě)Advisor以增強ServiceBean
5.總結
1.開(kāi)發(fā)環(huán)境配置
首先,需要正確配置Java環(huán)境。推薦安裝JDK1.4.2,并正確配置環(huán)境變量:
JAVA_HOME=<JDK安裝目錄>
CLASSPATH=.
Path=%JAVA_HOME%\bin;……
我們將使用免費的Eclipse 3.1作為IDE。新建一個(gè)Java Project,將Spring的發(fā)布包spring.jar以及commons-logging-1.0.4.jar復制到Project目錄下,并在Project > Properties中配置好Java Build Path:
2.編寫(xiě)Bean接口及其實(shí)現
我們實(shí)現一個(gè)管理用戶(hù)的業(yè)務(wù)Bean。首先定義一個(gè)ServiceBean接口,聲明一些業(yè)務(wù)方法:
/**
* Copyright_2006, Liao Xuefeng
* Created on 2006-3-9
* For more information, please visit:http://www.crackj2ee.com
*/
package com.crackj2ee.example.spring; /**
* Interface of service facade.
*
* @author Xuefeng
*/
public interface ServiceBean {
void addUser(String username, String password);
void deleteUser(String username);
boolean findUser(String username);
String getPassword(String username);
}
然后在MyServiceBean中實(shí)現接口:
/**
* Copyright_2006, Liao Xuefeng
* Created on 2006-3-9
*
* For more information, please visit:http://www.crackj2ee.com
*/
package com.crackj2ee.example.spring; import java.util.*; public class MyServiceBean implements ServiceBean {     private String dir;
private Map map = new HashMap();     public void setUserDir(String dir) {
this.dir = dir;
System.out.println("Set user dir to: " + dir);
}     public void addUser(String username, String password) {
if(!map.containsKey(username))
map.put(username, password);
else
throw new RuntimeException("User already exist.");
}     public void deleteUser(String username) {
if(map.remove(username)==null)
throw new RuntimeException("User not exist.");
}     public boolean findUser(String username) {
return map.containsKey(username);
}     public String getPassword(String username) {
return (String)map.get(username);
}
}
為了簡(jiǎn)化邏輯,我們使用一個(gè)Map保存用戶(hù)名和口令。
現在,我們已經(jīng)有了一個(gè)業(yè)務(wù)Bean。要測試它非常容易,因為到目前為止,我們還沒(méi)有涉及到Spring容器,也沒(méi)有涉及到任何Web容器(假定這是一個(gè)Web應用程序關(guān)于用戶(hù)管理的業(yè)務(wù)Bean)。完全可以直接進(jìn)行Unit測試,或者,簡(jiǎn)單地寫(xiě)個(gè)main方法測試:
/**
* Copyright_2006, Liao Xuefeng
* Created on 2006-3-9
* For more information, please visit:http://www.crackj2ee.com
*/
package com.crackj2ee.example.spring; public class Main {     public static void main(String[] args) throws Exception {
ServiceBean service = new MyServiceBean();
service.addUser("bill", "hello");
service.addUser("tom", "goodbye");
service.addUser("tracy", "morning");
System.out.println("tom‘s password is: " + service.getPassword("tom"));
if(service.findUser("tom")) {
service.deleteUser("tom");
}
}
}
執行結果:
3.在Spring中配置Bean并獲得Bean的實(shí)例
我們已經(jīng)在一個(gè)main方法中實(shí)現了業(yè)務(wù),不過(guò),將對象的生命周期交給容器管理是更好的辦法,我們就不必為初始化對象和銷(xiāo)毀對象進(jìn)行硬編碼,從而獲得更大的靈活性和可測試性。
想要把ServiceBean交給Spring來(lái)管理,我們需要一個(gè)XML配置文件。新建一個(gè)beans.xml,放到src目錄下,確保在classpath中能找到此配置文件,輸入以下內容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"
<beans>
<bean id="service" class="com.crackj2ee.example.spring.MyServiceBean" />
</beans>
以上XML聲明了一個(gè)id為service的Bean,默認地,Spring為每個(gè)聲明的Bean僅創(chuàng )建一個(gè)實(shí)例,并通過(guò)id來(lái)引用這個(gè)Bean。下面,我們修改main方法,讓Spring來(lái)管理業(yè)務(wù)Bean:
/**
* Copyright_2006, Liao Xuefeng
* Created on 2006-3-9
* For more information, please visit:
http://www.crackj2ee.com
*/
package com.crackj2ee.example.spring; import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource; public class Main {     public static void main(String[] args) throws Exception {
// init factory:
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
// use service bean:
ServiceBean service = (ServiceBean)factory.getBean("service");
service.addUser("bill", "hello");
service.addUser("tom", "goodbye");
service.addUser("tracy", "morning");
System.out.println("tom‘s password is \"" + service.getPassword("tom") + "\"");
if(service.findUser("tom")) {
service.deleteUser("tom");
}
// close factory:
factory.destroySingletons();
}
}
執行結果:
由于我們要通過(guò)main方法啟動(dòng)Spring環(huán)境,因此,首先需要初始化一個(gè)BeanFactory。紅色部分是初始化Spring的BeanFactory的典型代碼,只需要保證beans.xml文件位于classpath中。
然后,在BeanFactory中通過(guò)id查找,即可獲得相應的Bean的實(shí)例,并將其適當轉型為合適的接口。
接著(zhù),實(shí)現一系列業(yè)務(wù)操作,在應用程序結束前,讓Spring銷(xiāo)毀所有的Bean實(shí)例。
對比上一個(gè)版本的Main,可以看出,最大的變化是不需要自己管理Bean的生命周期。另一個(gè)好處是在不更改實(shí)現類(lèi)的前提下,動(dòng)態(tài)地為應用程序增加功能。
4.編寫(xiě)Advisor以增強ServiceBean
所謂AOP即是將分散在各個(gè)方法處的公共代碼提取到一處,并通過(guò)類(lèi)似攔截器的機制實(shí)現代碼的動(dòng)態(tài)織入??梢院?jiǎn)單地想象成,在某個(gè)方法的調用前、返回前、調用后和拋出異常時(shí),動(dòng)態(tài)插入自己的代碼。在弄清楚Pointcut、Advice之類(lèi)的術(shù)語(yǔ)前,不如編寫(xiě)一個(gè)最簡(jiǎn)單的AOP應用來(lái)體驗一下。
考慮一下通常的Web應用程序都會(huì )有日志記錄,我們來(lái)編寫(xiě)一個(gè)LogAdvisor,對每個(gè)業(yè)務(wù)方法調用前都作一個(gè)記錄:
/**
* Copyright_2006, Liao Xuefeng
* Created on 2006-3-9
* For more information, please visit:http://www.crackj2ee.com
*/
package com.crackj2ee.example.spring; import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice; public class LogAdvisor implements MethodBeforeAdvice {
public void before(Method m, Object[] args, Object target) throws Throwable {
System.out.println("[Log] " + target.getClass().getName() + "." + m.getName() + "()");
}
}
然后,修改beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"
<bean id="serviceTarget" class="com.crackj2ee.example.spring.MyServiceBean" />     <bean id="logAdvisor" class="com.crackj2ee.example.spring.LogAdvisor" />     <bean id="service" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces"><value>com.crackj2ee.example.spring.ServiceBean</value></property>
<property name="target"><ref local="serviceTarget"/></property>
<property name="interceptorNames">
<list>
<value>logAdvisor</value>
</list>
</property>
</bean>
</beans>
注意觀(guān)察修改后的配置文件,我們使用了一個(gè)ProxyFactoryBean作為service來(lái)與客戶(hù)端打交道,而真正的業(yè)務(wù)Bean即MyServiceBean被聲明為serviceTarget并作為參數對象傳遞給ProxyFactoryBean,proxyInterfaces指定了返回的接口類(lèi)型。對于客戶(hù)端而言,將感覺(jué)不出任何變化,但卻動(dòng)態(tài)加入了LogAdvisor,關(guān)系如下:
運行結果如下,可以很容易看到調用了哪些方法:
要截獲指定的某些方法也是可以的。下面的例子將修改getPassword()方法的返回值:
/**
* Copyright_2006, Liao Xuefeng
* Created on 2006-3-9
* For more information, please visit:
http://www.crackj2ee.com
*/
package com.crackj2ee.example.spring; import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation; public class PasswordAdvisor implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
Object ret = invocation.proceed();
if(ret==null)
return null;
String password = (String)ret;
StringBuffer encrypt = new StringBuffer(password.length());
for(int i=0; i<password.length(); i++)
encrypt.append(‘*‘);
return encrypt.toString();
}
}
這個(gè)PasswordAdvisor將截獲ServiceBean的getPassword()方法的返回值,并將其改為"***"。繼續修改beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"
<beans>
<bean id="serviceTarget" class="com.crackj2ee.example.spring.MyServiceBean" />     <bean id="logAdvisor" class="com.crackj2ee.example.spring.LogAdvisor" />     <bean id="passwordAdvisorTarget" class="com.crackj2ee.example.spring.PasswordAdvisor" />     <bean id="passwordAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref local="passwordAdvisorTarget"/>
</property>
<property name="patterns">
<list>
<value>.*getPassword</value>
</list>
</property>
</bean>     <bean id="service" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces"><value>com.crackj2ee.example.spring.ServiceBean</value></property>
<property name="target"><ref local="serviceTarget"/></property>
<property name="interceptorNames">
<list>
<value>logAdvisor</value>
<value>passwordAdvisor</value>
</list>
</property>
</bean>
</beans>
利用Spring提供的一個(gè)RegexMethodPointcutAdvisor可以非常容易地指定要截獲的方法。運行結果如下,可以看到返回結果變?yōu)?******":
還需要繼續增強ServiceBean?我們編寫(xiě)一個(gè)ExceptionAdvisor,在業(yè)務(wù)方法拋出異常時(shí)能做一些處理:
/**
* Copyright_2006, Liao Xuefeng
* Created on 2006-3-9
* For more information, please visit:
http://www.crackj2ee.com
*/
package com.crackj2ee.example.spring; import org.springframework.aop.ThrowsAdvice; public class ExceptionAdvisor implements ThrowsAdvice {
public void afterThrowing(RuntimeException re) throws Throwable {
System.out.println("[Exception] " + re.getMessage());
}
}
將此Advice添加到beans.xml中,然后在業(yè)務(wù)Bean中刪除一個(gè)不存在的用戶(hù),故意拋出異常:
service.deleteUser("not-exist");
再次運行,注意到ExceptionAdvisor記錄下了異常:
5.總結
利用Spring非常強大的IoC容器和AOP功能,我們能實(shí)現非常靈活的應用,讓Spring容器管理業(yè)務(wù)對象的生命周期,利用AOP增強功能,卻不影響業(yè)務(wù)接口,從而避免更改客戶(hù)端代碼。
為了實(shí)現這一目標,必須始終牢記:面向接口編程。而Spring默認的AOP代理也是通過(guò)Java的代理接口實(shí)現的。雖然Spring也可以用CGLIB實(shí)現對普通類(lèi)的代理,但是,業(yè)務(wù)對象只要沒(méi)有接口,就會(huì )變得難以擴展、維護和測試。
歡迎來(lái)信與作者交流:asklxf@163.com
可以從此處下載完整的Eclipse工程:
springbasic.rar
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Memcached與Spring AOP構建數分布式據庫前端緩存框架
Spring-AOP核心
Spring HTTP Invoker例子
Spring 注解學(xué)習手札
集成 Flex, Spring, Hibernate 構建應用程序
MyBatis3與Spring4整合方法詳解
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久