SpringBoot学习笔记

1. 简介

繁琐的配置,整合第三方框架的配置问题,导致了开发和部署效率的降低
SpringBoot是和Spring框架紧密结合用于提升Spring开发者体验的工具
SpringBoot集成了大量常用的第三方库配置,这些第三方库几乎可以是零配置的开箱即用,大部分的SpringBoot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑

2. 优点

  1. 基于Spring4
  2. 简化编码
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

替代了

<!-- .....省略其他依赖 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.0.7.RELEASE</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.0.7.RELEASE</version>
    <scope>compile</scope>
</dependency>
  1. 简化监控
  2. 简化配置:使用注解’
    @Configuration表示该类是个配置类
    @bean表示该方法返回一个Bean
  3. 简化部署
    生成jar包,使用java -jar xxx.jar一键式启动项目

PS:阿里镜像

<mirror>
	<id>nexus-aliyun</id>
	<mirrorOf>*</mirrorOf>
	<name>Nexus aliyun</name>
	<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

3. SpringBoot返回Json数据及数据封装

使用@RestController注解返回Json格式的数据
@RestController注解包含:@Controller和ResponseBody注解
SpringBoot默认使用的Json解析技术框架是 Jackson

4.SpringBoot 使用slf4j进行日志记录

SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。

4.1application.yml中对日志的配置

application.yml 文件是 Spring Boot 中唯一一个需要配置的文件
 yml 文件的层次感特别好、更直观、对格式要求比较高

application.yml对日志的配置

logging:
  config: logback.xml
  level:
    com.itcodai.course03.dao: INFO

logging.config:指定项目启动读取的配置文件
logging.level:指定具体的mapper中日志的输出级别
常用的日志级别按照从高到低依次为:ERROR、WARN、INFO、DEBUG。

**logback.xml配置文件:**可以定义日志输出的格式、路径、、控制台输出格式、文件大小、保存时长等

<!--定义日志输出格式和存储路径-->
<configuration>
	<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
	<property name="FILE_PATH" value="D:/logs/course03/demo.%d{yyyy-MM-dd}.%i.log" />
</configuration>
<!--
%date表示日期
%thread表示线程名
%-5level表示级别从左显示5个字符宽带
%logger{36}表示logger名字最长36字符
%msg表示日志消息
%n换行符

“FILE_PATH”文件路径,value指具体位置
%i表示第i个文件
日志存储的路径必须要是绝对路径。
-->

<!--定义控制台输出-->
<configuration>
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
            <!-- 按照上面配置的LOG_PATTERN来打印日志 -->
			<pattern>${LOG_PATTERN}</pattern>
		</encoder>
	</appender>
</configuration>
<!--
使用 <appender> 节点设置个控制台输出(class="ch.qos.logback.core.ConsoleAppender")的配置,定义为 “CONSOLE”。
使用上面定义好的输出格式(LOG_PATTERN)来输出,使用 ${} 引用进来即可。
-->


<!--定义日志文件的相关参数-->

<configuration>
	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 按照上面配置的FILE_PATH路径来保存日志 -->
			<fileNamePattern>${FILE_PATH}</fileNamePattern>
			<!-- 日志保存15天 -->
			<maxHistory>15</maxHistory>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<!-- 单个日志文件的最大,超过则新建日志文件存储 -->
				<maxFileSize>10MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>

		<encoder>
			<!-- 按照上面配置的LOG_PATTERN来打印日志 -->
			<pattern>${LOG_PATTERN}</pattern>
		</encoder>
	</appender>
</configuration>
<!--
使用 <appender> 定义一个名为 “FILE” 的文件配置
配置日志文件保存的时间、单个日志文件存储的大小、以及文件保存的路径和日志的输出格式。
-->


<!--定义日志输出级别-->
<configuration>
	<logger name="com.itcodai.course03" level="INFO" />
	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	</root>
</configuration>
<!--
使用 <logger> 定义项目中默认的日志输出级别
使用 <root> 引用上面定义好的控制台日志输出和日志文件的参数
-->

4.2 使用logger在项目中打印日志

@RestController
@RequestMapping("/test")
public class TestController {

    private final static Logger logger = LoggerFactory.getLogger(TestController.class);

    @RequestMapping("/log")
    public String testLog() {
        logger.debug("=====测试日志debug级别打印====");
        logger.info("======测试日志info级别打印=====");
        logger.error("=====测试日志error级别打印====");
        logger.warn("======测试日志warn级别打印=====");

        // 可以使用占位符打印出一些参数信息
        String str1 = "blog.itcodai.com";
        String str2 = "blog.csdn.net/eson_15";
        logger.info("======倪升武的个人博客:{};倪升武的CSDN博客:{}", str1, str2);
        return "success";
    }
}

5. SpringBoot中的项目属性配置

5.1 少量配置信息的情形

假设订单服务的端口号是8002,做如下配置

server:
  port: 8001

# 配置微服务的地址
url:
  # 订单微服务的地址
  orderUrl: http://localhost:8002

使用 @Value 来配置订单服务地址

在属性上使用 @Value注解 即可获取到配置文件中的配置信息

@RestController
@RequestMapping("/test")
public class ConfigController {

    private static final Logger LOGGER = LoggerFactory.getLogger(ConfigController.class);

    @Value("${url.orderUrl}")
    private String orderUrl;
    
