SpringBoot如何自定义自己的条件注解与自动配置

这篇具有很好参考价值的文章主要介绍了SpringBoot如何自定义自己的条件注解与自动配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本专栏将从基础开始,循序渐进,以实战为线索,逐步深入SpringBoot相关知识相关知识,打造完整的云原生学习步骤,提升工程化编码能力和思维能力,写出高质量代码。希望大家都能够从中有所收获,也请大家多多支持。
专栏地址:SpringBoot专栏
本文涉及的代码都已放在gitee上:gitee地址
如果文章知识点有错误的地方,请指正!大家一起学习,一起进步。

Spring Boot的核心功能就是为整合第三方框架提供自动配置,而本文则带着大家实现了自己的自动配置和Starter,一旦真正掌握了本文的内容,就会对Spring Boot产生“一览众山小”的感觉。

自定义条件注解

在SpringBoot中,所有自定义条件注解其实都是基于@Conditional而来的,使用@Conditional定义新条件注解关键就是要有一个Condition实现类,该Condition实现类就负责条件注解的处理逻辑,该实现类所实现的matches()方法决定了条件注解的要求是否得到满足。

下面是自定义条件注解的Condition实现类的代码。

  • src/main/java/com/example/_003configtest/condition/MyCondition.java
package com.example._003configtest.condition;

import com.example._003configtest.annotation.ConditionalCustom;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;

import java.util.Map;


public class MyCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        //获取@ConditionalCustom注解的全部属性,其中ConditionalCustom是自定义的注解
        Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes(ConditionalCustom.class.getName());
        //获取注解的value属性值
        String[] vals = (String[]) annotationAttributes.get("value");
        //env是application.properties或application.yml中配置的属性
        Environment env = context.getEnvironment();
        //遍历每个value的每个属性值
        for (String val : vals) {
            //如果某个属性值对应的配置属性不存在,则返回false
            if(env.getProperty(val.toString())== null){
                return false;
            }
        }
        return true;
    }
}

从上面的逻辑可以看到,自定义条件注解的处理逻辑比较简单:就是要求value属性所指定的所有配置属性必须存在,至于这些配置属性的值是什么无所谓,这些配置属性是否有值也无所谓。

有了上面的Condition实现类之后,接下来即可基于@Conditional来定义自定义条件注解。下面是自定义条件注解的代码。

  • src/main/java/com/example/_003configtest/annotation/ConditionalCustom.java
package com.example._003configtest.annotation;
import com.example._003configtest.condition.MyCondition;
import org.springframework.context.annotation.Conditional;

import java.lang.annotation.*;

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//只要通过@Conditional指定Condition实现类即可,该Condition实现类就会负责该条件注解的判断逻辑
@Conditional(MyCondition.class)
public @interface ConditionalCustom {

    String[] value() default {};

}

下面的配置类示范了如何使用该自定义的条件注解:

  • src/main/java/com/example/_003configtest/config/MyConfigTest.java
// proxyBeanMethods = true  :单例模式,保证每个@Bean方法被调用多少次返回的组件都是同一个
// proxyBeanMethods = false :原型模式,每个@Bean方法被调用多少次返回的组件都是新创建的
@Configuration(proxyBeanMethods = true)
public class MyConfigTest {
    @Bean
    //只有当applicaion.properties或application.yml中org.test1,org.test2两个配置属性都存在时才生效
    @ConditionalCustom({"org.test1","org.test2"})
    public MyBean myBean(){
        return new MyBean();
    }
}

在application.properties文件中添加如下配置:

org.test1 = 1
org.test2 = 2

运行测试发现成功获得了容器中对应的类:

SpringBoot如何自定义自己的条件注解与自动配置

自定义自动配置

开发自己的自动配置很简单,其实也就两步:

  1. 使用@Configuration和条件注解定义自动配置类。

  2. 在META-INF/spring.factories文件中注册自动配置类。

为了清楚地演示Spring Boot自动配置的效果,避免引入第三方框架导致的额外复杂度,本例先自行开发一个funny框架,该框架的功能是用文件或数据库保存程序的输出信息。

新建一个Maven项目funny(注意不是用SpringInitializr创建项目),为该项目添加mysql-connector-java和slf4j-api两个依赖。由于该项目是我们自己开发的框架,因此无须为该项目添加任何Spring Boot依赖。下面是该项目的pom.xml文件代码。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>funny</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 定义所使用的Java版本和源代码使用的字符集-->
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <!-- MySQL数据库驱动依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.36</version>
        </dependency>
    </dependencies>


</project>

接下来为这个框架项目开发如下类。

  • src/main/java/io/WriterTemplate.java
