当前位置: 首页 > news >正文

Spring AOP 实现业务日志记录 (注解)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

用户管理业务逻辑接口(UserManagerApplogic.java )

Java代码  

package com.iteye.applogic;  
  
public interface UserManagerApplogic {  
    public void addUser(String name);  
}

 

2. 用户管理业务逻辑实现类(UserManagerApplogicImpl.java)

Java代码  收藏代码

package com.iteye.applogic.impl;  
  
import org.springframework.stereotype.Component;  
  
import com.iteye.applogic.UserManagerApplogic;  
import com.iteye.annotation.BussAnnotation;  
@Component("userManager")   
public class UserManagerApplogicImpl implements UserManagerApplogic {  
  
    @BussAnnotation(moduleName="人员管理",option="添加用户")  
    public void addUser(String name) {  
        System.out.println("add a User!Name is "+name);  
    }  
}

 

3.业务注释类(BusAnnotation.java)

Java代码  收藏代码

package com.iteye.annotation;  
   
import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  
  
@Retention(RetentionPolicy.RUNTIME)  
@Target ({ElementType.METHOD})  
public @interface  BussAnnotation {  
    //模块名  
    String moduleName();  
    //操作内容  
    String option();  
}

 

(1)RetentionPolicy(保留策略)是一个enum类型,共有三个值,分别是SOURCE,CLASS 和 RUNTIME。

SOURCE 代表的是这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件里面。 

ClASS的 代 表的是这个Annotation类型的信息保留在程序源码里,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这一些信息加载到虚拟 机(JVM)中去.注意一下,当你没有设定一个Annotation类型的Retention值时,系统默认值是CLASS。

RUNTIME代表的是表示在源码、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去的。

 

(2)ElementType

@Target里面的ElementType是用来指定Annotation类型可以用在哪一些元素上的.

TYPE(类型)是指可以用在Class,Interface,Enum和Annotation类型上. 

FIELD(属性)

METHOD(方法)

PARAMETER(参数)

CONSTRUCTOR(构造函数)

LOCAL_VARIABLE(局部变量)

ANNOTATION_TYPE

PACKAGE(包)

 

(3)@Documented

@Documented的目的就是让这一个Annotation类型的信息能够显示在javaAPI说明文档上;没有添加的话,使用javadoc生成API文档的时候就会找不到这一个类型生成的信息。

 

(4)@Inherited

如果需要把Annotation的数据继承给子类,那么就会用到@Inherited这一个Annotation类型。

 

 4.切面类(LogInterceptor.java)

Java代码  

 

package com.iteye.aop;  
  
import org.aspectj.lang.ProceedingJoinPoint;  
import org.aspectj.lang.annotation.Around;  
import org.aspectj.lang.annotation.Aspect;  
import org.aspectj.lang.annotation.Pointcut;  
import org.springframework.stereotype.Component;  
  
import com.iteye.annotation.BussAnnotation;  
  
@Aspect  
@Component  
public class LogInterceptor {  
  
    @Pointcut("execution(public * com.iteye..*.addUser(..))")  
    public void aApplogic() {}  
  
    @Around(value = "aApplogic() && @annotation(annotation) &&args(object,..) ", argNames = "annotation,object")  
    public Object interceptorApplogic(ProceedingJoinPoint pj,  
            BussAnnotation annotation, Object object) throws Throwable {  
        System.out.println("moduleName:"+annotation.moduleName());  
        System.out.println("option:"+annotation.option());  
        pj.proceed();  
        return object;  
    }  
}

5.配置文件(applicationContext-aop.xml)

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:context="http://www.springframework.org/schema/context"  
       xmlns:aop="http://www.springframework.org/schema/aop"  
       xsi:schemaLocation="http://www.springframework.org/schema/beans  
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
           http://www.springframework.org/schema/context  
           http://www.springframework.org/schema/context/spring-context-2.5.xsd  
           http://www.springframework.org/schema/aop  
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  
    <context:annotation-config />  
    <context:component-scan base-package="com.iteye"/>  
    <aop:aspectj-autoproxy />  
</beans>

 

6.测试类( test.java (Junit) )

Java代码  

import org.junit.Test;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
import com.iteye.applogic.UserManagerApplogic;  
  
public class test {  
    @Test  
    public void test1()  
    {  
        ClassPathXmlApplicationContext ctx =   
                new ClassPathXmlApplicationContext("applicationContext-aop.xml");  
        UserManagerApplogic userManager = (UserManagerApplogic) ctx.getBean("userManager");  
        userManager.addUser("-li.bb-");  
        ctx.destroy();  
    }  
}


转载于:https://my.oschina.net/yangzg/blog/343945

相关文章:

  • 必须知道的SQL编写技巧,多条件查询不拼字符串的写法
  • Mysql高级之权限检查原理
  • 我见过的 Objective-C, 讲的最通俗易懂的入门教程....
  • 数据结构概述
  • 关于与产品相关的品牌、国藉等与产品质量的一些思考(转)
  • centOS下安装JDK
  • 网络安全系列之四十七 在IIS6中申请并安装证书
  • 使用jQuery.FileUpload和Backload自定义控制器上传多个文件
  • 从零开始iOS8编程【HelloWorld】
  • 微软职位内部推荐-SDEII for Windows Phone Apps
  • 关于PCB 3D 模型的快速导入方法
  • FreeSWITCH在呼叫失败的情况下播放语音提示
  • STL容器的使用
  • Mysql索引类型 Normal,Unique,Full Text
  • Linux定时任务没有执行的总结
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 0x05 Python数据分析,Anaconda八斩刀
  • Asm.js的简单介绍
  • chrome扩展demo1-小时钟
  • django开发-定时任务的使用
  • ES6 学习笔记(一)let,const和解构赋值
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • JavaScript设计模式之工厂模式
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • MYSQL 的 IF 函数
  • React系列之 Redux 架构模式
  • spark本地环境的搭建到运行第一个spark程序
  • 从零搭建Koa2 Server
  • 动态魔术使用DBMS_SQL
  • 简单数学运算程序(不定期更新)
  • 前端技术周刊 2019-02-11 Serverless
  • 使用putty远程连接linux
  • NLPIR智能语义技术让大数据挖掘更简单
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​Java并发新构件之Exchanger
  • ​secrets --- 生成管理密码的安全随机数​
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • # 计算机视觉入门
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (4)(4.6) Triducer
  • (第一天)包装对象、作用域、创建对象
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (剑指Offer)面试题34:丑数
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (七)Knockout 创建自定义绑定
  • (强烈推荐)移动端音视频从零到上手(下)
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (算法设计与分析)第一章算法概述-习题
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转载)深入super,看Python如何解决钻石继承难题