玩转Spring-自定义Spring Starter

简介: 玩转Spring-自定义Spring Starter

1 什么是Spring Starter

摘自官网

Starters are a set of convenient dependency descriptors that you can include in your application. You get a one-stop shop for all the Spring and related technologies that you need without having to hunt through sample code and copy-paste loads of dependency descriptors. For example, if you want to get started using Spring and JPA for database access, include the spring-boot-starter-data-jpa dependency in your project.

翻译下:

启动器是一组方便的依赖项描述符,您可以在应用程序中包含它们。您可以获得所需的所有Spring和相关技术的一站式服务,而无需查找示例代码和复制-粘贴大量依赖描述符。例如,如果您想开始使用Spring和JPA进行数据库访问,请在您的项目中包含Spring -boot-starter-data- JPA依赖项。

2 自定义Starter的Hello World

2.1 自定义Spring Starter的一般流程

(1)新建Spring Boot项目

(2)添加依赖

(3)调整项目结构

(4)自定义Configuration配置类

(5)增加spring.factories文件,指定自动配置类

(6)maven install安装到本地仓库

(7)其他项目引入使用

下面我们就来一一的实现下:

2.2 具体流程

2.2.1 新建Spring Boot项目
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/> 
</parent>

<groupId>org.ymx</groupId>
<artifactId>go-kafka-log-spring-starter</artifactId>
<version>0.0.1-RELEASE</version>
2.2.2 添加依赖
<!--引入web依赖,下文自定义拦截器使用-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--自定义starter需要的依赖 autoconfigure-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<!--自定义starter需要的依赖 configuration-processor-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
<!-- lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
2.2.3 调整项目结构

一般就是:

  • 删除主启动类
  • 删除test包
  • 删除主配置文件

在这里插入图片描述

2.2.4 自定义Configuration配置类

LogAutoConfig.java

@Configuration
@EnableConfigurationProperties({ConfigProperties.class})
@ConditionalOnProperty(prefix = "go.kafka.log", name = "enable", havingValue = "true")
public class LogAutoConfig {

    @Autowired
    private ConfigProperties configProperties;

    @Bean(name = "logService")
    public LogService getLogService() {
        LogService logService = new LogService();
        logService.setConfigProperties(configProperties);
        return logService;
    }
}

ConfigProperties.java

@Component
@ConfigurationProperties("go.kafka.log")
public class ConfigProperties {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

LogService.java

public class LogService {

    private ConfigProperties configProperties;

    public String getName() {
        return configProperties.getName();
    }

    public void setConfigProperties(ConfigProperties configProperties) {
        this.configProperties = configProperties;
    }

    public String hello() {
        return "Hello " + getName() + "!";
    }

}
2.2.5 增加spring.factories文件,指定自动配置类

spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.ymx.log.config.LogAutoConfig
2.2.6 maven install安装到本地仓库

在这里插入图片描述

2.2.7 测试

新建Spring Boot项目

<dependency>
    <groupId>org.ymx</groupId>
    <artifactId>go-kafka-log-spring-starter</artifactId>
    <version>0.0.1-RELEASE</version>
</dependency>

application.properties

server.port=8888
go.kafka.log.name=Spring Starter
go.kafka.log.enable=true

HelloController.java

@RestController
public class HelloController {

    @Resource
    private LogService logService;

    @GetMapping("/hello")
    public String hello() {
        return logService.hello();
    }
}

测试:
在这里插入图片描述

3 自定义Starter实现拦截器

3.1 编写自定义拦截器

@Component
public class LogInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("----------------------"+request.getMethod()+"----------------------");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("----------------------"+request.getMethod()+"----------------------");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

3.2 starter增加配置类

@Configuration
@ConditionalOnProperty(prefix = "go.kafka.log.interception", name = "enable", havingValue = "true")
public class LogInterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor())
                .addPathPatterns("/**") ;
    }
}

3.3 调用方增加配置文件内容,主启动类增加注解

配置文件:

go.kafka.log.enable=true

主启动类:

@SpringBootApplication
@ComponentScans(value = {@ComponentScan("org.ymx.log"),@ComponentScan("com.example.demo")})
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

3.4 测试

访问任意url
在这里插入图片描述

4 自定义Starter实现全局异常处理

4.1 编写starter全局异常处理类

@RestControllerAdvice
public class LogAdviceHandler {

    @ExceptionHandler(value = NullPointerException.class)
    public String exceptionHandlerJwt(NullPointerException e) {
        e.printStackTrace();
        return "error----NullPointerException";
    }

    @ExceptionHandler(value = Exception.class)
    public String exceptionHandler(Exception e) {
        e.printStackTrace();
        return "error----Exception";
    }
}

4.2 调用方制造异常测试

@GetMapping("/ex")
public String ex() {
    String str = null;
    str.equals("2");
    return "22";
}

测试结果:
在这里插入图片描述

5 总结几个重要的注解

  • @ConditionalOnProperty(prefix = "go.kafka.log", name = "enable", havingValue = "true")

    prefix为配置文件中的前缀,
    name为配置的名字
    havingValue是与配置的值对比值,当两个值相同返回true,配置类生效.

  • @EnableConfigurationProperties({ConfigProperties.class})

    使@ConfigurationProperties()注解生效

  • @ConfigurationProperties("go.kafka.log")

    见文章:https://blog.csdn.net/Mr_YanMingXin/article/details/119249740

  • @ComponentScans(value = {@ComponentScan("org.ymx.log"),@ComponentScan("com.example.demo")})

    扫描的bean的路径,这里是扫描starter的路径加上本项目的路径

相关文章
|
4天前
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
4天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
11天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
55 14
|
1月前
|
安全 Java 应用服务中间件
如何将Spring Boot应用程序运行到自定义端口
如何将Spring Boot应用程序运行到自定义端口
50 0
|
4月前
|
Java 数据安全/隐私保护 Spring
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
|
4月前
|
JSON 安全 Java
|
4月前
|
监控 安全 Java
【开发者必备】Spring Boot中自定义注解与处理器的神奇魔力:一键解锁代码新高度!
【8月更文挑战第29天】本文介绍如何在Spring Boot中利用自定义注解与处理器增强应用功能。通过定义如`@CustomProcessor`注解并结合`BeanPostProcessor`实现特定逻辑处理,如业务逻辑封装、配置管理及元数据分析等,从而提升代码整洁度与可维护性。文章详细展示了从注解定义、处理器编写到实际应用的具体步骤,并提供了实战案例,帮助开发者更好地理解和运用这一强大特性,以实现代码的高效组织与优化。
247 0
|
5月前
|
消息中间件 Java Kafka
Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
218 5
|
5月前
|
Java Spring 容器
Spring boot 自定义ThreadPoolTaskExecutor 线程池并进行异步操作
Spring boot 自定义ThreadPoolTaskExecutor 线程池并进行异步操作
284 3
|
4月前
|
存储 Java API