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

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

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

    閑人野居
    好好學(xué)習(xí),天天向上
    posts - 57,  comments - 137,  trackbacks - 0

    前面這是講了許多的概念,下面以一個例子來說明:
    一個很好理解的aop 例子,也就是日志服務(wù)。
    先從aop第一種方式來實現(xiàn),也就是xml配置方式
    先創(chuàng)建基本的日志類:
    public class Logger {

    ??? private static Log log = LogFactory.getLog(Logger.class);

    ??? public void entry(String message) {
    ??????? log.info(message);
    ??? }
    }
    這里只是簡單的一個方法,當(dāng)然實際情況可能不同。
    由于xml配置需要一個方面的實現(xiàn)bean
    所以創(chuàng)建一個簡單的bean :
    public class LogBean {

    ??? private Logger logger = new Logger();

    ??? public Object aroundLogCalls(ProceedingJoinPoint joinPoint) throws Throwable {
    ??????? logger.entry("before invoke method:"
    ???????????????????? + joinPoint.getSignature().getName());
    ??????? Object object = joinPoint.proceed();
    ??????? logger.entry("after invoke method:"
    ???????????????????? + joinPoint.getSignature().getName());
    ??????? return object;
    ??? }
    }
    這里采取簡單的around advice,其他類型的advice 基本上都差不多

    當(dāng)然有了這兩個核心的日志類,需要一個測試類,用于測試。
    public class TestBean {

    ??? public void method1() {
    ??????? System.out.println("in method1");
    ??? }

    ??? public void method2() {
    ??????? System.out.println("in method2");
    ??? }
    }
    這就是需要測試的類了,需要記錄日志的方法只有兩個,這里用System.out.println,只是想顯示方法的調(diào)用順序。


    然后關(guān)鍵的在于xml的配置了

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="?xmlns:xsi="?xmlns:aop="http://www.springframework.org/schema/aop"
    ?xsi:schemaLocation="
    http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">
    ?
    ?<aop:config>
    ????<!--??expression 表示要執(zhí)行的匹配表達(dá)式,這里匹配所有的public方法,但是去除logger類的所有方法,防止無限調(diào)用-->

    ??????<aop:pointcut id="loggableCalls"
    ????????? expression="execution(public * *(..)) and !execution(* org.spring.test.aop.log.Logger.*(..))"/>


    ??<aop:aspect id="logAspect" ref="logBean">
    ???<aop:around pointcut-ref="loggableCalls" method="aroundLogCalls"/>
    ??</aop:aspect>
    ?
    ?</aop:config>
    ?<bean id="logBean" class="org.spring.test.aop.log.LogBean" />
    ?<bean id="testBean" class="org.spring.test.aop.log.TestBean"/>
    ?
    </beans>

    現(xiàn)在寫一個測試類:

    public class LogXmlTest extends RootTest {

    ??? @Override
    ??? protected String getBeanXml() {
    ??????? return "org/spring/test/aop/log/bean.xml";
    ??? }

    ??? public void testLog() {
    ??????? TestBean bean = (TestBean) ctx.getBean("testBean");
    ??????? bean.method1();
    ??????? bean.method2();
    ??? }

    }

    public abstract class RootTest extends TestCase {

    ??? protected ApplicationContext? ctx;

    ??? protected Log log = LogFactory.getLog(getClass());

    ??? protected RootTest() {
    ??????? ctx = new ClassPathXmlApplicationContext(getBeanXml());
    ??? }

    ??? protected abstract String getBeanXml();

    }

    打印的消息如下:
    2006-09-17 11:08:28,203 INFO [org.spring.test.aop.log.Logger] - before invoke method:method1
    in method1
    2006-09-17 11:08:28,203 INFO [org.spring.test.aop.log.Logger] - after invoke method:method1
    2006-09-17 11:08:28,218 INFO [org.spring.test.aop.log.Logger] - before invoke method:method2
    in method2
    2006-09-17 11:08:28,218 INFO [org.spring.test.aop.log.Logger] - after invoke method:method2

    第二種實現(xiàn)方式,采用注釋方式:

    Logger 類不變
    創(chuàng)建一個LogAspect類
    @Aspect
    public class LogAspect {

    ??? private Logger logger = new Logger();

    ??? @Pointcut("execution(public * *(..))")
    ??? public void publicMethods() {

    ??? }

    ??? @Pointcut("execution(* org.spring.test.aop.log.Logger.*(..))")
    ??? public void logObjectCalls() {

    ??? }

    ??? @Pointcut("publicMethods()&&!logObjectCalls()")
    ??? public void loggableCalls() {

    ??? }

    ??? @Around("loggableCalls()")
    ??? public Object aroundLogCalls(ProceedingJoinPoint joinPoint) throws Throwable {
    ??????? logger.entry("before invoke method:"
    ???????????????????? + joinPoint.getSignature().getName());
    ??????? Object object = joinPoint.proceed();
    ??????? logger.entry("after invoke method:"
    ???????????????????? + joinPoint.getSignature().getName());
    ??????? return object;
    ??? }
    }

    配置文件就簡單多了
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="?xmlns:xsi="?xmlns:aop="?xsi:schemaLocation="
    http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop?
    ?<aop:aspectj-autoproxy/>
    ?
    ?<!-- 或者使用以下定義
    ?
    ?
    ?
    ?<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
    ?
    ?-->
    ?<bean id="logAspect" class="org.spring.test.aop.log.LogAspect"/>
    ?<bean id="testBean" class="org.spring.test.aop.log.TestBean"/>
    ?
    </beans>

    測試類:
    跟上面的差不多
    把xml文件換掉就行

    打印的方式差不多

    個人還是比較喜歡第二種實現(xiàn)。


    FeedBack:
    # re: spring aop 2.0 編程(三)
    2006-09-26 18:23 | 旱頭憨腦
    hi,我完全按照你的配置來寫的,為什么不能跑起來呢?
    請問有什么需要注意的地方么?  回復(fù)  更多評論
      
    # re: spring aop 2.0 編程(三)
    2006-10-20 16:54 | 捕風(fēng)
    可不可以通過這種方式在日志中輸出bo的業(yè)務(wù)數(shù)據(jù)(testBean.toString()).
    pointcut:myapp.service.bo.*
      回復(fù)  更多評論
      
    # re: spring aop 2.0 編程(三)
    2006-10-21 08:33 | 布衣郎
    @捕風(fēng)
    應(yīng)該可以,只要定義參數(shù)傳遞就行,通過this 或者target來傳遞
      回復(fù)  更多評論
      
    # re: spring aop 2.0 編程(三)
    2006-11-11 21:43 | 冰川
    這個好啊~~~
    支持下。。。  回復(fù)  更多評論
      

    <2006年9月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    常用鏈接

    留言簿(12)

    隨筆分類(59)

    隨筆檔案(57)

    blog

    java

    uml

    搜索

    •  

    積分與排名

    • 積分 - 357233
    • 排名 - 155

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日韩免费高清播放器| 亚洲国产综合AV在线观看| xvideos永久免费入口| 国产美女做a免费视频软件| 亚洲国产欧美日韩精品一区二区三区| 青青青免费国产在线视频小草| 亚洲国产精品成人综合久久久| 亚洲一区二区免费视频| 亚洲图片校园春色| AV免费网址在线观看| 亚洲男同gay片| 亚洲福利精品电影在线观看| 一级免费黄色大片| 亚洲欧洲自拍拍偷午夜色无码| 中文字幕乱码一区二区免费| 亚洲精品私拍国产福利在线| 一本岛高清v不卡免费一三区| 亚洲无吗在线视频| 国产免费啪嗒啪嗒视频看看| 午夜免费国产体验区免费的| 狠狠综合久久综合88亚洲| 香港a毛片免费观看| 亚洲AV无码精品蜜桃| 国产一区二区三区在线免费观看| 免费人成视频在线播放| 亚洲理论电影在线观看| free哆啪啪免费永久| 亚洲Av永久无码精品一区二区| 亚洲婷婷国产精品电影人久久| 免费观看久久精彩视频| 国产亚洲福利在线视频| 亚洲精品乱码久久久久久不卡 | 老司机亚洲精品影院| 免免费国产AAAAA片| 人成电影网在线观看免费| 久久综合日韩亚洲精品色| 成人黄软件网18免费下载成人黄18免费视频 | 亚洲AV无码乱码在线观看代蜜桃| 免费大香伊蕉在人线国产| 国偷自产一区二区免费视频| 国产婷婷综合丁香亚洲欧洲|