Springboot-starter的自动配置原理-及案例实现6

本文涉及的产品
性能测试 PTS,5000VUM额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: Springboot-starter的自动配置原理-及案例实现6

第二步:自定义MyLog注解

    注解上的两个注解方法作用:

@Target(ElementType.METHOD) //这个注解加在方法上,通过ElementType的枚举指定这个注解加在什么位置
@Retention(RetentionPolicy.RUNTIME) //这个注解运行时生效
————————————————
```package com.laoyang.log;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**

  • 自定义日志注解
    */
    @Target(ElementType.METHOD) //这个注解加在方法上,通过ElementType的枚举指定这个注解加在什么位置
    @Retention(RetentionPolicy.RUNTIME) //这个注解运行时生效
    public @interface MyLog {

    /**

    • 方法描述
      */
      String desc() default "";
      }
      第三步:自定义日志拦截器MyLogInterceptor,用来计算加了MyLog注解后的方法从开始到结束总共的运行时间。 、package com.laoyang.log;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**

  • @author:Kevin
  • @create: 2022-09-17 10:41
  • @Description: 自定义拦截器
    */

public class MylogInterceptor extends HandlerInterceptorAdapter {

private static final ThreadLocal<Long> startTimeThreadLocal = new ThreadLocal<>();
/**
 *      controller方法执行之前
 * @param request
 * @param response
 * @param handler
 * @return
 * @throws Exception
 */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    HandlerMethod handlerMethod = (HandlerMethod)handler;  //转换成方法处理器
    Method method = handlerMethod.getMethod();  //获得被拦截的方法对象
    MyLog annotation = method.getAnnotation(MyLog.class);  //获得方法上的MyLog注解

    if (annotation != null){
        //说明当前拦截的方法加入了MyLog注解
        long currentTimeMills = System.currentTimeMillis();
        startTimeThreadLocal.set(currentTimeMills);
    }

    return true;
}

/**
 *      controller方法执行之后
 * @param request
 * @param response
 * @param handler
 * @param modelAndView
 * @throws Exception
 */

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    HandlerMethod handlerMethod = (HandlerMethod)handler;  //转换成方法处理器
    Method method = handlerMethod.getMethod();  //获得被拦截的方法对象
    MyLog annotation = method.getAnnotation(MyLog.class);  //获得方法上的MyLog注解
    if (annotation!=null){
        //说明当前拦截的方法加入了MyLog注解
        long endTime = System.currentTimeMillis();
        Long startTime = startTimeThreadLocal.get();
        long optTime = endTime - startTime; //计算controller方法执行时间

        String requestUri = request.getRequestURI();  //获取当前请求的地址
        String methodName = method.getDeclaringClass().getName() + "." +
                method.getName();    //获取当前请求的方法名称
        String methodDesc = annotation.desc();  //获取注解的声明

        System.out.println("请求uri:" + requestUri);
        System.out.println("请求方法名:" + methodName);
        System.out.println("方法描述:" + methodDesc);
        System.out.println("方法执行时间:" + optTime + "ms");
    }

    super.postHandle(request, response, handler, modelAndView);
}

}
```

相关文章
|
19天前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
68 12
|
4月前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
69 0
|
2月前
|
Dart 前端开发 JavaScript
springboot自动配置原理
Spring Boot 自动配置原理:通过 `@EnableAutoConfiguration` 开启自动配置,扫描 `META-INF/spring.factories` 下的配置类,省去手动编写配置文件。使用 `@ConditionalXXX` 注解判断配置类是否生效,导入对应的 starter 后自动配置生效。通过 `@EnableConfigurationProperties` 加载配置属性,默认值与配置文件中的值结合使用。总结来说,Spring Boot 通过这些机制简化了开发配置流程,提升了开发效率。
87 17
springboot自动配置原理
|
3月前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
3月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
231 14
|
4月前
|
Java Spring
SpringBoot自动装配的原理
在Spring Boot项目中,启动引导类通常使用`@SpringBootApplication`注解。该注解集成了`@SpringBootConfiguration`、`@ComponentScan`和`@EnableAutoConfiguration`三个注解,分别用于标记配置类、开启组件扫描和启用自动配置。
87 17
|
4月前
|
Java 容器
springboot自动配置原理
启动类@SpringbootApplication注解下,有三个关键注解 (1)@springbootConfiguration:表示启动类是一个自动配置类 (2)@CompontScan:扫描启动类所在包外的组件到容器中 (3)@EnableConfigutarion:最关键的一个注解,他拥有两个子注解,其中@AutoConfigurationpackageu会将启动类所在包下的所有组件到容器中,@Import会导入一个自动配置文件选择器,他会去加载META_INF目录下的spring.factories文件,这个文件中存放很大自动配置类的全类名,这些类会根据元注解的装配条件生效,生效
|
5月前
|
Java Spring 容器
springboot @RequiredArgsConstructor @Lazy解决循环依赖的原理
【10月更文挑战第15天】在Spring Boot应用中,循环依赖是一个常见问题,当两个或多个Bean相互依赖时,会导致Spring容器陷入死循环。本文通过比较@RequiredArgsConstructor和@Lazy注解,探讨它们解决循环依赖的原理和优缺点。@RequiredArgsConstructor通过构造函数注入依赖,使代码更简洁;@Lazy则通过延迟Bean的初始化,打破创建顺序依赖。两者各有优势,需根据具体场景选择合适的方法。
270 4
|
Java Maven 容器
SpringBoot 核心原理分析
SpringBoot 核心原理分析
205 0
SpringBoot 核心原理分析
|
XML Java 数据格式
SpringBoot原理分析
SpringBoot原理分析
SpringBoot原理分析