    @RequestMapping("/config")
    public String testConfig() {
        LOGGER.info("=====获取的订单服务地址为:{}", orderUrl);
        return "success";
    }
}

@Value注解通过 ${key} 即可获取配置文件中和key对应的value值。

5.2 多个配置信息的情形

# 配置多个微服务的地址
url:
  # 订单微服务的地址
  orderUrl: http://localhost:8002
  # 用户微服务的地址
  userUrl: http://localhost:8003
  # 购物车微服务的地址
  shoppingUrl: http://localhost:8004

对于这种情况,我们可以先定义一个 MicroServiceUrl 类来专门保存微服务的 url,

@Component
@ConfigurationProperties(prefix = "url")
public class MicroServiceUrl {

    private String orderUrl;
    private String userUrl;
    private String shoppingUrl;
    // 省去get和set方法
}

使用 @ConfigurationProperties 注解 并且使用 prefix 来指定一个前缀
前缀名 + 属性名就是配置文件中定义的 key
同时,该类上面需要加上 @Component 注解,把该类作为组件放到Spring容器中,让 Spring 去管理,我们使用的时候直接注入即可

@ConfigurationProperties 注解需要导入他的依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>

不需要在代码中一个个引入这些微服务的 url 了,直接通过 @Resource 注解将刚刚写好配置类注入进来

@RestController
@RequestMapping("/test")
public class TestController {

    private static final Logger LOGGER = LoggerFactory.getLogger(TestController.class);

    @Resource
    private MicroServiceUrl microServiceUrl;
    
    @RequestMapping("/config")
    public String testConfig() {
        LOGGER.info("=====获取的订单服务地址为:{}", microServiceUrl.getOrderUrl());
        LOGGER.info("=====获取的用户服务地址为:{}", microServiceUrl.getUserUrl());
        LOGGER.info("=====获取的购物车服务地址为:{}", microServiceUrl.getShoppingUrl());

        return "success";
    }
}

5.3 指定项目配置文件

实际项目中,一般有两个环境:开发环境和生产环境。
新建两个配置文件: application-dev.ymlapplication-pro.yml,分别用来对开发环境和生产环境进行相关配置

# 开发环境配置文件
server:
  port: 8001
# 开发环境配置文件
server:
  port: 8002

然后在 application.yml 文件中指定读取哪个配置文件即可

spring:
  profiles:
    active:
    - dev

这样就可以在开发的时候,指定读取 application-dev.yml 文件,访问的时候使用 8001 端口,部署到服务器后,只需要将 application.yml 中指定的文件改成 application-pro.yml 即可,然后使用 8002 端口访问,非常方便

6. SpringBoot中的MVC支持

Spring Boot 的 MVC 支持主要来介绍实际项目中最常用的几个注解

6.1@RestController

@RestController 注解包含了原来的 @Controller@ResponseBody 注解,使用 @RestController 之后就不用再使用 @Controller 了。但是需要注意一个问题:如果是前后端分离,不用模板渲染的话,比如 Thymeleaf,这种情况下是可以直接使用 @RestController 将数据以 json 格式传给前端,前端拿到之后解析;但如果不是前后端分离,需要使用模板来渲染的话,一般 Controller 中都会返回到具体的页面,那么此时就不能使用 @RestController

6.2 @RequestMapping

@RequestMapping 是一个用来处理请求地址映射的注解,它可以用于类上,也可以用于方法上。

该注解有6个属性,一般在项目中比较常用的有三个属性:value、method 和 produces

**value:**指定请求的实际地址,value 可以省略不写

**method:**指定请求的类型,主要有 GET、PUT、POST、DELETE,默认为 GET

**produces:**指定返回内容类型,如 produces = “application/json; charset=UTF-8”

6.3 @PathVariable

@PathVariable注解主要是用来获取 url 参数

@GetMapping("/user/{id}")
public String testPathVariable(@PathVariable Integer id) {
	System.out.println("获取到的id为:" + id);
	return "success";
}

ps: 要 url 中占位符中的 id 值直接赋值到参数 id 中,需要保证 url 中的参数和方法接收参数一致,否则就无法接收

如果不一致,需要用 @PathVariable 中的 value 属性来指定对应关系

@RequestMapping("/user/{idd}")
public String testPathVariable(@PathVariable(value = "idd") Integer id) {
	System.out.println("获取到的id为:" + id);
	return "success";
}

6.4 @RequestParam

@RequestParam 注解:获取请求参数的

@PathValiable注解的区别:

@PathValiable 是从 url 模板中获取参数值,即:http://localhost:8080/user/{id}

@RequestParam是从 request 里面获取参数值,即:http://localhost:8080/user?id=1

value属性外,required属性和defaultValue属性比较常用

required 属性: true 表示该参数必须要传,否则就会报 404 错误,false 表示可有可无。

defaultValue 属性: 默认值,表示如果请求中没有同名参数时的默认值。

6.5 @RequestBody

@RequestBody 注解 用于接收前端传来的实体,接收参数也是对应的实体
@RequestBody 注解 用于 POST 请求上,接收 json 实体参数

在传递的参数比较多的情况下,使用 @RequestBody 接收会非常方便

//1.封装一个实体来接收参数
public class User {
	private String username;
	private String password;
	// set get
}


@PostMapping("/user")
public String testRequestBody(@RequestBody User user) {
	System.out.println("获取到的username为:" + user.getUsername());
	System.out.println("获取到的password为:" + user.getPassword());
	return "success";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值