Spring 使用Aop 做切面日誌,和許可權。

百度google培訓的學生發表於2013-04-11





第一步:  模擬使用者許可權

package com.inter;

public class Helper {

    public static String role = "AAAA";

}


第二步:  業務方法介面 

package com.inter;

public interface IDao {


 public void addUser();

 public void delUser();

    public void updateUser();

    public void queryUserInf();

}



第三步: 業務實現類

package com.inter.dao;

import com.inter.IDao;

public class UserDao implements IDao {

    /* (non-Javadoc)
     * @see com.inter.dao.IDao#addUser()
     */
    public void addUser() {
        System.out.println("增加使用者.....");
    }

    /* (non-Javadoc)
     * @see com.inter.dao.IDao#delUser()
     */
    public void delUser() {
        System.out.println("刪除使用者.....");
    }

    /* (non-Javadoc)
     * @see com.inter.dao.IDao#updateUser()
     */
    public void updateUser() {
        System.out.println("修改使用者...");
    }

    /* (non-Javadoc)
     * @see com.inter.dao.IDao#queryUserInf()
     */
    public void queryUserInf() {
        System.out.println("查詢使用者");
    }

}




第四步:AOP執行方法之前 執行:前置方法

package com.interceptor;

import java.lang.reflect.Method;

import org.apache.log4j.helpers.Loader;
import org.springframework.aop.AfterReturningAdvice;

import com.log.Loger;

public  class AfterReturingAdvice implements AfterReturningAdvice {
    
    @Override
    public void afterReturning(Object returnValue, Method method,
            Object[] args, Object target) throws Throwable {
            
        System.out.println("進入了前置通知哦");
            Loger log= Loger.getLoger();
            log.loger.info("這裡進入了"+method.getName()+"方法");
            log.WriteINFOLog("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
        
        
    }

}


第五步: 環繞方法:   在執行方法時

package com.interceptor;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

import com.inter.Helper;
import com.log.Loger;

public  class AroundAdvice implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation arg0) throws Throwable {
        Object obj = null;
        if (Helper.role.equals("admin")) {
            System.out.println("許可權足夠,繼續執行");
            //Loger.log.debug("許可權足夠,繼續執行");
            obj = arg0.proceed();
        } else {
            Loger.getLoger().WriteWARNLog("沒有許可權對此進行操作");
            try{
            int i=20/0;
            }catch (Exception e) {
                Loger.getLoger().loger.error("AroundAdvice.java  23行"+e.getMessage());
            }
            
        }
        return obj;
    }

}



第六步;執行方法後  後置方法

package com.interceptor;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

import com.log.Loger;

public  class BeforeAdvice implements MethodBeforeAdvice {

    @Override
    public void before(Method method, Object[] args, Object target)
            throws Throwable {
        System.out.println("進入了後置通知哦");
          //Loger.log.debug("進入了後置通知哦");
    }

}




第七步:   LOG4j  日誌類

package com.log;

import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;



//單列模式  
public class Loger {

    
    
    public  Logger loger=null;
    private static Loger  log;
    private Loger()
    {
        
        loger =Logger.getLogger(this.getClass());
        PropertyConfigurator.configure("C:\\Users\\jsontwo\\Workspaces\\MyEclipse 8.5\\AopLoger\\resources\\log.properties");
    }
    
    
    //記錄自己的日誌
    public   void   WriteINFOLog(String logMessage)
    {
        loger.info(logMessage);
    }
    public   void   WriteDEBUGLog(String logMessage)
    {
        loger.info(logMessage);
    }
    public   void   WriteERRORLog(String logMessage)
    {
        loger.info(logMessage);
    }
    public   void   WriteWARNLog(String logMessage)
    {
        loger.info(logMessage);
    }
    
    public static Loger  getLoger()
    {
        if(log!=null)
            return log;
        else
            return new Loger();
    }
}






第八步:測試方法:

package com.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.inter.IDao;

public class MyTset {

    public static void main(String[] args) {
        
        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        //從spring的代理類中得到UserDao
        IDao dao = (IDao)ctx.getBean("proxyBean");
        dao.delUser();
    }

}
















Spring  配置檔案:

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
    <!-- 定義bean -->
    <bean id="userDao" class="com.inter.dao.UserDao"></bean>
    <bean id="productDao" class="com.inter.dao.ProductDao"></bean>
    
    <!-- 定義攔截器 -->
    <bean id="beforeAdvice" class="com.interceptor.BeforeAdvice"></bean>
    <bean id="afterAdvice" class="com.interceptor.AfterReturingAdvice"></bean>
    <bean id="aroundAdvice" class="com.interceptor.AroundAdvice"></bean>
    
    <!-- 使用正規表示式的包裝類去包裝攔截器 -->
    <bean id="aroundAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="advice">
            <ref bean="aroundAdvice"/>
        </property>
        <property name="patterns">
            <list>
                <value>.*.*</value>
            </list>
        </property>
    </bean>
    
    <!-- 定義代理類使用攔截器 -->
    <bean id="proxyBean" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 配置使用的介面,沒有可以不寫 -->
        <property name="interfaces">
            <list>
                <value>com.inter.IDao</value>
            </list>
        </property>
         <property name="interceptorNames">
             <list>
                 <value>beforeAdvice</value>
                 <value>afterAdvice</value>
                 <value>aroundAdvisor</value>
             </list>
         </property>
         <property name="target">
             <ref bean="userDao"/>
         </property>
    </bean>
</beans>

相關文章