<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    軟件藝術(shù)思考者  
    混沌,彷徨,立志,蓄勢...
    公告
    日歷
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    隨筆分類(86)

    隨筆檔案(85)

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

     
    SpringFramework中的AOP簡單使用
    AOP作為Spring這個輕量級的容器中很重要的一部分,得到越來越多的關(guān)注,Spring的Transaction就是用AOP來管理的,今天就通過簡單的例子來看看Spring中的AOP的基本使用方法。

    ? 首先確定將要Proxy的目標(biāo),在Spring中默認(rèn)采用JDK中的dynamic proxy,它只能夠?qū)崿F(xiàn)接口的代理,如果想對類進(jìn)行代理的話,需要采用CGLIB的proxy。顯然,選擇“編程到接口”是更明智的做法,下面是將要代理的接口:

    ? public interface FooInterface {
    ??? public void printFoo();
    ??? public void dummyFoo();
    ? }

    ?
    ? 以及其一個簡單的實現(xiàn):
    ?
    ? public class FooImpl implements FooInterface {
    ??? public void printFoo() {
    ????? System.out.println("In FooImpl.printFoo");
    ??? }
    ??? public void dummyFoo() {
    ????? System.out.println("In FooImpl.dummyFoo");
    ??? }
    ? }

    ?
    ? 接下來創(chuàng)建一個Advice,在Spring中支持Around,Before,After returning和Throws四種Advice,這里就以簡單的Before Advice舉例:
    ?
    ? public class PrintBeforeAdvice implements MethodBeforeAdvice {
    ??? public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
    ????? System.out.println("In PrintBeforeAdvice");
    ??? }
    ? }
    ?
    ? 有了自己的business interface和advice,剩下的就是如何去裝配它們了,首先利用ProxyFactory以編程方式實現(xiàn),如下:
    ?
    ? public class AopTestMain {
    ??? public static void main(String[] args) {
    ????? FooImpl fooImpl = new FooImpl();
    ????? PrintBeforeAdvice myAdvice = new PrintBeforeAdvice();
    ?????
    ????? ProxyFactory factory = new ProxyFactory(fooImpl);
    ????? factory.addBeforeAdvice(myAdvice);
    ????? FooInterface myInterface = (FooInterface)factory.getProxy();

    ????? myInterface.printFoo();
    ????? myInterface.dummyFoo();
    ??? }
    ? }
    ?
    ? 現(xiàn)在執(zhí)行程序,神奇的結(jié)果就出現(xiàn)了:
    ?
    ? In PrintBeforeAdvice
    ? In FooImpl.printFoo
    ? In PrintBeforeAdvice
    ? In FooImpl.dummyFoo

    ?
    ? 雖然這樣能體會到Spring中AOP的用法,但這決不是值得推薦的方法,既然使用了Spring,在ApplicationContext中裝配所需要 的bean才是最佳策略,實現(xiàn)上面的功能只需要寫個簡單的applicationContext就可以了,如下:
    ?
    ? <?xml version="1.0" encoding="UTF-8"?>
    ? <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    ??? "
    http://www.springframework.org/dtd/spring-beans.dtd">

    ? <beans>
    ??? <description>The aop application context</description>
    ??? <bean id="fooTarget" class="FooImpl"/>
    ??? <bean id="myAdvice" class="PrintBeforeAdvice"/>
    ?? ?<bean id="foo" class="org.springframework.aop.framework.ProxyFactoryBean">
    ???? <property name="proxyInterfaces">
    ?????? <value>FooInterface</value>
    ???? </property>
    ?????<property name="target">
    ?????? <ref local="fooTarget"/>
    ???? </property>
    ???? <property name="interceptorNames">
    ?????? <list>
    ???????? <value>myAdvice</value>
    ?????? </list>
    ???? </property>
    ??? </bean>
    ? </beans>

    ? 當(dāng)然,main中的代碼也要進(jìn)行相應(yīng)的修改:
    ????
    ? public static void main(String[] args) {
    ??? ClassPathXmlApplicationContext context = new?
    ?????????????ClassPathXmlApplicationContext("applicationContext.xml");
    ??? FooInterface foo = (FooInterface)context.getBean("foo");
    ??? foo.printFoo();
    ??? foo.dummyFoo();
    ? }

    ?
    ? 現(xiàn)在運行一下,結(jié)果將和上面的運行結(jié)果完全一樣,這樣是不是更優(yōu)雅?當(dāng)需要更改實現(xiàn)時,只需要修改配置文件就可以了,程序中的代碼不需任何改動。
    ?
    ? 但是,這時候會發(fā)現(xiàn)被proxy的object中的所有方法調(diào)用時都將運行advice中的before,這顯然不能滿足絕大多數(shù)情況下的需要,此時,只 需借用Advisor就可以了,當(dāng)然要在Advisor中利用pattern設(shè)置好哪些方法需要advice,更改applicationContext 如下:
    ?
    ? <?xml version="1.0" encoding="UTF-8"?>
    ? <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    ??? "
    http://www.springframework.org/dtd/spring-beans.dtd">

    ? <beans>
    ??? <description>The springeva application context</description>
    ?? ?<bean id="fooTarget" class="FooImpl"/>
    ??? <bean id="printBeforeAdvice" class="PrintBeforeAdvice"/>
    ??? <bean id="myAdvisor"
    ????????? class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    ????? <property name="advice">
    ??????? <ref local="printBeforeAdvice"/>
    ????? </property>
    ????? <property name="pattern">
    ??????? <value>.*print.*</value>
    ????? </property>
    ??? </bean>
    ??? <bean id="foo" class="org.springframework.aop.framework.ProxyFactoryBean">
    ????? <property name="proxyInterfaces">
    ????????<value>FooInterface</value>
    ????? </property>
    ????? <property name="target">
    ??????? <ref local="fooTarget"/>
    ????? </property>
    ????? <property name="interceptorNames">
    ??????? <list>
    ????????? <value>myAdvisor</value>
    ??????? </list>
    ??????</property>
    ??? </bean>
    ? </beans>

    ? 主程序不需進(jìn)行任何修改,運行結(jié)果已經(jīng)變樣了:

    ? In PrintBeforeAdvice
    ? In FooImpl.printFoo
    ? In FooImpl.dummyFoo

    ?
    ? 至此,應(yīng)該已經(jīng)理解了Spring中AOP的使用方法,當(dāng)然Spring中AOP最重要的應(yīng)用是Transaction Manager,舉個這方面的applicationContext例子看看:
    ?
    ? <?xml version="1.0" encoding="UTF-8"?>
    ? <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd">

    ? <beans>
    ??? <bean id="propertyConfigurer"???
    ???????? class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    ????? <property name="location">
    ??????? <value>/WEB-INF/jdbc.properties</value>
    ??????</property>
    ?? ?</bean>
    ??? <bean id="dataSource"
    ????????? class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    ????? <property name="driverClassName">
    ??????? <value>${jdbc.driverClassName}</value>
    ????? </property>
    ??????<property name="url">
    ??????? <value>${jdbc.url}</value>
    ????? </property>
    ????? <property name="username">
    ??????? <value>${jdbc.username}</value>
    ????? </property>
    ????? <property name="password">
    ??????? <value>${jdbc.password}</value>
    ????? </property>
    ??? </bean>
    ?? ?<bean id="sessionFactory"
    ????????? class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
    ????? <property name="dataSource">
    ??????? <ref local="dataSource"/>
    ????? </property>
    ????? <property name="mappingResources">
    ??????? <value>smartmenu.hbm.xml</value>
    ????? </property>
    ????? <property name="hibernateProperties">
    ??????? <props>
    ????????? <prop key="hibernate.dialect">${hibernate.dialect}</prop>
    ??????? </props>
    ????? </property>
    ??? </bean>
    ?
    ??? <bean id="transactionManager"???????
    ????????? class="org.springframework.orm.hibernate.HibernateTransactionManager">
    ????? <property name="sessionFactory">
    ??????? <ref local="sessionFactory"/>
    ????? </property>
    ??? </bean>
    ??? <bean id="smartmenuTarget" class="SmartMenuHibernate">
    ????? <property name="sessionFactory">
    ??????? <ref local="sessionFactory"/>
    ????? </property>
    ??? </bean>
    ?? ?<bean id="smartMenu"
    ??????? class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    ????? <property name="transactionManager">
    ??????? <ref local="transactionManager"/>
    ????? </property>
    ????? <property name="target">
    ??????? <ref local="smartmenuTarget"/>
    ????? </property>
    ????? <property name="transactionAttributes">
    ??????? <props>
    ????????? <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    ????????? <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
    ??????? </props>
    ????? </property>
    ??? </bean>
    ? </beans>

    ?
    ? 要想徹底理解Spring的AOP,最好還是多看看源碼,開源就是好啊!

    posted on 2006-07-25 11:38 智者無疆 閱讀(426) 評論(1)  編輯  收藏 所屬分類: about spring
    評論:
     
    Copyright © 智者無疆 Powered by: 博客園 模板提供:滬江博客


       觀音菩薩贊

    主站蜘蛛池模板: 亚洲日韩aⅴ在线视频| 亚洲av无码国产精品色在线看不卡| 亚洲国产婷婷综合在线精品| 中文字幕在线观看亚洲日韩| 成人免费午夜无码视频| 91亚洲国产成人久久精品网址| 91精品国产免费| 亚洲乱码中文论理电影| 免费观看AV片在线播放| 亚洲伊人久久大香线蕉AV| 国产成人无码免费看视频软件 | 久久精品国产69国产精品亚洲| 人妖系列免费网站观看| 久久久久亚洲AV无码专区桃色| 久久最新免费视频| 亚洲av午夜福利精品一区人妖| 免费播放一区二区三区| 亚洲人成网站在线观看播放动漫 | 国产成人在线免费观看| 免费激情网站国产高清第一页| 亚洲毛片网址在线观看中文字幕| 福利免费在线观看| 亚洲免费视频播放| 国产乱子伦精品免费女| a级毛片免费在线观看| 亚洲欧洲精品久久| 国产午夜免费福利红片| 国产综合免费精品久久久| 亚洲精品欧洲精品| 波多野结衣久久高清免费| baoyu122.永久免费视频| 亚洲永久中文字幕在线| 免费精品国产自产拍观看| 中文在线观看免费网站| 亚洲av专区无码观看精品天堂| 国产一区二区三区免费视频| 久久久久国产免费| 国产精品亚洲专一区二区三区| 亚洲国产精品一区二区久久hs| 欧美日韩国产免费一区二区三区| igao激情在线视频免费|