package io;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.charset.Charset;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Objects;
import javax.sql.DataSource;


public class WriterTemplate {
    Logger log = LoggerFactory.getLogger(this.getClass());
    private final DataSource dataSource;
    private Connection conn;
    private File dest;
    private final Charset charset;
    private RandomAccessFile raf;

    public WriterTemplate(DataSource dataSource) throws SQLException {
        this.dataSource = dataSource;
        this.dest = null;
        this.charset = null;
        if(Objects.nonNull(this.dataSource)){
            log.debug("========获取数据库连接========");
            this.conn = dataSource.getConnection();
        }
    }

    public WriterTemplate(File dest,Charset charset) throws FileNotFoundException{
        this.dest = dest;
        this.charset = charset;
        this.dataSource = null;
        this.raf = new RandomAccessFile(this.dest,"rw");
    }

    public void write(String message) throws IOException,SQLException{
        if(Objects.nonNull(this.conn)){
            //查询当前数据库的fnny_message表是否存在
            ResultSet rs = conn.getMetaData().getTables(conn.getCatalog(),null,"funny_message",null);
            //如果funy_message表不存在,需要创建表
            if(!rs.next()){
                log.debug("~~~~~~~~~创建funny_message表~~~~~~~~~");
                conn.createStatement().execute("create table funny_message " + "(id int primary key auto_increment,message_text text)");
            }
            log.debug("~~~~~~~~~输出到数据表~~~~~~~~~");
            //往数据库中插入数据
            conn.createStatement().executeUpdate("insert into " + "funny_message values(null,'" + message + "')");
            rs.close();
        }
        else{
            log.debug("~~~~~~~~~输出到文件~~~~~~~~~");
            raf.seek(this.dest.length());
            raf.write((message + "\n").getBytes(this.charset));
        }
    }

    //关闭资源
    public void close() throws SQLException,IOException{
        if(this.conn != null){
            this.conn.close();
        }

        if(this.raf != null){
            this.raf.close();
        }
    }
}

该工具类根据是否传入 DataSource 来决定输出目标:如果为该工具类传入了DataSource,它就会向该数据源所连接的数据库中的funny_message表输出内容(如果该表不存在,该工具类将会自动建表);如果没有为该工具类传入DataSource,它就会向指定文件输出内容。

接下来使用install打包到maven仓库:

SpringBoot如何自定义自己的条件注解与自动配置

有了该框架之后,接下来为该框架开发自动配置。如果为整合现有的第三方框架开发自动配置,则可直接从这一步开始(因为框架已经存在了,直接为框架开发自动配置即可)。

同样新建一个Maven项目funny-spring-boot-starter(为了方便可以用SpringInitializr创建项目),这个项目是自定义Starter项目,因此必须要有Spring Boot支持,将前面Spring Boot项目中的pom.xml文件复制过来,保留其中的spring-boot-starter依赖,并添加刚刚开发的funny框架的依赖。此外,由于该项目不是Spring Boot应用,因此不需要主类,也不需要运行,故删除其中的spring-boot-maven-plugin插件。修改后的pom.xml文件内容如下。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>funny-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>funny-spring-boot-starter</name>
    <description>funny-spring-boot-starter</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    </properties>

    <dependencies>
        <!-- Spring Boot Starter依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- 依赖自定义的funny框架,如果正在为其他第三方框架开发自动配置,则此处应该填写被整合的第三方框架的坐标。-->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>funny</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

接下来定义如下自动配置类。

  • src/main/java/com/example/funnyspringbootstarter/autoconfig/FunnyAutoConfiguration.java
package com.example.funnyspringbootstarter.autoconfig;

import io.WriterTemplate;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import javax.xml.crypto.Data;
import java.io.File;
import java.io.FileNotFoundException;
import java.nio.charset.Charset;
import java.sql.SQLException;

@Configuration
//当WriteTemplate类存在时配置生效
@ConditionalOnClass(WriterTemplate.class)
//FunnyProperties是自定义的类,后面会定义,这里表示启动FunnyProperties
@EnableConfigurationProperties(FunnyProperties.class)
//让该自动配置类位于DataSourceAutoConfiguration自动配置类之后处理
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class FunnyAutoConfiguration {
    private final FunnyProperties properties;
	//FunnyProperties类负责加载配置属性
    public FunnyAutoConfiguration(FunnyProperties properties) {
        this.properties = properties;
    }

    @Bean(destroyMethod = "close")
    //当单例的DataSource Bean存在时配置生效
    @ConditionalOnSingleCandidate(DataSource.class)
    //只有当容器中没有WriterTemplate Bean时,该配置才会生效
    @ConditionalOnMissingBean
    //通过@AutoConfigureOrder注解指定该配置方法比下一个配置WriterTemplate的方法的优先级更高
    @AutoConfigureOrder(99)
    public WriterTemplate writerTemplate(DataSource dataSource) throws SQLException{
        return new WriterTemplate(dataSource);
    }


    @Bean(destroyMethod = "close")
    //只有当前面的WriteTemplate配置没有生效时,该方法的配置才会生效
    @ConditionalOnMissingBean
    @AutoConfigureOrder(199)
    public WriterTemplate writerTemplate2() throws FileNotFoundException{
        File f = new File(this.properties.getDest());
        Charset charset = Charset.forName(this.properties.getCharset());
        return new WriterTemplate(f,charset);
    }
}

