springboot依赖管理和自动配置

依赖管理和自动配置

依赖管理和自动配置

依赖管理

什么是依赖管理

1.spring-boot-starter-parent 还有父项目, 声明了开发中常用的版本号.

2.并且进行 自动版本仲裁, 即如果程序员没有指定某个依赖 jar 的版本, 则以父项目指定的版本为准.

修改自动仲裁/默认版本号

1.需求说明: 将SpringBoot mysql 驱动修改成 5.1.49

2.查看spring-boot-dependencies.pom 里面规定的当前依赖 的版本 的对应的 key, 这里是 mysql.version

3.修改quickstart/pom.xml, 重写配置, 当更新Maven时, 就依赖到新的mysql驱动. 一句话: 父项目不能动, 两种方案均是修改本项目的pom文件.

两种方案

方式1

xml 复制代码
<dependencies>
    <!--我们自己指定mysql/驱动版本, 即修改版本仲裁
    1.方式1: 显示地导入mysql依赖, 并明确地指定version
    2.方式2: 在自己的pom.xml文件, 在<properties> 中指定mysql的key
    形如:
    <properties>
        <mysql.version>5.1.49</mysql.version>
    </properties>
    3.为什么可以达到修改版本仲裁: 根据依赖就近优先原则.
    -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.49</version>
    </dependency>
</dependencies>

方式2 在自己的pom.xml文件, 在<properties> 节点中指定mysql的key

xml 复制代码
<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!--这里我们可以指定mysql.version-->
    <mysql.version>5.1.49</mysql.version>
</properties>

<dependencies>
    <!--我们自己指定mysql/驱动版本, 即修改版本仲裁
    1.方式1: 显示地导入mysql依赖, 并明确地指定version
    2.方式2: 在自己的pom.xml文件, 在<properties> 中指定mysql的key
    形如:
    <properties>
        <mysql.version>5.1.49</mysql.version>
    </properties>
    3.为什么可以达到修改版本仲裁: 根据依赖就近优先原则.
    -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

starter场景启动器

starter场景启动器基本介绍

1.开发中我们引入相关场景的starter , 这个场景中所有的相关依赖都引入进来了, 比如我们做web 开发引入了spring-boot-starter-web , 该starter 将导入与web开发相关的所有包.


2.依赖树: 可以看到 spring-boot-starter-web, 帮我们导入了spring-web, spring-webmvc 开发模块, 还导入了tomcat 的场景启动器spring-boot-starter-tomcat , spring-boot-starter-json场景, 这些场景下面又引出了一大堆相关的包, 这些依赖项可以快速启动和运行一个项目, 提高开发效率.

3.所有场景启动器最基本的依赖就是spring-boot-starter, 前面的依赖树分析可以看到, 这个依赖也就是SpringBoot 自动配置的核心依赖

官方提供的starter

地址: https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters

介绍:

1.在开发中我们经常会用到spring-boot-starter-xxx , 比如spring-boot-starter-web , 该场景是用作web 开发, 也就是说xxx是某种开发场景.

2.我们只需要引入starter, 这个场景的所有常规需要的依赖我们都自动引入.

3.SpringBoot2支持的所有场景如下:

第三方starter

1.SpringBoot也支持第三方starter

2.第三方starter不会从spring-boot开始, 因为这是官方spring-boot保留的命名方式. 第三方启动程序通常以项目名称开头. 例如, 名为 thirdpartyproject 的第三方启动程序项目通常被命名为 thirdpartyproject-spring-boot-starter.

3.也就是说: xxx-spring-boot-starter是第三方为我们提供的简化开发的场景启动器.

自动配置

自动配置基本介绍

1.小伙伴还记得否, 前面学习SSM整合时, 需要配置Tomcat, 配置SpringMVC, 配置如何扫描包, 配置字符过滤器, 配置视图解析器, 文件上传等, 非常麻烦[如图]. 而在SpringBoot中, 存在自动配置机制, 提高开发效率.

2.简单回顾以前SSM整合的配置.

SpringBoot自动配置了哪些?

1.自动配置Tomcat

2.自动配置SpringMVC

