原来AOP,才是真爱

                                                         面试遇梗

一次面试,面试官问:“你能说说什么是AOP吗?”

“AOP就是面向切面编程”,然后没有了,好简短的描述,自己都觉得少。如果面向对象是纵向的,那么面向切面就是横向的,心里想着切豆腐的模样,可是并没有说出,自己对AOP的理解还存在理论上,不敢多说,言多必失呀。

“AOP都能做些什么?”,面试官的目光带着些期盼,希望能够回答得多一些。

“记录日志呀”,还是,还是那么一句话。这一句话也是道听途说的,用AOP来做日志,Spring的书看过了好几遍,也没有记住什么精华,到底是用的少。天天写代码,都写的什么玩意,没长脑子就写了吧,自己也忍不住骂了自己几句。

越回答越精简,面试官都不知再如何开口问起,比挤牙膏难多了。面试就这样在尴尬中戛然而止。别人面试都那么久,自己面试保证是最快的一个,半个小时都没有,哎。

                                                             反  思

翻翻资料,Spring框架发展至今也有六七个年头了,作为Spring的两大特性之一,AOP面向切面编程思想,为什么一直是个亮点,为什么会引起那么多开发人员的狂爱呢。

最近在使用SpringCloud框架,想做个日志,什么样的日志呢,就是对用户的一举一动做日志,某年某月某某某做了某某操作,当然,这个可不能对用户说,这些是为后期大数据统计用的。想想以前做项目,要么没有日志,要么是在业务逻辑里手动加log,那么多处理业务逻辑的类,加起来那个辛苦、那个痛苦,回忆起来,老泪纵横呀。

为了避免这个痛苦,一定要痛改前非,狠下心来,静静地研究AOP,有什么难的呢,别人能用的,自己也能用。不用则以,一用不得了,啊,啊,啊,果真是真爱。

                                                          一用钟情

先分析一下,自己的需求,需要在每个Controller层,增加一次注解,用来做日志,然后在每个方法调用时,产生日志。是的,需求就是这么简单,已经拆解过了,只需三步。第一步,需要一个添加日志的注解;第二步,往需要的方法上增加注解;第三步,监控每个方法,通过注解获取方法,并生成日志记录到数据库保存。

第一步,注解类定义

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* 日志注解类

* @author 程就人生

* Target 目标为方法

*

*

*/

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface LogAnnotation {

// 请求名称

String controllerName() default "";

// 模块名称

String module() default "";

// 请求方式 GET、POST、PUT、DELETE

String actionType() default "";

}

第二步,执行方法上增加注解

import org.springframework.http.HttpHeaders;

import org.springframework.http.HttpStatus;

import org.springframework.http.ResponseEntity;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RestController;

import com.example.demo.annotation.LogAnnotation;

/**

* 测试类

* @author 程就人生

*

*/

@RestController

public class TestController {

@GetMapping("/test/{id}")

@LogAnnotation(controllerName="测试Controller", module="测试模块", actionType="GET")

public ResponseEntity<String> test(@PathVariable int id){

String str = "Hello world~!";

//定义头部消息

HttpHeaders headers = new HttpHeaders();

if(id !=1 ){

throw new RuntimeException("aaaaaa");

}else{

headers.add("success", "true");

}

//返回到前端

return new ResponseEntity<>(str, headers, HttpStatus.OK);

}

}

第三步,监控方法类

/**

* Log注入,记录日志

* @author 程就人生

*

*/

@Aspect

@Component

public class LogAop {

    /** * 连接点拦截 * @param joinPoint */

    @Before("execution(* com.example.demo.controller..*(..))")

    public void setLog(JoinPoint joinPoint) {

    //获取当前登录用户

    HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();

    User user = (User) request.getSession().getAttribute("user");

    //获取被执行的方法

    MethodSignature signature = (MethodSignature) joinPoint.getSignature();

        Method method = signature.getMethod();

        //获取注解中的名称

        LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class);

    if(logAnnotation!=null){

    //记录日志

    System.out.println("请求模块" + logAnnotation.module());

    System.out.println("Controller名称:" + logAnnotation.controllerName());

    System.out.println("请求类型:" + logAnnotation.actionType());

    //用户信息

    if(user != null){

    //System.out.println(user.getUserName());

    } 

    }   

    }

}

最后执行以下http://localhost:8701/test/1,可以看到控制台有输出:


AOP注入输出

今天,终于可以用AOP面向切面编程的思想来做日志记录了,内心里窃喜,忍不住雀跃了一下,AOP太好用了,AOP,爱死你了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容