springAOP日志

springAOP日志配置具体步骤

一,在pom.xml文件中添加以下配置

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spring.version}</version>
    </dependency>


    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.6.12</version>
    </dependency>

二,在resources文件夹下新建一个springaop-config.xml自定义配置文件,配置如下:

<?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:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
        <!--把业务类交给spring管理-->
    <bean name="deptService" class="com.aaa.aop.service.DeptServiceImpl"></bean>
    <bean name="userService" class="com.aaa.aop.service.UserServiceImpl"></bean>
    <!--把日志记录类交给spring管理-->
    <bean name="logUtil" class="com.aaa.aop.util.LogUtil"></bean>
    <!--aop配置-->
    <aop:config>
        <!--切入点设置 int代表业务类方法的返回值 *通配所有方法  ..代表方法参数0个或多个-->
        <aop:pointcut id="pointcutOne" expression="execution(int *(..))"></aop:pointcut>
        <!--切面配置-->
        <aop:aspect ref="logUtil">
            <!--通知类型 后置通知-->
            <!--<aop:after-returning method="saveLogAfterReturning" pointcut-ref="pointcutOne"></aop:after-returning>-->
            <!--前置通知-->
            <!--<aop:before method="saveLogBefore" pointcut-ref="pointcutOne"></aop:before>-->
            <!--异常通知-->
            <!--<aop:after-throwing method="exceptionAfterThrowing" throwing="ex" pointcut-ref="pointcutOne"></aop:after-throwing>-->
            <!--最终通知 -->
            <!--<aop:after method="executeAfter" pointcut-ref="pointcutOne"></aop:after>-->
            <!--环绕通知-->
            <aop:around method="executeAround" pointcut-ref="pointcutOne"></aop:around>
        </aop:aspect>
    </aop:config>
</beans>

  三,写一个员工接口和部门接口并写两个实现类实现这两个接口

package com.aaa.aop.service;
public interface UserService {
    /**
     * 员工添加
     * @return
     */
    int add();
    /**
     * 员工修改
     * @return
     */
    int update();
    /**
     * 员工删除
     * @return
     */
    int delete();
}

  

public class UserServiceImpl implements UserService{


    @Override
    public int add() {
        System.out.println("模拟员工添加-----");
        return 0;
    }


    @Override
    public int update() {
        System.out.println("模拟员工更新-----");
        return 0;
    }


    @Override
    public int delete() {
        System.out.println("模拟员工删除-----");
        return 0;
    }
}

  四,在util包中写一个LogUtil类

public class LogUtil {
    /**
     * 通用日志记录方法(后置通知)
     */
    public void saveLogAfterReturning(JoinPoint joinPoint){
        String jpName = joinPoint.getSignature().getName();
        System.out.println("在执行"+jpName+"方法后,记录了日志---");
    }


    /**
     * 前置通知
     * @param joinPoint
     */
    public void saveLogBefore(JoinPoint joinPoint){
        //获取连接点的方法名称
        String jpName = joinPoint.getSignature().getName();
        System.out.println("在执行"+jpName+"方法之前,记录了日志---");
    }


    /**
     * 异常通知
     * @param joinPoint
     * @param ex
     */
    public void exceptionAfterThrowing(JoinPoint joinPoint,Exception ex){
        String jpName = joinPoint.getSignature().getName();
        System.out.println("在执行"+jpName+"方法过程中出现了异常,异常名称" +
                "为"+ex.getClass().getName()+",异常描述:"+ex.getMessage());
    }


    /**
     * 最终通知
     */
    public void executeAfter(){
        System.out.println("无论有没有异常都会执行的方法---");
    }


    /**
     * 环绕通知
     * @param proceedingJoinPoint
     * @return
     */
    public Object executeAround(ProceedingJoinPoint proceedingJoinPoint){
        System.out.println(System.currentTimeMillis()+"执行业务之前,处理业务1-------");
        Object o = null;
        try {
            System.out.println("执行"+proceedingJoinPoint.getSignature().getName()+"方法------");
            //调用业务方法
            o = proceedingJoinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println(System.currentTimeMillis()+"执行业务之后,处理业务2-------");
        return o;
    }
}

  五,最后写一个AOP测试类

public class AopTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("springaop-config.xml");
        DeptService deptService = (DeptService) applicationContext.getBean("deptService");
        deptService.add();
        deptService.update();
        deptService.delete();
    }
}

  

上一篇:Spring AOP


下一篇:spring注解-aop