Spring的AOP快速实现通用日志打印

Posted 陈彦斌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring的AOP快速实现通用日志打印相关的知识,希望对你有一定的参考价值。

需求分析

  针对VideoService接口实现日志打印

三个核心包

  • spring-aop:AOP核心功能,例如代理工厂
  • aspectjweaver:简单理解,支持切入点表达式
  • aspectjrt:简单理解,支持aop相关注解

定义Service接口和实现类

VideoService.java

package net.cybclass.sp.servicce;

import net.cybclass.sp.domain.Video;

public interface VideoService {
    int save(Video video);
    Video findById(int id);
}

VideoServiceImpl.java

package net.cybclass.sp.servicce;

import net.cybclass.sp.domain.Video;

public class VideoServiceImpl implements VideoService{
    public int save(Video video) {
        System.out.println("保存Video");
        return 0;
    }

    public Video findById(int id) {
        System.out.println("根据id找视频");
        return new Video();
    }
}

定义横切关注点

   <bean id="timeHandler" class="net.cybclass.sp.aop.TimeHandler"></bean>
    <bean id="videoService" class="net.cybclass.sp.servicce.VideoServiceImpl"></bean>
    <!-- aop的配置 -->
    <aop:config>
        <!--切面-->
        <aop:aspect id="timeAspect" ref="timeHandler">
            <!--连接点-->
            <aop:pointcut id="allMethodLogPointCut" expression="execution(* net.cybclass.sp.servicce.VideoService.*(..))"/>
            <!--前置通知-->
            <aop:before method="printBefore" pointcut-ref="allMethodLogPointCut"></aop:before>
            <!--后置通知-->
            <aop:after method="printBefore" pointcut-ref="allMethodLogPointCut"></aop:after>
        </aop:aspect>
    </aop:config>

完整版applicationContext.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">
    <bean id="timeHandler" class="net.cybclass.sp.aop.TimeHandler"></bean>
    <bean id="videoService" class="net.cybclass.sp.servicce.VideoServiceImpl"></bean>
    <!-- aop的配置 -->
    <aop:config>
        <!--切面-->
        <aop:aspect id="timeAspect" ref="timeHandler">
            <!--连接点-->
            <aop:pointcut id="allMethodLogPointCut" expression="execution(* net.cybclass.sp.servicce.VideoService.*(..))"/>
            <!--前置通知-->
            <aop:before method="printBefore" pointcut-ref="allMethodLogPointCut"></aop:before>
            <!--后置通知-->
            <aop:after method="printBefore" pointcut-ref="allMethodLogPointCut"></aop:after>
        </aop:aspect>
    </aop:config>
</beans>

引入相关包

       <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.5</version>
        </dependency>

完整pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>net.cybcclass</groupId>
    <artifactId>cyb_spring</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.5</version>
        </dependency>
    </dependencies>
</project>

演示

 

以上是关于Spring的AOP快速实现通用日志打印的主要内容,如果未能解决你的问题,请参考以下文章

化繁就简,如何利用Spring AOP快速实现系统日志

使用Spring AOP实现业务依赖解耦

Spring Aop实现方式(注解和Xml)

Spring Aop实现方式(注解和Xml)

JAVA之AOP

Spring-AOP