3.自动配置Web常用功能: 比如字符过滤器. 提示: 通过获取ioc容器, 查看容器创建的组件来验证

修改D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\MainApp.java

java 复制代码
/**
 * @SpringBootApplication: 表示这是一个springboot引用/项目
 */
@SpringBootApplication
public class MainApp {
    public static void main(String[] args) {
        //启动springboot应用程序/项目
        ApplicationContext ioc = SpringApplication.run(MainApp.class, args);

        //如何查看容器中注入的组件
        //① 打断点
        //② 写代码
        String[] beanDefinitionNames = ioc.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println("beanDefinitionName=" + beanDefinitionName);
        }
    }
}

beanDefinitionName=org.springframework.context.annotation.internalConfigurationAnnotationProcessor

beanDefinitionName=org.springframework.context.annotation.internalAutowiredAnnotationProcessor

beanDefinitionName=org.springframework.context.annotation.internalCommonAnnotationProcessor

beanDefinitionName=org.springframework.context.event.internalEventListenerProcessor

beanDefinitionName=org.springframework.context.event.internalEventListenerFactory

beanDefinitionName=mainApp

beanDefinitionName=org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory
beanDefinitionName=helloController 控制器

beanDefinitionName=org.springframework.boot.autoconfigure.AutoConfigurationPackages

beanDefinitionName=org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration

beanDefinitionName=propertySourcesPlaceholderConfigurer

beanDefinitionName=org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration$TomcatWebSocketConfiguration

beanDefinitionName=websocketServletWebServerCustomizer

beanDefinitionName=org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration

beanDefinitionName=org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$EmbeddedTomcat

beanDefinitionName=tomcatServletWebServerFactory

beanDefinitionName=org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration

beanDefinitionName=servletWebServerFactoryCustomizer

beanDefinitionName=tomcatServletWebServerFactoryCustomizer

beanDefinitionName=org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor

beanDefinitionName=org.springframework.boot.context.internalConfigurationPropertiesBinderFactory

beanDefinitionName=org.springframework.boot.context.internalConfigurationPropertiesBinder

beanDefinitionName=org.springframework.boot.context.properties.BoundConfigurationProperties

beanDefinitionName=org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.methodValidationExcludeFilter

beanDefinitionName=server-org.springframework.boot.autoconfigure.web.ServerProperties

beanDefinitionName=webServerFactoryCustomizerBeanPostProcessor

beanDefinitionName=errorPageRegistrarBeanPostProcessor

beanDefinitionName=org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletConfiguration
beanDefinitionName=dispatcherServlet 前端控制器

beanDefinitionName=spring.mvc-org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties

beanDefinitionName=org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletRegistrationConfiguration

beanDefinitionName=dispatcherServletRegistration

beanDefinitionName=org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration

beanDefinitionName=org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration

beanDefinitionName=taskExecutorBuilder

beanDefinitionName=applicationTaskExecutor

beanDefinitionName=spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties

beanDefinitionName=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration

beanDefinitionName=error
beanDefinitionName=beanNameViewResolver 自定义视图解析器

beanDefinitionName=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$DefaultErrorViewResolverConfiguration

beanDefinitionName=conventionErrorViewResolver

beanDefinitionName=spring.resources-org.springframework.boot.autoconfigure.web.ResourceProperties

beanDefinitionName=spring.web-org.springframework.boot.autoconfigure.web.WebProperties

beanDefinitionName=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

beanDefinitionName=errorAttributes

beanDefinitionName=basicErrorController

beanDefinitionName=errorPageCustomizer

beanDefinitionName=preserveErrorControllerTargetClassPostProcessor

beanDefinitionName=org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration

beanDefinitionName=requestMappingHandlerAdapter

beanDefinitionName=requestMappingHandlerMapping

beanDefinitionName=welcomePageHandlerMapping

beanDefinitionName=localeResolver

beanDefinitionName=themeResolver

beanDefinitionName=flashMapManager

beanDefinitionName=mvcConversionService

beanDefinitionName=mvcValidator

beanDefinitionName=mvcContentNegotiationManager

