美文网首页
SpringBoot —— 开发自启动的boot依赖包

SpringBoot —— 开发自启动的boot依赖包

作者: holyhigh2 | 来源:发表于2021-03-02 21:29 被阅读0次

    开发环境

    请见《项目部署及打包》

    概述

    本文主要记录基于IDEA + Maven开发一个依赖SpringBoot的web项目包并提供给其他项目使用的过程,包括

    • 依赖SpringBoot web模块
    • 配置SpringBoot项目自动加载Bean
    • 自定义的banner展示(banner文件)
    • 属性文件读取(兼容不同文件/格式/profiles)
    • 过滤器排序
    • 打包配置
    • 本地安装
    • 附录——SpringBoot注解

    Juth2-Server

    Juth2-Server 是一个基于SpringBoot开发的OAuth2鉴权服务端,下面会以该库为例记录相关内容

    pom配置

    Juth2-Service是基于HTTP Filter Chain进行request合法验证,涉及到Servlet、Filter注解、Cors处理器等,最简单的方式是直接引入starter-web依赖

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

    当然,还需要指定starter-parent,否则你的所有依赖包都必须显式指定版本

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    

    同样也少不了其他相关依赖包。完成编码后可以通过SpringBootApplication进行启动

    自动配置

    指依赖包中的@Configuration可以跟随SpringBoot自动启动,而无需额外配置。实现该功能需要启用SpringBoot的自动配置功能,步骤包括

    1. 在resource目录下创建META-INF目录
    2. 在目录中创建spring.factories文件
    3. 在文件中指定自动配置项
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.xxx.Configuration1,\
    com.xxx.Configuration2,\
    ...
    

    banner展示

    通常,SpringBoot可以在application.yml中指定banner文件路径。但打包后会被主程序的文件覆盖,可以通过在@Configuration自动加载时读取jar包中的banner文件显示,比如Juth2-Server中

    public Juth2Configuration(Juth2Properties juth2Properties, Environment environment) {
      //banner
      String version = this.getClass().getPackage().getImplementationVersion();
      ResourceBanner banner = new ResourceBanner(new ClassPathResource("/juth2-logo.txt"));
      banner.printBanner(environment, Juth2Configuration.class, System.out);
      System.out.println(" ".repeat(61) + version);
      juth2Properties.log();
    }
    

    Juth2Configuration使用了构造注入来获取Juth2属性并打印属性加载信息,接着记录如何在jar包中加载主项目的配置信息

    加载属性文件

    SpringBoot项目可以自动识别 application.yml 或者 application.properties 或者 application-profile.yml 并按照优先级组合文件中的属性。想让自己的jar包实现同样的功能,可以通过SpringBoot提供的属性注解来实现,包括

    //实现读取主项目 application 文件中的juth2开头的属性
    @ConfigurationProperties(prefix = "juth2",ignoreInvalidFields = true)
    //实现读取独立juth2配置文件
    @PropertySources({
      //读取yml文件,需要配置一个Yaml解析类
      @PropertySource(value = {"classpath:juth2.yml", "classpath:config/juth2.yml"}, factory = YamlPropertySourceFactory.class,ignoreResourceNotFound = true, encoding = "UTF-8"),
      //读取properties文件
      @PropertySource(value = {"classpath:juth2.properties", "classpath:config/juth2.properties"}, ignoreResourceNotFound = true, encoding = "UTF-8")
    })
    

    将以上注解标注在属性Bean上,SpringBoot会自动对实例属性进行映射,这样就实现了banner中的Juth2属性注入

    过滤器排序

    在SpringBoot中,可以通过注解来挂载一个过滤器,比如

    @Order(Ordered.LOWEST_PRECEDENCE)
    @Component
    public class MyFilter implements Filter {
    }
    

    通过增加@Component注解来挂载过滤器并通过@Order注解来指定顺序,但Order注解的参数无法使用变量。
    另一种方法通过配置类并主动注册来实现,比如

    //配置类
    @Configuration
    public class FilterConfiguration {
        //注册过滤器1
        @Bean
        public FilterRegistrationBean<Filter1> regFilter1() {
            final FilterRegistrationBean<Filter1> reg = new FilterRegistrationBean<>();
    
            reg.setFilter(new Filter1());
            reg.addUrlPatterns("/*");
            reg.setOrder(1);//排序
    
            return reg;
        }
        //注册过滤器2
        @Bean
        public FilterRegistrationBean<Filter2> regFilter2() {
            final FilterRegistrationBean<Filter2> reg = new FilterRegistrationBean<>();
    
            reg.setFilter(new Filter2());
            reg.addUrlPatterns("/*");
            reg.setOrder(2);//排序
    
            return reg;
        }
    
    }
    
    

    打包配置

    想要打包为类库就不能使用默认的打包插件,如下

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    

    可以直接删除build或者使用maven-jar插件,如下

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <includes>
                        <include>**/juth2server/**</include>
                        <include>**/*.txt</include>
                    </includes>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    本地安装

    build好的jar包需要先在本地测试,IDEA自带了maven工具如下


    maven工具

    通过install方法,可以把jar包安装在本地maven仓库(通常在C盘 user/.m2目录)


    本地maven仓库

    然后在主项目的pom文件中加入依赖,比如

    <dependency>
        <groupId>com.github.holyhigh2</groupId>
        <artifactId>juth2-server</artifactId>
        <version>0.1.2-SNAPSHOT</version>
    </dependency>
    

    版本号由库的pom文件决定并体现在本地库中,比如


    本地库版本

    然后就可以看到依赖库中已经安装了依赖库


    依赖库

    附录 - 常用注解

    @Component - 标注组件类,实现容器管理,是众多注解的元注解
    @Configuration - Bean的配置类,提供@Bean注入。使用@Component元注解
    @Bean - 标注返回Bean实例的方法
    @RestController - 为所有方法都实现了@ResponseBody的@Controller
    @Controller - 标注MVC控制器类。使用@Component元注解
    @RequestMapping - 标注控制器类/方法的路由地址
    @Service - 标注服务类。使用@Component元注解
    @Autowired - 标注需要被注入的Bean
    @SpringBootApplication - 用来标注SpringBoot项目启动类,包含了自动配置加载、组件扫描、配置类扫描
    
    

    相关文章

      网友评论

          本文标题:SpringBoot —— 开发自启动的boot依赖包

          本文链接:https://www.haomeiwen.com/subject/oqemfltx.html