基於AOP的日誌實現!

 初識Spring的AOP,在項目中用到了其日誌功能: AOP的強大是大家所共識的,

        事務的處理,日誌的操作,權限的分配...有了這麼多已經足夠了,已經可以讓他在所有的框架面前獨樹一幟,原來需要那麼複雜的處理邏輯,現在有了AOP 如此的簡單化,確實能看出其實力

        1:建立日誌表

        create table     loginfo(
    id int auto_increment primary key ,
    author varchar(20),
    marktime varchar(50),
    action varchar(50),
    isok varchar(20)
);

        2:在service層中建立對錶loginfo的操作邏輯處理類LoginfoServiceImpl:

        package com.viita.service;

import java.util.List;


import com.viita.dao.LoginfoDAO;
import com.viita.entity.Loginfo;

public class LoginfoServiceImpl implements ILoginfoService{

    private LoginfoDAO dao;
   
    public void delete(Loginfo info) {
        // TODO Auto-generated method stub
        dao.delete(info);
    }

    public List findAll() {
        // TODO Auto-generated method stub
        return dao.findAll();
    }

    public Loginfo findById(int id) {
        // TODO Auto-generated method stub
        return dao.findById(id);
    }

    public void save(Loginfo info) {
        // TODO Auto-generated method stub
        dao.save(info);
    }

    public void setDao(LoginfoDAO dao) {
        this.dao = dao;
    }

}

        3:接着建立代理類 LogAop

        package com.viita.common;

import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.aspectj.lang.ProceedingJoinPoint;

import com.viita.entity.Loginfo;
import com.viita.service.LoginfoServiceImpl;

public class LogAop {
    private LoginfoServiceImpl service;

    public void setService(LoginfoServiceImpl service) {
        this.service = service;
    }
   
    public Object write(ProceedingJoinPoint p) throws Throwable
    {
        String userName = UserLocal.getUser();
        Loginfo log = new Loginfo();
        if(userName!=null)
        {
            log.setAuthor(userName);
        }else
        {
            log.setAuthor("");
        }
        log.setMarktime(getCurrentTime());
       
        Method method = null;
       
        Method[] methods = p.getTarget().getClass().getDeclaredMethods();
        for (Method method2 : methods) {
            if(p.getSignature().getName().equals(method2.getName()))
            {
                method = method2;
                break;
            }
        }
        LogDesc desc = method.getAnnotation(LogDesc.class);
        if(desc!=null)
            log.setAction(desc.actionName());
        Object o = null;
        try
        {
            o = p.proceed();
            log.setIsok("成功!");
        }catch(Exception e)
        {
            log.setIsok("失敗");
            throw new Throwable(e.toString());
        }
        if(log.getAction()!=null)
            service.save(log);
        return o;
    }
   
    public static String getCurrentTime()
    {
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH小時mm分ss秒");
        return sdf.format(d);
    }
}
                還有其中調用的UserLocal,用於獲取用戶名:

        

package com.viita.common;

public class UserLocal {
    public static ThreadLocal user = new ThreadLocal();
   
    public static void setUser(String userName)
    {
        user.set(userName);
    }
   
    public static String getUser()
    {
        return (String)user.get();
    }
}
 

        建立腳註類LogDesc:

package com.viita.common;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)

public @interface LogDesc {
    String actionName();
}

        去登陸的action中獲取用戶名     UserLocal.setUser(loginForm.getInfo().getUserName());

        接着在 applicationContext.xml 中對其關係進行描述:

        先換掉xml的頭文件:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
     http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
    http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

然後在其中描述代理類與被代理者之間的關係

        <bean id="LogAop" class="com.viita.common.LogAop">
        <property name="service">
            <ref bean="LoginfoServiceImpl"/>
        </property>
    </bean>
   
   
<aop:config>
        <aop:aspect ref="LogAop">
            <aop:pointcut id="mp" expression="execution(* com.viita.service.*.*(..))"/>
            <aop:around pointcut-ref="mp" method="write" />
        </aop:aspect>
    </aop:config>

最後就可以在service中對需要加入日誌的方法前加入腳註: @LogDesc(actionName="登陸")

至此 AOP的日誌功能就完成了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章