spring AOP 是基于面向切面的編程,它能夠使得我們專(zhuān)注于我們的業(yè)務(wù)處理,將一些其他的東西由它來(lái)統(tǒng)一完成,程序的侵入性很小,所以被廣泛應(yīng)用,至于實(shí)現(xiàn)原理我就不多說(shuō)了,兩個(gè)字:"代理"!
下面說(shuō)說(shuō)標(biāo)題所示的應(yīng)用,記錄日志,什么時(shí)候記錄日志,都記錄什么?想想,可不
就是在調(diào)用方法的時(shí)候?qū)懭罩韭?,之前如果使用logger的話,都會(huì)在方法的開(kāi)始寫(xiě)一個(gè)logger.info("xxxxxxxxxxxx");結(jié)束的
時(shí)候再寫(xiě)一個(gè),這不是很麻煩嗎,每次都要寫(xiě)。實(shí)際上這個(gè)時(shí)候我們就可以用aop來(lái)做,當(dāng)方法進(jìn)入的時(shí)候?qū)懸粭l日志,結(jié)束的時(shí)候再寫(xiě)一條,分別對(duì)應(yīng)“前置通
知”和”后置通知“,如果我們都日志有新的寫(xiě)法,值需要修改控制日志的這個(gè)類(lèi),對(duì)程序沒(méi)有絲毫影響,也就談不上改動(dòng)大量的代碼了。下面開(kāi)始:
1.引入aop的命名空間(其中有AOP的那部分):
<beans xmlns="http://www./schema/beans"
xmlns:xsi="http://www./2001/XMLSchema-instance"
xmlns:context="http://www./schema/context"
xmlns:aop="http://www./schema/aop"
xsi:schemaLocation="http://www./schema/beans
http://www./schema/beans/spring-beans-2.5.xsd
http://www./schema/context
http://www./schema/context/spring-context-2.5.xsd
http://www./schema/aop
http://www./schema/aop/spring-aop-2.5.xsd">
2.書(shū)寫(xiě)記錄日志的類(lèi):
package com.yjck.fm.util;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
public class LogUtil {
Logger logger = Logger.getLogger(LogUtil.class);
public void logAll(JoinPoint jp){
String methodName = jp.getSignature().getName();
logger.info(jp.getTarget().getClass().getName()+"---"+methodName);
Object[] args = jp.getArgs();
for(int i=0;i<args.length;i++){
logger.info("params["+i+"]:"+ args[i].toString());
}
}
}
上面這段代碼實(shí)現(xiàn)了輸出要調(diào)用的類(lèi)名,方法已經(jīng)參數(shù)。
3.配置xml文件:
<!-- 日志管理aop -->
<!-- 強(qiáng)制使用cglib代理,如果不設(shè)置,將默認(rèn)使用jdk的代理,但是jdk的代理是基于接口的 -->
<aop:config proxy-target-class="true" />
<aop:config>
<aop:aspect id="myAspect" ref="logUtil">
<aop:pointcut expression="execution(* com.yjck.fm.*.action.*.*(..))" id="logPointCut"/>
<aop:before method="logAll" pointcut-ref="logPointCut"/>
</aop:aspect>
</aop:config>
<!-- 日志記錄類(lèi) -->
<bean id="logUtil" class="com.yjck.fm.util.LogUtil"></bean>
注意:我這里配置的是攔截所有action的所有方法,可以根據(jù)自己的情況配置,同時(shí)也只配了一個(gè)”前置通知“before,如果要需要還可以配置其他的。
OK,到此,實(shí)現(xiàn)已經(jīng)完畢了!