Spring 使用Aop 做切面日志,和权限。





第一步:  模拟用户权限

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码可剥落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值