springboot 自定义启动器的实现

下面是关于“springboot 自定义启动器的实现”的攻略,包含两个示例:

一、为什么要自定义启动器

Spring Boot是一款非常流行的Java Web框架,它极大地提高了我们的开发效率。而自定义启动器则是在Spring Boot框架下进行自定义的一种方式。通常情况下,我们会将一系列相关的模块封装进一个自定义的启动器中,以便于其他项目能够更加方便的使用这些模块。而Spring Boot的自动配置机制则会在项目启动时自动加载这些模块的配置,从而降低了我们的开发难度。

二、自定义启动器的实现步骤

1.创建一个自定义的starter项目

第一步,我们需要创建一个新的Maven项目,并将其打包方式修改为pom。可以通过以下的命令快速创建一个新项目:

mvn archetype:generate -DgroupId=com.example -DartifactId=my-spring-boot-starter -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

2.添加依赖

在pom.xml文件中添加以下依赖:

  • spring-boot-starter-parent:Spring Boot的parent pom文件,可以方便的继承Spring Boot的各种功能。

  • spring-boot-autoconfigure:Spring Boot的自动化配置模块,用于自动化配置应用程序上下文。

  • spring-boot-starter:Spring Boot的基础模块,包含了 Spring 和 Spring MVC 所需的模块。

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.1.RELEASE</version>
  </dependency>
</dependencies>

3.编写自动配置类

编写一个AutoConfiguration类,该类用于自动化配置应用程序上下文,并在Spring Boot启动时加载对应的配置。我们可以在自动配置类中定义一些Bean,以便其他项目可以进行依赖注入。

@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {
    @Autowired
    private MyProperties myProperties;

    @Bean
    @ConditionalOnMissingBean(MyService.class)
    public MyService myService() {
        MyService service = new MyService();
        service.setPrefix(myProperties.getPrefix());
        service.setSuffix(myProperties.getSuffix());
        return service;
    }
}
  • @Configuration:将该类定义为配置文件类。

  • @ConditionalOnClass:指定当类路径下存在指定的类时,该配置才会生效。

  • @EnableConfigurationProperties:启用对指定自定义属性类的支持。

  • @Autowired:自动注入MyProperties类。

  • @Bean:定义一个Bean,Bean的名称默认为方法名。

  • @ConditionalOnMissingBean:指定当没有指定名称的Bean时,才会创建该Bean。

4.编写自定义属性类

创建一个用于封装自定义属性的类,用于向用户暴露可配置的选项。

@ConfigurationProperties(prefix = "my.service")
public class MyProperties {

    private String prefix;
    private String suffix;

    public String getPrefix() {
        return prefix;
    }

    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    public String getSuffix() {
        return suffix;
    }

    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }
}
  • @ConfigurationProperties:指定前缀,将其与多个配置属性进行绑定。

5.创建启动器

创建一个用于引入以上两个类的启动器和Demo类。

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

6.测试启动器

编写一个测试类来测试启动器是否工作。

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyServiceTests {

    @Autowired(required=false)
    private MyService myService;

    @Test
    public void contextLoads() {
        assertThat(myService, instanceOf(MyService.class));
        assertEquals("hellomy spring boot", myService.wrap("spring boot"));
    }
}

三、应用实例1

需求:创建一个自定义启动器,封装Redis操作,使得其他项目可以更加方便的使用Redis。

1.创建一个新的Maven项目,并将其打包方式修改为pom。

2.在pom.xml文件中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.2</version>
    </dependency>
</dependencies>

3.编写自动配置类

RedisAutoConfiguration.java

@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
@EnableConfigurationProperties(RedisProperties.class)
@ConditionalOnClass({JedisCluster.class, RedisTemplate.class})
@ConditionalOnBean(RedisProperties.class)
public class RedisAutoConfiguration {
    @Autowired
    private RedisProperties redisProperties;

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
        configuration.setHostName(redisProperties.getHost());
        configuration.setPort(redisProperties.getPort());
        configuration.setDatabase(redisProperties.getDatabase());
        configuration.setPassword(redisProperties.getPassword());

        JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfiguration = JedisClientConfiguration.builder();
        jedisClientConfiguration.connectTimeout(Duration.ofMillis(redisProperties.getTimeout()));

        return new JedisConnectionFactory(configuration, jedisClientConfiguration.build());
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }

    @Bean
    public RedisLockAspect redisLockAspect(RedisTemplate<String, Object> redisTemplate) {
        return new RedisLockAspect(redisTemplate);
    }
}

4.编写自定义属性类

@ConfigurationProperties(prefix = "redis")
public class RedisProperties {
    private String host;
    private int port;
    private int timeout;
    private String password;
    private int database = 0;

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public int getTimeout() {
        return timeout;
    }

    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getDatabase() {
        return database;
    }

    public void setDatabase(int database) {
        this.database = database;
    }
}

5.创建启动器

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

四、应用实例2

需求:创建一个自定义启动器,封装常用的通用异常信息。