beanDefinitionName=mvcPatternParser

beanDefinitionName=mvcUrlPathHelper

beanDefinitionName=mvcPathMatcher

beanDefinitionName=viewControllerHandlerMapping

beanDefinitionName=beanNameHandlerMapping

beanDefinitionName=routerFunctionMapping

beanDefinitionName=resourceHandlerMapping

beanDefinitionName=mvcResourceUrlProvider

beanDefinitionName=defaultServletHandlerMapping

beanDefinitionName=handlerFunctionAdapter

beanDefinitionName=mvcUriComponentsContributor
beanDefinitionName=httpRequestHandlerAdapter

beanDefinitionName=simpleControllerHandlerAdapter

beanDefinitionName=handlerExceptionResolver
beanDefinitionName=mvcViewResolver

beanDefinitionName=mvcHandlerMappingIntrospector

beanDefinitionName=viewNameTranslator

beanDefinitionName=org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter
beanDefinitionName=defaultViewResolver
beanDefinitionName=viewResolver

beanDefinitionName=requestContextFilter

beanDefinitionName=org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

beanDefinitionName=formContentFilter

beanDefinitionName=org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration

beanDefinitionName=mbeanExporter

beanDefinitionName=objectNamingStrategy

beanDefinitionName=mbeanServer

beanDefinitionName=org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration

beanDefinitionName=springApplicationAdminRegistrar

beanDefinitionName=org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration

beanDefinitionName=forceAutoProxyCreatorToUseClassProxying

beanDefinitionName=org.springframework.boot.autoconfigure.aop.AopAutoConfiguration

beanDefinitionName=org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration

beanDefinitionName=applicationAvailability

beanDefinitionName=org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$Jackson2ObjectMapperBuilderCustomizerConfiguration

beanDefinitionName=standardJacksonObjectMapperBuilderCustomizer

beanDefinitionName=spring.jackson-org.springframework.boot.autoconfigure.jackson.JacksonProperties

beanDefinitionName=org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration

beanDefinitionName=jacksonObjectMapperBuilder

beanDefinitionName=org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$ParameterNamesModuleConfiguration

beanDefinitionName=parameterNamesModule

beanDefinitionName=org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperConfiguration
beanDefinitionName=jacksonObjectMapper

beanDefinitionName=org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration

beanDefinitionName=jsonComponentModule

beanDefinitionName=org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration

beanDefinitionName=org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration

beanDefinitionName=lifecycleProcessor

beanDefinitionName=spring.lifecycle-org.springframework.boot.autoconfigure.context.LifecycleProperties

beanDefinitionName=org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration$StringHttpMessageConverterConfiguration
beanDefinitionName=stringHttpMessageConverter SpringMVC处理JSON

beanDefinitionName=org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration

beanDefinitionName=mappingJackson2HttpMessageConverter

beanDefinitionName=org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration

beanDefinitionName=org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration
beanDefinitionName=messageConverters

beanDefinitionName=org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration

beanDefinitionName=spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties

beanDefinitionName=org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration

beanDefinitionName=spring.sql.init-org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties

beanDefinitionName=org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor

beanDefinitionName=org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration

beanDefinitionName=scheduledBeanLazyInitializationExcludeFilter

beanDefinitionName=taskSchedulerBuilder

beanDefinitionName=spring.task.scheduling-org.springframework.boot.autoconfigure.task.TaskSchedulingProperties

beanDefinitionName=org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration

beanDefinitionName=restTemplateBuilderConfigurer

beanDefinitionName=restTemplateBuilder

beanDefinitionName=org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration$TomcatWebServerFactoryCustomizerConfiguration

beanDefinitionName=tomcatWebServerFactoryCustomizer

beanDefinitionName=org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration

beanDefinitionName=org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
beanDefinitionName=characterEncodingFilter SpringMVC处理中文的过滤器

beanDefinitionName=localeCharsetMappingsCustomizer

beanDefinitionName=org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration

beanDefinitionName=multipartConfigElement
beanDefinitionName=multipartResolver SpringMVC处理文件上传

