{"id":900,"date":"2023-03-11T06:58:58","date_gmt":"2023-03-10T22:58:58","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=900"},"modified":"2023-04-29T15:53:31","modified_gmt":"2023-04-29T07:53:31","slug":"aspect-implementation-in-spring-boot-and-using-logging-as-an-example","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/11\/aspect-implementation-in-spring-boot-and-using-logging-as-an-example\/","title":{"rendered":"Spring Boot\u4e2dAspect\u5b9e\u73b0\u5207\u9762\uff08\u4ee5\u8bb0\u5f55\u65e5\u5fd7\u4e3a\u4f8b\uff09"},"content":{"rendered":"<p>\u5207\u9762Aspect\u662fSpring\u7684\u4e00\u5927\u4f18\u52bf\u3002\u9762\u5411\u5207\u9762\u7f16\u7a0b\u5f80\u5f80\u8ba9\u6211\u4eec\u7684\u5f00\u53d1\u66f4\u52a0\u4f4e\u8026\u5408\uff0c\u4e5f\u5927\u5927\u51cf\u5c11\u4e86\u4ee3\u7801\u91cf\uff0c\u540c\u65f6\u8ba9\u6211\u4eec\u66f4\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u6a21\u5757\u7684\u5f00\u53d1\uff0c\u628a\u90a3\u4e9b\u4e0e\u4e1a\u52a1\u65e0\u5173\u7684\u4e1c\u897f\u63d0\u53d6\u51fa\u53bb\uff0c\u4fbf\u4e8e\u540e\u671f\u7684\u7ef4\u62a4\u548c\u8fed\u4ee3\u3002<\/p>\n<h2>Maven\u4f9d\u8d56<\/h2>\n<p><!-- more --><\/p>\n<pre><code class=\"language-xml\">&lt;dependency&gt;\n    &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-boot-starter-aop&lt;\/artifactId&gt;\n&lt;\/dependency&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;com.alibaba&lt;\/groupId&gt;\n    &lt;artifactId&gt;fastjson&lt;\/artifactId&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n<h2>\u65e5\u5fd7\u5b9e\u4f53\u7c7b\u548cService<\/h2>\n<pre><code class=\"language-java\">@Data\npublic class SysLog {\n    private String className;\n\n    private String methodName;\n\n    private String[] methodParams;\n\n    private Object[] paramValues;\n\n    private Long execTime;\n\n    private String remark;\n\n    private String createDate;\n}<\/code><\/pre>\n<pre><code class=\"language-java\">@Slf4j\n@Service\npublic class SysLogService {\n\n    public void save(SysLog sysLog) {\n        log.info(JSON.toJSONString(sysLog));\n    }\n\n}<\/code><\/pre>\n<h2>\u5b9a\u4e49\u65e5\u5fd7\u6ce8\u89e3<\/h2>\n<p>\u8bb0\u5f55\u65e5\u5fd7\u4f7f\u7528\u6ce8\u89e3\u7684\u5f62\u5f0f\uff0c\u5207\u70b9\u8868\u8fbe\u5f0f\u5f62\u5f0f\u65e0\u9700\u5b9a\u4e49<\/p>\n<pre><code class=\"language-java\">@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\npublic @interface WithSysLog {\n    String value() default &quot;&quot;;\n}<\/code><\/pre>\n<h2>\u58f0\u660e\u5207\u9762\uff0c\u5b8c\u6210\u65e5\u5fd7\u8bb0\u5f55<\/h2>\n<p>\u8fd9\u91cc\u9700\u8981\u5bf9AOP\u6709\u4e00\u5b9a\u7684\u4e86\u89e3\u3002\u8d77\u7801\u77e5\u9053\u5207\u70b9\u8868\u8fbe\u5f0f\u3001\u73af\u7ed5\u901a\u77e5\u3001\u524d\u7f6e\u901a\u77e5\u3001\u540e\u7f6e\u901a\u77e5\u7b49<\/p>\n<p>\u652f\u6301\u6ce8\u89e3\u5f62\u5f0f\u548c\u5207\u70b9\u8868\u8fbe\u5f0f\u5f62\u5f0f<\/p>\n<pre><code class=\"language-java\">\/**\n * \u7cfb\u7edf\u65e5\u5fd7\u5207\u9762\n *\n * @Author: yezhou\n * @Date: 2019\/5\/9 10:40\n * @Version 1.0\n *\/\n\n@Slf4j\n@Aspect  \/\/\u4f7f\u7528@Aspect\u6ce8\u89e3\u58f0\u660e\u4e00\u4e2a\u5207\u9762\n@Component\npublic class SysLogAspect {\n\n    @Autowired\n    private SysLogService sysLogService;\n\n    \/**\n     * \u4f7f\u7528\u6ce8\u89e3\u7684\u5f62\u5f0f\n     * \u4e5f\u53ef\u4ee5\u901a\u8fc7\u5207\u70b9\u8868\u8fbe\u5f0f\u76f4\u63a5\u6307\u5b9a\u9700\u8981\u62e6\u622a\u7684package, \u9700\u8981\u62e6\u622a\u7684class \u4ee5\u53ca method\n     * \u5207\u70b9\u8868\u8fbe\u5f0f: execution(...)\n     *\/\n    \/\/@Pointcut(&quot;@annotation(me.yezhou.springdemo.annotation.WithSysLog)&quot;)  \/\/\u6ce8\u89e3\u5f62\u5f0f\n    @Pointcut(&quot;execution(public * me.yezhou.springdemo.controller.SysLogController.*(..))&quot;)  \/\/\u5207\u70b9\u8868\u8fbe\u5f0f\u5f62\u5f0f\n    public void logPointCut() {\n        log.info(&quot;SysLogAspect.logPointCut&quot;);\n    }\n\n    \/**\n     * \u73af\u7ed5\u901a\u77e5 @Around, \u5f53\u7136\u4e5f\u53ef\u4ee5\u4f7f\u7528 @Before (\u524d\u7f6e\u901a\u77e5)  @After (\u540e\u7f6e\u901a\u77e5)\n     *\n     * @param point\n     * @return\n     * @throws Throwable\n     *\/\n    @Around(&quot;logPointCut()&quot;)\n    public Object around(ProceedingJoinPoint point) throws Throwable {\n        log.info(&quot;SysLogAspect.around&quot;);\n        long beginTime = System.currentTimeMillis();\n        Object result = point.proceed();\n        long time = System.currentTimeMillis() - beginTime;\n        try {\n            saveLog(point, time);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return result;\n    }\n\n    \/**\n     * \u4fdd\u5b58\u65e5\u5fd7\n     *\n     * @param joinPoint\n     * @param time\n     *\/\n    private void saveLog(ProceedingJoinPoint joinPoint, long time) {\n        MethodSignature signature = (MethodSignature) joinPoint.getSignature();\n        Method method = signature.getMethod();\n        SysLog sysLog = new SysLog();\n        sysLog.setExecTime(time);\n        SimpleDateFormat dateFormat = new SimpleDateFormat(&quot;yyyy-MM-dd hh:mm:ss&quot;);\n        sysLog.setCreateDate(dateFormat.format(new Date()));\n        WithSysLog withSysLog = method.getAnnotation(WithSysLog.class);\n        if (withSysLog != null) {\n            \/\/\u6ce8\u89e3\u4e0a\u7684\u63cf\u8ff0\n            sysLog.setRemark(withSysLog.value());\n        }\n        \/\/\u8bf7\u6c42\u7684 \u7c7b\u540d\u3001\u65b9\u6cd5\u540d\n        String className = joinPoint.getTarget().getClass().getName();\n        String methodName = signature.getName();\n        String[] parameterNames = signature.getParameterNames();\n        sysLog.setClassName(className);\n        sysLog.setMethodName(methodName);\n        sysLog.setMethodParams(parameterNames);\n        \/\/\u8bf7\u6c42\u7684\u53c2\u6570\n        Object[] args = joinPoint.getArgs();\n        sysLog.setParamValues(args);\n\n        sysLogService.save(sysLog);\n    }\n}<\/code><\/pre>\n<h2>\u6d4b\u8bd5Controller<\/h2>\n<pre><code class=\"language-java\">@RestController\npublic class SysLogController {\n\n    \/\/@WithSysLog(&quot;\u6d4b\u8bd5&quot;)  \/\/\u6ce8\u89e3\u5f62\u5f0f\n    @GetMapping(&quot;\/test&quot;)  \/\/\u5207\u70b9\u8868\u8fbe\u5f0f\u5f62\u5f0f\n    public String test(@RequestParam(&quot;name&quot;) String name) {\n        try {\n            Thread.sleep(1000);\n        } catch (InterruptedException e) {\n            return e.getMessage();\n        }\n        return name;\n    }\n\n}<\/code><\/pre>\n<p>\u8bbf\u95ee\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"http:\/\/127.0.0.1:8080\/test?name=Joe.Ye\">http:\/\/127.0.0.1:8080\/test?name=Joe.Ye<\/a><\/p>\n<p>\u8fd4\u56de\u7ed3\u679c\uff1a<\/p>\n<pre><code>SysLogAspect.around\n{&quot;className&quot;:&quot;me.yezhou.springdemo.controller.SysLogController&quot;,&quot;createDate&quot;:&quot;2019-05-09 11:30:01&quot;,&quot;execTime&quot;:1000,&quot;methodName&quot;:&quot;test&quot;,&quot;methodParams&quot;:[&quot;name&quot;],&quot;paramValues&quot;:[&quot;Joe.Ye&quot;],&quot;remark&quot;:&quot;\u6d4b\u8bd5&quot;}<\/code><\/pre>\n<p>\u81f3\u6b64\uff0c\u6211\u4eec\u6210\u529f\u5b9e\u73b0\u4e86\u4f7f\u7528Aspect\u5b9e\u73b0\u5207\u9762\u8bb0\u5f55\u65e5\u5fd7\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5207\u9762Aspect\u662fSpring\u7684\u4e00\u5927\u4f18\u52bf\u3002\u9762\u5411\u5207\u9762\u7f16\u7a0b\u5f80\u5f80\u8ba9\u6211\u4eec\u7684\u5f00\u53d1\u66f4\u52a0\u4f4e\u8026\u5408\uff0c\u4e5f\u5927\u5927\u51cf\u5c11\u4e86\u4ee3\u7801\u91cf\uff0c\u540c\u65f6\u8ba9\u6211 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[100],"class_list":["post-900","post","type-post","status-publish","format-standard","hentry","category-spring-boot","tag-aop"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/900","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=900"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/900\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=900"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=900"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=900"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}