spring aop实现日志记录

准备工作:

    本demo使用的是配置文件的方式,没有用注解

    需要的jar包有 spring核心包,aspectj,aspectjweaver,spring-aop

代码:

    1.待切入的类

package com.ssm.controller;

import org.springframework.stereotype.Controller;

@Controller("helloController")
public class HelloController {
    public String foo(String a){
        System.out.println("----"+a+"----");
        return a;
    }
}

2.切面类

package com.ssm.utils;

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 java.util.Arrays;

public class LogAspect {
    public void begin(JoinPoint jp){
        System.out.println("###############################################");
        System.out.println("开始执行"+jp.getTarget()+"类的"+jp.getSignature().getName()+"方法");
        System.out.println("传入参数为:"+ Arrays.toString(jp.getArgs()));
    }
    public void end(JoinPoint jp,Object rvt){
        System.out.println(jp.getTarget()+"类的"+jp.getSignature().getName()+"方法执行成功,返回值为:"+rvt);
    }
}
3. spring配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
       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-4.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.0.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <!-- 自动扫描 -->
    <context:component-scan base-package="com.ssm.controller"/>
    <!-- Spring AOP-->
    <bean id="logAspect" class="com.ssm.utils.LogAspect"></bean>
    <aop:config>
        <aop:aspect id="myaop" ref="logAspect" order="2">
            <aop:before method="begin" pointcut="execution(* com.ssm.controller.*.*(..))"/>
            <aop:after-returning method="end" pointcut="execution(* com.ssm.controller.*.*(..))" returning="rvt"/>
        </aop:aspect>
    </aop:config>
</beans>

4.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <display-name>Archetype Created Web Application</display-name>

  <welcome-file-list>
    <welcome-file>/index.jsp</welcome-file>
  </welcome-file-list>

  <!-- 加载spring bean -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/spring.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

</web-app>

5.测试类

package test;

import com.ssm.controller.HelloController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class a {
    public static void main(String[] args){
        ApplicationContext ctx= new ClassPathXmlApplicationContext("spring/spring.xml");
//        for(String e:ctx.getBeanDefinitionNames())
//            System.out.println(e);
        HelloController h= (HelloController) ctx.getBean("helloController");
        h.foo("asdasd");
    }
}

执行结果:


扫描二维码关注公众号,回复: 2981186 查看本文章


遇到的问题:

    最开始的时候我在切面类还写了一个查看被切入方法是否抛出异常的函数,在本demo种就是检测HelloController的foo()方法会抛出何种异常,然而我的foo()方法本来就不会抛出异常,所以导致我的程序跑不起来。原来的切面类是下面这样写的

package com.ssm.utils;


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 java.util.Arrays;

@Aspect
public class LogAspect {
    @Before("execution(* com.ssm.serviceImpl.*.*(..))")
    public void begin(JoinPoint jp){
        System.out.println("###############################################");
        System.out.println("开始执行"+jp.getTarget()+"类的"+jp.getSignature().getName()+"方法");
        System.out.println("传入参数为:"+ Arrays.toString(jp.getArgs()));
    }
    @AfterReturning(pointcut = "execution(* com.ssm.serviceImpl..*.*(..))",returning = "rvt")
    public void end(JoinPoint jp,Object rvt){
        System.out.println(jp.getTarget()+"类的"+jp.getSignature().getName()+"方法执行成功,返回值为:"+rvt);
    }
    @AfterThrowing(throwing = "ex",pointcut = "execution(* com.ssm.serviceImpl.*.*(..))")
    public void error(Throwable ex,JoinPoint jp){
        System.out.println(jp.getTarget()+"类的"+jp.getSignature().getName()+"方法抛出异常"+ex);
    }//针对有抛出异常的方法才行
}



猜你喜欢

转载自blog.csdn.net/m0_37224390/article/details/79619482