beanDefinitionName=spring.servlet.multipart-org.springframework.boot.autoconfigure.web.servlet.MultipartProperties

beanDefinitionName=org.springframework.aop.config.internalAutoProxyCreator

4.自动配置: 默认扫描包结构.

官方文档: https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.structuring-your-code.using-the-default-package

如何修改默认配置

如何修改默认扫描包结构

1.需求: 要求能扫描 com.zzw 包下的 HiController.java, 应该如何处理?

2.创建: D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\HiController.java, 并测试, 这时是访问不到的

java 复制代码
@Controller
public class HiController {
    //返回hi,world
    @RequestMapping("/hi")
    @ResponseBody
    public String hello() {
        return "hi, world";
    }
}

3.修改MainApp.java, 增加扫描的包, 并完成测试.

java 复制代码
/**
 * @SpringBootApplication: 表示这是一个springboot引用/项目
 * @SpringBootApplication(scanBasePackages = "com.zzw")
 * 解读: scanBasePackages = "com.zzw" 指定SpringBoot要扫描的包和子包
 * 如果有多个包, 可以这样指定: 用数组 scanBasePackages = {"com.zzw","xxx.yyy.zzz"}
 */
@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {}


resources\application.properties配置大全

1.SpringBoot项目最重要也是最核心的配置文件就是application.properties, 所有的框架配置都可以在这个配置文件中说明.

2.地址: https://blog.csdn.net/pbrlovejava/article/details/82659702

resources\application.properties修改配置

各种配置都有默认, 可以在 resources\application.properties 修改, application.properties 文件我们 可以手动创建

手动输入如果没有提示, 安装插件

yaml 复制代码
#修改server的监听端口
server.port=8081
#修改单个文件上传的大小. 默认是1MB, 修改成10MB
#让我们解读一下这个配置是在哪里读取的!
#multipart.max-file-size 属性可以指定springboot上传文件的大小限制-体现约定优于配置
#默认配置最终都是映射到某个类, 比如multipart.max-file-size 会映射/关联到 MultipartProperties 类
#把光标放在该属性, 输入ctrl+b, 就可以定位这个属性是关联到哪个类(属性类)
spring.servlet.multipart.max-file-size=10MB
resources\application.properties常用配置

●常用配置一览

yaml 复制代码
#端口号
server.port=10000
#应用的上下文路径(项目路径)
server.servlet.context-path=/allModel

#指定POJO扫描包来让mybatis自动扫描到自定义的POJO
mybatis.type-aliases-package=com.cxs.allmodel.model

#指定mapper.xml的路径
#(application上配置了@MapperScan(扫面mapper类的路径)和pom.xml中放行了mapper.xml后,
#配置mapper-locations没有意义。如果mapper类和mapper.xml不在同一个路径下时,mapper-locations就有用
了)
mybatis.mapper-locations=classpath:com/cxs/allmodel/mapper

#session失效时间(单位s)
spring.session.timeout=18000

#数据库连接配置
#mysql数据库url
mysql.one.jdbc-url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/shanghai&usessL=false
#mysql数据库用户名
mysql.one.username
#数据库密码
mysql.one.password=
#线程池允许的最大连接数
mysgl.one.maximum-pool-size=15

#日志打印:日志级别 trace<debug<info<warn<error<fatal默认级别为info,即默认打印info及其以上级别的日志
#logging.evel设置日志级别,后面跟生效的区域,比如root表示整个项目,也可以设置为某个包下,也可以具体到某个类名(日志级别的值不区分大小写)
logging.level.com.cxs.allmodel.=debug
logging.level.com.cxs.allmodel.mapper=debug
logging.level.org.springframework.web=info
logging.level.org.springframeworktransaction=info
logging.level.org.apache.lbatis=info
logging.level.org:mybatis=info
logging.level.com.github.pagehelper = info
logging.level.root=info
#日志输出路径
logging.file=/tmp/api/allmodel.log

#配置pagehelper分页插件
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql

