程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> spring:利用Spring AOP 使日志輸入與方法分離,springaop

spring:利用Spring AOP 使日志輸入與方法分離,springaop

編輯:JAVA綜合教程

spring:利用Spring AOP 使日志輸入與方法分離,springaop


對方法進行日志輸出是一種很常見的功能。傳統的做法是把輸出語句寫在方法體的內部,在調用該方法時,用輸入語句輸出信息來記錄方法的執行!

1.先寫一個普通類:

package com.importnew;

public class Common {

    public void execute(String username,String password){
         System.out.println("------------------執行 execute()方法----------------");
       }
}

 

2.寫一個切面類,用於合法性校驗和日志添加:

package com.importnew;
import org.aspectj.lang.JoinPoint;
public class Check { public void checkValidity(){ System.out.println("------------------驗證合法性----------------"); } public void addLog(JoinPoint j){ System.out.println("------------------添加日志----------------"); Object obj[] = j.getArgs(); for(Object o :obj){ System.out.println(o); } System.out.println("========checkSecurity=="+j.getSignature().getName());//這個是獲得方法名 } }

 

3.配置AOP,使用XML方式:(注意紅色標志的內容)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
             
      <bean id="common" class="com.importnew.Common"/>      
      <bean id="check" class="com.importnew.Check"/>
       
      <aop:config>
        <aop:aspect id="myAop" ref="check">
          <aop:pointcut id="target" expression="execution(* com.importnew.Common.execute(..))"/>
          <aop:before method="checkValidity" pointcut-ref="target"/>
          <aop:after method="addLog" pointcut-ref="target"/>
        </aop:aspect>
      </aop:config>     
</beans>

 


注意:aop pointcut表達式(*)
execution(方法修飾符+返回值 完整類名+方法名(方法參數))
例如:
A、execution(public void *(..)):所有返回值是public void的方法都會被攔截到
B、execution(public void day6.com.beans.PersonService.*(..)):表示day6.com.beans.PersonService下所有返回值是public void的方法都會被攔截到
C、 execution(public void day6.com.beans.PersonService.save(java.lang.String...)):表示 day6.com.beans.PersonService類中的第一個形參類型是String的save方法會被攔截到
D、execution(public void save(..)):表示所有類中的save方法會被攔截到
E、execution(public void day6.com.service..*(..)):表示day6.com.service包下的類以及子包的類所有public void方法都會被攔截到
F、execution(public !void day6.com.service..*(..)):表示day6.com.service包下的類以及子包的類所有public 不是void返回類型的方法都會被攔截到

4.最後寫一個測試:

package test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.importnew.Common;

public class Client {

    public static void main(String[] args) {
        BeanFactory factory=new ClassPathXmlApplicationContext("applicationContext.xml");
         Common c=(Common) factory.getBean("common");
         c.execute("fuckyou","fuckme");
    }
}

 

注意:

需要添加三個包:spring-aop.jar , aspectjrt.jar ,aspectjweaver.jar,否則會報錯。

輸出結果:

------------------驗證合法性----------------
------------------執行 execute()方法----------------
------------------添加日志----------------
fuckyou
fuckme
========checkSecurity==execute

 

 

////end

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved