【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的日志管理:Spring Boot 通过继承,实现,来扩展的更多自定义功能

 <前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、开篇整活儿

今儿个咱唠唠 Spring Boot 里头咋通过继承和实现来扩展自定义功能。这玩意儿吧,说大不大,说小不小,整好了是锦上添花,整不好就是火上浇油。你要是刚入门,那可得悠着点儿,别一上来就整得自己“翻车”了。

二、继承和实现是啥玩意儿?

继承和实现是 Java 里头的两个基本概念,Spring Boot 里头也经常用这俩玩意儿来扩展功能。继承就是子类继承父类的属性和方法,实现就是类实现接口的方法。Spring Boot 里头有一堆类和接口,你可以通过继承和实现来扩展自定义功能。

三、通过继承扩展功能

Spring Boot 里头有一堆类,你可以通过继承来扩展自定义功能。

1. 继承 WebMvcConfigurer

WebMvcConfigurer 是 Spring MVC 里头的一个接口,用来配置 MVC 的。你可以通过继承 WebMvcConfigurerAdapter 来扩展 MVC 的配置。

Java Code

@Configuration

public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {

    @Override

    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(new MyInterceptor());

    }

}

这段代码里头,MyWebMvcConfigurer 继承了 WebMvcConfigurerAdapter,重写了 addInterceptors 方法,添加了一个自定义的拦截器。

2. 继承 SpringBootServletInitializer

SpringBootServletInitializer 是 Spring Boot 里头的一个类,用来启动 Spring Boot 应用的。你可以通过继承 SpringBootServletInitializer 来扩展启动配置。

Java Code

public class MyServletInitializer extends SpringBootServletInitializer {

    @Override

    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

        return application.sources(MyApplication.class);

    }

}

这段代码里头,MyServletInitializer 继承了 SpringBootServletInitializer,重写了 configure 方法,指定了启动类。

3. 继承 CommandLineRunner

CommandLineRunner 是 Spring Boot 里头的一个接口,用来在应用启动后执行一些代码。你可以通过实现 CommandLineRunner 来扩展启动后的操作。

Java Code

@Component

public class MyCommandLineRunner implements CommandLineRunner {

    @Override

    public void run(String... args) throws Exception {

        System.out.println("应用启动后执行");

    }

}

这段代码里头,MyCommandLineRunner 实现了 CommandLineRunner,重写了 run 方法,在应用启动后执行了一些代码。

四、通过实现扩展功能

Spring Boot 里头有一堆接口,你可以通过实现来扩展自定义功能。

1. 实现 HandlerInterceptor

HandlerInterceptor 是 Spring MVC 里头的一个接口,用来拦截请求的。你可以通过实现 HandlerInterceptor 来扩展拦截器的功能。

Java Code

public class MyInterceptor implements HandlerInterceptor {

    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println("请求处理前");

        return true;

    }

    @Override

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

        System.out.println("请求处理后");

    }

    @Override

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

        System.out.println("请求完成后");

    }

}

这段代码里头,MyInterceptor 实现了 HandlerInterceptor,重写了 preHandle、postHandle 和 afterCompletion 方法,拦截了请求的不同阶段。

2. 实现 ApplicationRunner

ApplicationRunner 是 Spring Boot 里头的一个接口,用来在应用启动后执行一些代码。你可以通过实现 ApplicationRunner 来扩展启动后的操作。

Java Code

@Component

public class MyApplicationRunner implements ApplicationRunner {

    @Override

    public void run(ApplicationArguments args) throws Exception {

        System.out.println("应用启动后执行");

    }

}

这段代码里头,MyApplicationRunner 实现了 ApplicationRunner,重写了 run 方法,在应用启动后执行了一些代码。

3. 实现 EnvironmentPostProcessor

EnvironmentPostProcessor 是 Spring Boot 里头的一个接口,用来在应用启动前处理环境变量的。你可以通过实现 EnvironmentPostProcessor 来扩展环境变量的处理。

Java Code

public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {

    @Override

    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {

        environment.getPropertySources().addLast(new MyPropertySource());

    }

}

这段代码里头,MyEnvironmentPostProcessor 实现了 EnvironmentPostProcessor,重写了 postProcessEnvironment 方法,添加了一个自定义的属性源。

五、通过继承和实现扩展功能的坑点

1. 继承的局限性

Spring Boot 里头,继承的局限性很大。你要是继承了某个类,那子类就不能继承其他类了。

Java Code

public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {

    // 一些配置

}

public class MyServletInitializer extends SpringBootServletInitializer {

    // 一些配置

}

这段代码里头,MyWebMvcConfigurer 和 MyServletInitializer 都继承了不同的类,不能同时继承。

2. 实现的复杂性

Spring Boot 里头,实现的复杂性很大。你要是实现了某个接口,那类就得实现所有的方法。

Java Code

public class MyInterceptor implements HandlerInterceptor {

    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        return true;

    }

    @Override

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }

}

这段代码里头,MyInterceptor 实现了 HandlerInterceptor,得实现所有的方法。

3. 注解的冲突

Spring Boot 里头,注解的冲突很大。你要是用了某个注解,那其他注解就不起作用了。

Java Code

@Configuration

@EnableWebMvc

public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {

    // 一些配置

}

这段代码里头,@EnableWebMvc 注解会覆盖 WebMvcConfigurerAdapter 的配置。

专有名词解释

  1. WebMvcConfigurer:Spring MVC 里头的一个接口,用来配置 MVC 的。
  2. SpringBootServletInitializer:Spring Boot 里头的一个类,用来启动 Spring Boot 应用的。
  3. CommandLineRunner:Spring Boot 里头的一个接口,用来在应用启动后执行一些代码的。
  4. HandlerInterceptor:Spring MVC 里头的一个接口,用来拦截请求的。
  5. ApplicationRunner:Spring Boot 里头的一个接口,用来在应用启动后执行一些代码的。
  6. EnvironmentPostProcessor:Spring Boot 里头的一个接口,用来在应用启动前处理环境变量的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值