SpringFramework中的AOP簡單使用

來源:互聯網
上載者:User
AOP作為Spring這個輕量級的容器中很重要的一部分,得到越來越多的關注,Spring的Transaction就是用AOP來管理的,今天就通過簡單的例子來看看Spring中的AOP的基本使用方法。 首先確定將要Proxy的目標,在Spring中預設採用JDK中的dynamic proxy,它只能夠實現介面的代理,如果想對類進行代理的話,需要採用CGLIB的proxy。顯然,選擇“編程到介面”是更明智的做法,下面是將要代理的介面: public interface FooInterface { public void printFoo(); public void dummyFoo(); } 以及其一個簡單的實現: public class FooImpl implements FooInterface { public void printFoo() { System.out.println("In FooImpl.printFoo"); } public void dummyFoo() { System.out.println("In FooImpl.dummyFoo"); } } 接下來建立一個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以編程方式實現,如下: 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(); } } 現在執行程式,神奇的結果就出現了: In PrintBeforeAdvice In FooImpl.printFoo In PrintBeforeAdvice In FooImpl.dummyFoo 雖然這樣能體會到Spring中AOP的用法,但這決不是值得推薦的方法,既然使用了Spring,在ApplicationContext中裝配所需要 的bean才是最佳策略,實現上面的功能只需要寫個簡單的applicationContext就可以了,如下: The aop application context
FooInterface



myAdvice
當然,main中的代碼也要進行相應的修改: public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); FooInterface foo = (FooInterface)context.getBean("foo"); foo.printFoo(); foo.dummyFoo(); } 現在運行一下,結果將和上面的運行結果完全一樣,這樣是不是更優雅?當需要更改實現時,只需要修改設定檔就可以了,程式中的代碼不需任何改動。 但是,這時候會發現被proxy的object中的所有方法調用時都將運行advice中的before,這顯然不能滿足絕大多數情況下的需要,此時,只 需借用Advisor就可以了,當然要在Advisor中利用pattern設定好哪些方法需要advice,更改applicationContext 如下: The springeva application context


.*print.*

FooInterface



myAdvisor
主程式不需進行任何修改,運行結果已經變樣了: In PrintBeforeAdvice In FooImpl.printFoo In FooImpl.dummyFoo 至此,應該已經理解了Spring中AOP的使用方法,當然Spring中AOP最重要的應用是Transaction Manager,舉個這方面的applicationContext例子看看:
/WEB-INF/jdbc.properties

${jdbc.driverClassName}

${jdbc.url}

${jdbc.username}

${jdbc.password}



smartmenu.hbm.xml



${hibernate.dialect}













PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly


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

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。