1.创建一个新的Maven项目,并将其打包方式修改为pom。

2.在pom.xml文件中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>

3.编写自动配置类

@Configuration
@EnableConfigurationProperties(ExceptionProperties.class)
public class ExceptionAutoConfiguration {

    @Autowired
    private ExceptionProperties exceptionProperties;

    @Bean
    public CommonExceptionHandler commonExceptionHandler() {
        return new CommonExceptionHandler(exceptionProperties.getBasePackage());
    }

}

4.编写自定义属性类

@ConfigurationProperties(prefix = "spring.exception")
public class ExceptionProperties {

    private String basePackage = "";

    public String getBasePackage() {
        return basePackage;
    }

    public void setBasePackage(String basePackage) {
        this.basePackage = basePackage;
    }
}

5.创建启动器

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

五、总结

以上是Spring Boot自定义启动器的整个过程,其核心是自动化配置类,该类包含一些Bean定义和属性自动装配。自定义启动器可以方便地对一些功能进行封装,方便其他项目复用。如果您刚开始学习Spring Boot,我建议您先尝试完成一个简单的示例,从而熟悉Spring Boot的有关概念和技术。如果您在实践过程中遇到问题,可以查找相关文档或在社区中询问,不要放弃。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot 自定义启动器的实现 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java中List集合的常用方法详解

    Java中List集合的常用方法详解 List是Java中常见的集合类型之一,它可以存储一组有序、可重复的数据。在实际的开发过程中,我们经常需要对List集合进行添加,删除,查找等操作。下面就详细说明Java中List集合的常用方法和使用场景。 创建List集合 在Java中创建List集合可以使用ArrayList和LinkedList两种实现方式。 Ar…

    Java 2023年5月26日
    00
  • Java中获取当前路径的几种方法总结

    Java中获取当前路径的几种方法总结 有时候需要获取Java应用程序所在的路径或者当前工作目录的路径,在Java中有多种方法可以实现这个功能。本文将总结Java中获取当前路径的几种方法,以供参考。 方法一:使用System.getProperty() 可以使用System类提供的getProperty()方法获取当前工作目录的路径。具体代码如下: Strin…

    Java 2023年6月15日
    00
  • Java生成压缩文件的实例代码

    生成压缩文件是编程中常见的功能之一,Java在java.util.zip包下提供了ZipOutputStream和ZipEntry类,可以方便地生成zip压缩文件。本文分享Java生成压缩文件的实例代码。 1. 导入相关类 import java.io.File; import java.io.FileInputStream; import java.io.…

    Java 2023年5月26日
    00
  • Spring如何处理注解的深入理解

    下面是关于“Spring如何处理注解的深入理解”的完整攻略,包含两个示例说明。 Spring如何处理注解的深入理解 Spring是一个非常流行的Java应用程序框架,它提供了一种全面的编程和配置模型,用于构建现代化的基于Java的企业应用程序。在Spring中,注解是一种非常重要的机制,它可以帮助我们更加方便地配置和管理应用程序。本文将深入探讨Spring如…

    Java 2023年5月17日
    00
  • 浅谈spring 常用注解

    下面我为你详细讲解一下“浅谈Spring常用注解”的完整攻略。 前言 Spring框架作为Java开发领域内一款极其常用的框架,其提供的注解机制为我们的开发带来了很大的便利。本篇文章将会聚焦于 Spring 常用注解,为大家详细介绍其基本用法和常用场景,并通过示例来加深理解。 常用注解 @Autowired @Autowired 注解一般用于实现依赖注入,它…

    Java 2023年5月20日
    00
  • Java实现简单计算器小程序

    Java实现简单计算器小程序攻略 1. 准备工作 在开始编写代码前,需要先安装Java开发环境(JDK)和集成开发工具(IDE)。 可以通过以下步骤安装JDK和IDE: 下载并安装JDK。可以从官网下载JDK的安装包,下载完后按照提示进行安装,并配置环境变量。 JDK官网:https://www.oracle.com/java/technologies/ja…

    Java 2023年5月23日
    00
  • java中类与对象的使用详情

    下面我将详细介绍“Java中类与对象的使用”。 类与对象的基本概念 在Java中,类是一种抽象的数据类型,它是一组相关属性和方法的集合。而对象则是类的实例化,它可以调用类中定义的方法或访问类中定义的属性。 定义类 定义类的语法格式如下: public class ClassName { // 定义属性 // 定义方法 } 其中,public是访问控制符,表示…

    Java 2023年5月26日
    00
  • 10分钟带你徒手做个Java线程池

    摘要:花10分钟开发一个极简版的Java线程池,让小伙伴们更好的理解线程池的核心原理。 本文分享自华为云社区《放大招了,冰河带你10分钟手撸Java线程池,yyds,赶快收藏吧》,作者:冰 河。 Java线程池核心原理 看过Java线程池源码的小伙伴都知道,在Java线程池中最核心的类就是ThreadPoolExecutor,而在ThreadPoolExec…

    Java 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部