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