<前文回顾>
<今日更新>
一、开篇整活儿
今儿个咱唠唠 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 的配置。
专有名词解释
- WebMvcConfigurer:Spring MVC 里头的一个接口,用来配置 MVC 的。
- SpringBootServletInitializer:Spring Boot 里头的一个类,用来启动 Spring Boot 应用的。
- CommandLineRunner:Spring Boot 里头的一个接口,用来在应用启动后执行一些代码的。
- HandlerInterceptor:Spring MVC 里头的一个接口,用来拦截请求的。
- ApplicationRunner:Spring Boot 里头的一个接口,用来在应用启动后执行一些代码的。
- EnvironmentPostProcessor:Spring Boot 里头的一个接口,用来在应用启动前处理环境变量的。