#jackson时间格式化
spring.jackson.serialization.fail-on-empty-beans=false
#指定日期格式,比如yyyy-MM-dd HH:mm:ss,或者具体的格式化类的全限定名
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
#指定日期格式化时区,比如America/Los_Angeles或各GMT+10
spring.jackson.time-zone=GMT+8

#设置统一字符集
spring.http.encoding.charset=utf8

#redis连接配置
#redis所在主机ip地址
spring.redis.host=
#redis服务器密码
spring.redis.password=
#redis服务器端口号
spring.redis.port=
#redis数据库的索引编号(0到15)
spring.redis.database=14
##连接池的最大活动连接数量,使用负值无限制
#spring.redis.pool.max-active=8
#
##连接池的最大空闲连接数量,使用负值表示无限数量的空闲连接
#spring.redis.pool.max-idle=8
#
##连接池最大阻塞等待时间,使用负值表示没有限制
#spring.redis.pool.max-wait=-1ms
#
##最小空闲连接数量,使用正值才有效果
#spring.redis.pool.min-idle=0
#
## 是否启用SSL连接.
##spring.redis.ssl=false
#
##连接超时,毫秒为单位
#spring.redis.timeout= 18000ms
#
## 集群模式下,集群最大转发的数量
#spring.redis.cluster.max-redirects=
#
## 集群模式下,逗号分隔的键值对(主机:端口)形式的服务器列表
#spring.redis.cluster.nodes=
#
## 哨兵模式下,Redis主服务器地址
#spring.redis.sentinel.master=
#
## 哨兵模式下,逗号分隔的键值对(主机:端口)形式的服务器列表
#spring.redis.sentinel.nodes= 127.0.0.1:5050,127.0.0.1:5060
resources\application.properties自定义配置

●还可以在properties文件中自定义配置, 通过 @Value("${}") 获取对应属性值.

xml 复制代码
#自定义配置属性
my.webSite=https://www.baidu.com
java 复制代码
@Controller
public class HiController {

    //需求: webSite 属性值从 application.properties 的k-v获取
    //当HiController作为一个bean被创建时, webSite属性值被赋值
    @Value("${my.webSite}")
    private String webSite;

    //返回hi,world
    @RequestMapping("/hi")
    @ResponseBody
    public String hello() {
        System.out.println("webSite = " + webSite);
        return "hi, world";
    }
}

SpringBoot在哪配置读取application.properties

1.打开 ConfigFileApplicationListener.java, 看一下源码

file:./config/*/ ⇒ 表示 项目根目录/config/a目录下

自动配置遵守按需加载原则

基本说明

1.自动配置遵守按需加载原则: 也就是说, 引入了哪个场景starter就会加载该场景关联的jar包, 没有引入的starter, 则不会加载其关联jar

2.SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面

3.在SpringBoot的自动配置包, 一般是XxxAutoConfiguration.java, 对应XxxProperties.java, 如图

XxxAutoConfiguration.java 包含 XxxProperties.java

实例演示

1.以 application.properties, MultipartProperties 和 MultipartAutoConfiguration 来说明. SpringBoot在创建MultipartProperties bean时,会去读取application.properties文件, 将数据封装,这个Bean会被注入关联的MultipartAutoConfiguration Bean里面。


相关推荐
zaim135 分钟前
计算机的错误计算(一百一十四)
java·c++·python·rust·go·c·多项式
2401_857439692 小时前
Spring Boot新闻推荐系统:用户体验优化
spring boot·后端·ux
hong_zc2 小时前
算法【Java】—— 二叉树的深搜
java·算法
进击的女IT3 小时前
SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS
java·spring boot·后端
Miqiuha3 小时前
lock_guard和unique_lock学习总结
java·数据库·学习
杨半仙儿还未成仙儿4 小时前
Spring框架:Spring Core、Spring AOP、Spring MVC、Spring Boot、Spring Cloud等组件的基本原理及使用
spring boot·spring·mvc
一 乐4 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
数云界4 小时前
如何在 DAX 中计算多个周期的移动平均线
java·服务器·前端
阑梦清川4 小时前
Java继承、final/protected说明、super/this辨析
java·开发语言
快乐就好ya6 小时前
Java多线程
java·开发语言