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

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

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

    閑人野居
    好好學習,天天向上
    posts - 57,  comments - 137,  trackbacks - 0

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

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

    ??? public void entry(String message) {
    ??????? log.info(message);
    ??? }
    }
    這里只是簡單的一個方法,當然實際情況可能不同。
    由于xml配置需要一個方面的實現bean
    所以創建一個簡單的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 基本上都差不多

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

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

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


    然后關鍵的在于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 表示要執行的匹配表達式,這里匹配所有的public方法,但是去除logger類的所有方法,防止無限調用-->

    ??????<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>

    現在寫一個測試類:

    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

    第二種實現方式,采用注釋方式:

    Logger 類不變
    創建一個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文件換掉就行

    打印的方式差不多

    個人還是比較喜歡第二種實現。


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

    <2006年10月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    常用鏈接

    留言簿(12)

    隨筆分類(59)

    隨筆檔案(57)

    blog

    java

    uml

    搜索

    •  

    積分與排名

    • 積分 - 357288
    • 排名 - 155

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一级午夜a毛片免费视频| 亚洲色欲色欲综合网站| 免费二级毛片免费完整视频| 欧美男同gv免费网站观看 | 亚洲精品不卡视频| 亚洲一区二区三区四区在线观看| 亚洲成a人片在线观看日本| 亚洲人成无码网站| 亚洲AV福利天堂一区二区三 | 成人免费毛片观看| 嫩草影院免费观看| 国产成人免费一区二区三区| 国产伦精品一区二区三区免费下载| 免费a在线观看播放| 免费亚洲视频在线观看| 亚洲1234区乱码| 91午夜精品亚洲一区二区三区| 亚洲精品第五页中文字幕| 亚洲日本香蕉视频| 亚洲人成网站在线在线观看| 99亚洲乱人伦aⅴ精品| 国产亚洲综合视频| 久青草视频97国内免费影视| 久久大香香蕉国产免费网站| 日本黄网站动漫视频免费| 成人毛片免费在线观看| 免费在线观看理论片| 亚洲色中文字幕无码AV| 亚洲精品福利在线观看| 亚洲日韩精品无码专区加勒比 | 2048亚洲精品国产| 亚洲av无码国产精品夜色午夜| 亚洲欧洲视频在线观看| 亚洲欧美成人一区二区三区| 九九久久精品国产免费看小说| 久久精品视频免费| 在线观看免费为成年视频| 爱情岛论坛网亚洲品质自拍| 亚洲三级电影网站| 在线观看亚洲网站| 日本在线免费观看|