Spring的AOP實現日誌管理操作
關於這個aop,有時候面試官會經常問道這類的問題,比如說,你使用aop來實現日誌管理,那麼你的aop實現的時候,怎麼來獲取到你要的引數,如何還有你現在執行的操作命令?
今天就對這個問題進行測試解答。
文章宣告:此文章僅供測試,如有功能不全請諒解。
讀者最好對通知類,切入點、連線點自己有一個瞭解,否則會理解上比較麻煩。
在文章後面我會對這裡面的原理流程給大家詳細解釋,希望讓更多的人懂。
案例基於SSH進行的測試,但是aop的使用,在哪裡使用都是一樣的。SSH的部署不會的話可以參照:SSH整合
1、在po類建立我們的實體類和hibernate.hbm.xml
這個在SSH整合已經介紹了,就不多少了。
2、業務層我們就只使用find()和add()兩個功能,用來我們的測試。
public interface UserService {
public void add(User user);
public List<User> find();}
3、現在我們來寫我們的action類
package com.mepapa.action;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.mepapa.po.User;
import com.mepapa.service.UserService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ModelDriven;
@Controller("userAction")
@Scope("prototype")
public class UserAction implements ModelDriven<User>{
private User user;
@Resource(name="userService")
private UserService userService;
//切入點
public String add(){
userService.add(user);
return "list";
}
//切入點
public String list(){
List<User> find = userService.find();
ActionContext.getContext().put("list", find);
return "listUI";
}
//切入點
public String addUser(){
return "addUI";
}
@Override
public User getModel() {
if(user == null)
user = new User();
return user;
}
}
4、再就是我們進行切面變成的通知類
package com.mepapa.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class LogAop {
//切入點的路徑
@Pointcut(value="execution(* com.mepapa.service.UserServiceImpl.*(..))")
public void method(){}
//通知
@Before("LogAop.method()")
public void startLog(JoinPoint jp){//這就是獲取我們的引數了
//獲取引數
Object[] args = jp.getArgs();
for (Object object : args) {
System.out.println("日誌--"+object);
}
//jp.getSignature().getName()獲取相應的方法名
//通過方法名的不同執行相應的操作,這裡就不具體執行了
String name = null;
if(args!=null ) name = args[0].toString();
System.out.println("方法名"+jp.getSignature().getName()+"人員資訊"+name);
}
@AfterReturning("LogAop.method()")
public void endLog(){
System.out.println("儲存日誌成功");
}
@AfterThrowing("LogAop.method()")
public void errorLog(){
System.out.println("新增使用者失敗");
}
}
5、在通知類我們可以執行我們的日誌儲存啊,人員,操作我們都可以獲取到了。
希望大家能得到一些啟發。
流程:前臺資料我們進行提交資料,我們簡單的舉一個例子,就比如說我們上面這個例子的add()操作。
前臺註冊,將使用者名稱和密碼(這裡註冊的資料就不說了,以使用者名稱和密碼兩個作為講解)正確提交到了後臺,後臺的action方法add()這裡是切入點,
我們的通知類在這裡有進行攔截,並通過我們的引數pointcut(在通知類的註解)進行攔截,獲取到了進入add()方法的引數名,及裡面的資料,再通知類裡面執行我們的日誌管理,當讓也可以在執行完add()的方法後,再執行日誌操作,具體看你的需求。
@afterReturnning 是正確返回數值要進行的操作
@afterThrowing是異常要進行的操作
本篇文章,主要是幫助大家瞭解AOP,更加深入的明白AOP在哪裡使用,如何使用, 如何傳遞引數,如何獲取現在正在執行的操作名稱。
感謝對我的部落格的關注。我也希望幫助更多的人,少走一些彎路,以後還會出一些很實際的問題解決方案,或者學習教程。