在FunnyAutoConfiguration 自动配置类中定义了两个@Bean方法,这两个@Bean 方法都用于自动配置 WriterTemplate。为了指定它们的优先级,程序使用了@AutoConfigureOrder 注解修饰它们,该注解指定的数值越小,优先级越高。

FunnyAutoConfiguration 自动配置类中的@Bean 方法同样使用了@ConditionalOnMissingBean`@ConditionalOnSingleCandidate等条件注解修饰,从而保证只有当容器中不存在WriterTemplate时,该自动配置类才会配置WriterTemplate Bean,且优先配置基于DataSource的WriterTemplate。

上面的自动配置类还用到了FunnyProperties属性处理类,该类的代码如下:

package com.example.funnyspringbootstarter.autoconfig;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = FunnyProperties.FUNNY_PREFIX)
public class FunnyProperties {
    public static final String FUNNY_PREFIX = "org.test";
    private String dest;
    private String charset;

    public String getDest() {
        return dest;
    }

    public void setDest(String dest) {
        this.dest = dest;
    }

    public String getCharset() {
        return charset;
    }

    public void setCharset(String charset) {
        this.charset = charset;
    }
}

上面的属性处理类负责处理以“org.test”开头的属性,这个“org.test”是必要的,它相当于这一组配置属性的“命名空间”,通过这个命名空间可以将这些配置属性与其他框架的配置属性区分开。

有了上面的自动配置类之后,接下来使用如下META-INF/spring.factories文件来注册自动配置类。

  • src/main/resources/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration = \
  com.example.funnyspringbootstarter.autoconfig.FunnyAutoConfiguration

经过上面步骤,自动配置开发完成,接下来使用install打包到maven仓库:

SpringBoot如何自定义自己的条件注解与自动配置

有了自定义的Starter之后,接下来使用该Starter与使用Spring Boot官方Starter并没有任何区别。首先新建一个Maven项目myfunnytest,在pom文件中引入该starter:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>myfunnytest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>myfunnytest</name>
    <description>myfunnytest</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>funny-spring-boot-starter</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.example.myfunnytest.MyfunnytestApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

由于 funny-spring-boot-starter 本身需要依赖 spring-boot-starter,因此不再需要显式配置依赖spring-boot-starter。

在添加了上面的funny-spring-boot-starter依赖之后,该Starter包含的自动配置生效,它会尝试在容器中自动配置WriterTemplate,并且还会读取application.properties因此还需要在application.properties文件中进行配置。

  • src/main/resources/application.properties
# 应用名称
spring.application.name=myfunnytest
org.test.dest = F:/abc-12345.txt
org.test.charset=UTF-8
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDateTimeCode=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root

该示例的主类很简单,它直接获取容器中的WriterTemplate Bean,并调用该Bean的write()方法执行输出。下面是该主类的代码:

package com.example.myfunnytest;

import io.WriterTemplate;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class MyfunnytestApplication {

    public static void main(String[] args) throws Exception{
        ConfigurableApplicationContext run = SpringApplication.run(MyfunnytestApplication.class, args);
        WriterTemplate writerTemplate = run.getBean(WriterTemplate.class);
        System.out.println(writerTemplate);
        writerTemplate.write("自动配置");
    }

}

运行该程序,由于当前Spring容器中没有DataSource Bean,因此FunnyAutoConfiguration将会自动配置输出到文件的WriterTemplate。因此,运行该程序,可以看到程序向“f:/abc-12345.txt”文件(由前面的org.test.dest属性配置)输出内容:

SpringBoot如何自定义自己的条件注解与自动配置

运行结果如下:

SpringBoot如何自定义自己的条件注解与自动配置

如果在项目的pom.xml文件中通过如下配置来添加依赖。

<!--        Spring Boot JDBC Starter依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

此时为项目添加了spring-boot-starter-jdbc依赖,该依赖将会在容器中自动配置一个DataSource Bean,这个自动配置的DataSource Bean将导致FunnyAutoConfiguration会自动配置输出到数据库的WriterTemplate。因此,运行该程序,可以看到程序向数据库名为springboot数据库的funny_message表输出内容:

SpringBoot如何自定义自己的条件注解与自动配置

Spring Boot的核心功能就是为整合第三方框架提供自动配置,而本文则带着大家实现了自己的自动配置和Starter,一旦真正掌握了本文的内容,就会对Spring Boot产生“一览众山小”的感觉。文章来源地址https://www.toymoban.com/news/detail-404820.html

到了这里,关于SpringBoot如何自定义自己的条件注解与自动配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 认识SpringBoot中的条件注解

    ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:认识SpringBoot中的条件注解 📚个人知识库: Leo知识库,欢迎大家访问 大家好,我是L

    2024年02月02日
    浏览(40)
  • 手写自己的Springboot-2-从Servlet容器选择彻底理解自动配置

    如果还没有看第一篇文章的伙伴,建议先看第一篇文章 手写自己的Springboot-1-整合tomcat,该文章在第一篇文章基础上进行扩展. 在我们使用Springboot时,如果不想用Tomcat,想用Jetty,应该怎么办呢? 其实很简单,我们只需要把Tomcat的依赖排除掉,然后引入Jetty即可. 那Springboot底层究竟是怎样

    2024年02月05日
    浏览(41)
  • 【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter

    Springboot starter 是SpringBoot的一个重要概念,是“一站式服务 (one-stop)”的依赖 Jar 包包含 Spring 以及相关技术(比如 Redis)的所有依赖提供了自动配置的功能,开箱即用提供了良好的依赖管理,避免了包遗漏、版本冲突等问题。 简单来说, Springboot starter 提供了一种自动配置的机制

    2024年02月11日
    浏览(38)
  • 37、springboot 为 spring mvc 提供的自动配置及对自动配置的一些自定义定制(大体思路)

    如果觉得springboot对spring mvc 的一些自动配置不满意,我们还可以对这些自动配置进行定制。 ▲ 定制方式一: 代码演示: 若要在保留自动配置的基础上增加一些自定义的Spring MVC配置,可以这些写,这里只是弄个框架。 ▲ 定制方式二: 代码演示: ▲ 定制方式三: 代码演示

    2024年02月11日
    浏览(37)
  • SpringBoot——原理(自动配置_案例(自定义阿里云文件上starter))

    本文同步更新于鼠鼠之家 starter就是springboot中的起步依赖,虽然springboot已经提供了很多的起步依赖,但是在实际项目开发中可能会用到和第三方的技术,不是所有第三方在springboot中都有收录。 比如之前文章中有用到过的阿里云OSS,阿里云并没有提供起步依赖,导致每次使用

    2024年02月06日
    浏览(46)
  • SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

    本文同步更新于鼠鼠之家 starter就是springboot中的起步依赖,虽然springboot已经提供了很多的起步依赖,但是在实际项目开发中可能会用到和第三方的技术,不是所有第三方在springboot中都有收录。 比如之前文章中有用到过的阿里云OSS,阿里云并没有提供起步依赖,导致每次使用

    2024年02月07日
    浏览(38)
  • 5步带你玩转SpringBoot自定义自动配置那些知识点

    目前SpringBoot框架真的深受广大开发者喜爱,毕竟它最大的特点就是: 快速构建基于Spring的应用程序的框架,而且它提供了各种默认的功能和配置,可以让开发者快速搭建应用程序的基础结构。 但是,当我们需要自定义一些配置时,我们就需要使用自定义自动配置。 今天一定

    2024年02月09日
    浏览(39)
  • springboot 自定义注解

    1、引入maven依赖(版本太低也会导致不生效) 2、创建注解接口(javax.validation版本是2.0.0的,自行选择,太低也不行) 3、可以创建全局异常来捕获(Result可以自己定义) 4、统一返回结果类 5、场景使用

    2024年02月12日
    浏览(53)
  • SpringBoot自定义Jackson注解,实现自定义序列化BigDecimal(增强JsonFormat注解)

    在处理BigDecimal字段的时候,希望自定义序列化格式。虽然有 JsonFormat可以自定义格式,但是还是不够,JsonFormat不能对 BigDecimal 进行个性化处理,比如指定的RoundingMode。 现在就是需要有个注解,可以实现自定序列化BigDecimal类型 首先,自定义一个注解 BigDecimalFormatter 实现一个

    2024年02月09日
    浏览(41)
  • springboot aop 自定义注解形式

    2024年01月25日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包