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

2021-03-02  本文已影响0人  holyhigh2

开发环境

请见《项目部署及打包》

概述

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

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项目启动类,包含了自动配置加载、组件扫描、配置类扫描

上一篇下一篇

猜你喜欢

热点阅读