SpringBoot项目实战:从零搭建高效开发环境

新建SpringBoot项目:

项目初始配置:

Maven配置:

其中maven配置国内的阿里云的镜像。

启动日志优化:

新建src/main/resources/logback-spring.xml

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 修改一下路径-->
    <property name="PATH" value="./log"></property>
​
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
<!--            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %blue(%-50logger{50}:%-4line) %thread %green(%-18X{LOG_ID}) %msg%n</Pattern>-->
            <Pattern>%d{ss.SSS} %highlight(%-5level) %blue(%-30logger{30}:%-4line) %thread %green(%-18X{LOG_ID}) %msg%n</Pattern>
        </encoder>
    </appender>
​
    <appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${PATH}/trace.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${PATH}/trace.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <layout>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-50logger{50}:%-4line %green(%-18X{LOG_ID}) %msg%n</pattern>
        </layout>
    </appender>
​
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${PATH}/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${PATH}/error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <layout>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-50logger{50}:%-4line %green(%-18X{LOG_ID}) %msg%n</pattern>
        </layout>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
​
    <root level="ERROR">
        <appender-ref ref="ERROR_FILE" />
    </root>
​
    <root level="TRACE">
        <appender-ref ref="TRACE_FILE" />
    </root>
​
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration> 
主要的优化:1、将日志输出风格做了精简。
2、error级别的日志会生成本地log文件。
3、日志的堆栈信息也写入文件。

修改一下启动类

复制代码
​
@SpringBootApplication
public class Application {
    private static final Logger LOG = LoggerFactory.getLogger(Application.class);
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        Environment env = app.run(args).getEnvironment();
        LOG.info("启动成功!!");
        LOG.info("地址: \thttp://127.0.0.1:{}", env.getProperty("server.port"));
    }
}
​

然后配置一下服务器的端口号:

复制代码
spring.application.name=01wiki
server.port=8080

此时再启动,就变得人性化一些了:

开发Hello World接口:

1、Application更换一个名称:WikiApplication

2、新建Controller:

复制代码
@RestController
public class TestController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }
}

3、运行:

接下来运行看一下:

4、底层探究:

在这个controller编写中用到了两个注解,下面来进一步了解它们。

@RestController:@Controller和@ResponseBody的组合。

@RequestBody它表示的是用来返回字符串或者JSON对象。

@RequestMapping:

对于一个请求通常来说是分为这四种:GET、POST、PUT、DELETE,此注解表示的是所有方式都支持,如果说只想支持GET请求,则需要这样来写:

复制代码
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String hello() {
        return "hello world";
    }
}

而其它的方式改下method既可,另外还有一种写法,就是不同的注解对应不同的方式,如下:

复制代码
@GetMapping
@PostMapping
@DeleteMapping
@PutMapping
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String hello() {
    return "hello world";
}
@ComponentScan:

Controller是如何被Spring扫描到的呢?注解内部存在相关的扫码注解:@ComponentScan

接下来做一个实验,来体会一下该注解的用处,就是将Appliation的这个类放到一个新的包名中, 也就是controller不是在WikiApplication所在层级的子包中了,运行再来访问咱们的这个接口,报错了。

原因就是由于默认只会扫码Application同一级的类及子包的类,而要想解决此问题,就需要用到这个注解了,如下:

复制代码
@ComponentScan("com.hnjt")
@RestController
public class TestController {
    @GetMapping
    @PostMapping
    @DeleteMapping
    @PutMapping
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String hello() {
        return "hello world";
    }
}

使用HTTP Client测试接口:

测试Post请求:

复制代码
@RequestMapping("/hello/post")
public String helloPost(String name) {
    return "hello world"+ name;
}

配置文件【自定义配置项】:

热部署:

引入依赖包:

在pom.xml添加依赖

复制代码
<!-- 热部署 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

开启静态自动编译:

application.properties

复制代码
spring.devtools.restart.enabled=true

总结:

Springboot的入门篇主要是环境配置。

相关推荐
Fox爱分享16 分钟前
都问程序员双十一买什么,我的答案一定是这块专业编程显示器
后端·程序员·ai编程
SL_staff23 分钟前
制造订单交付闭环实践:用跨部门计划模板解决缺料-停机-返工三角死循环
java·开源·产品
device_Any26 分钟前
接口文档写着三个字段,接口返回了五个
android·java·linux
Small-Young28 分钟前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·spring boot·mysql·postgresql·乐观锁·并发控制
CCblandy29 分钟前
缓存淘汰实测:一次全表扫描把 LRU 命中率从 46% 打到 38%,W-TinyLFU 守住 50% 却贵 11 倍
后端·python·缓存·性能优化·架构
Wang's Blog32 分钟前
Java 项目实战: 交友项目 - 小视频模块实战:访客记录、FastDFS 存储与 SpringCache 缓存
java·缓存·交友
武子康39 分钟前
DOA 100%、GSC 改善 12 dB,ESP32-P4 远场拾音就能用了吗?
人工智能·后端·agent
香蕉大香蕉(06敬畏市场)43 分钟前
MySQL 单点详解(09)
java·数据库·mysql·面试·八股·大厂实习
吹什么轩1 小时前
constexpr 完全指南:从 const 的两种含义,到编译期计算的四次演进
java·前端·javascript
愚农搬码1 小时前
企业为什么需要表单引擎,而不是继续手写 Vue 表单?
后端