1. 程式人生 > >Spring的AOP實現日誌管理操作

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在哪裡使用,如何使用, 如何傳遞引數,如何獲取現在正在執行的操作名稱。

感謝對我的部落格的關注。我也希望幫助更多的人,少走一些彎路,以後還會出一些很實際的問題解決方案,或者學習教程。