SpringBoot笔记

自动配置:

  pom.xml

  • spring-boot-dependencies:核心依赖在父工程中!
  • 我们在写或者引入一些SpringBoot依赖的时候,不需要指定版本号,就是因为有这些版本仓库

启动器:

  <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter</artifactId>
  </dependency>
  • 启动器:SpringBoot的启动场景
  • 如spring-boot-starter-web,他就会帮我们自动导入web环境所有的依赖
  • SpringBoot会将所有的功能场景,变成一个个启动器
  • 我们要使用什么功能,只需找到对应的启动器就ok了 -starter

主程序:

用于启动整个SpringBoot项目(启动器需要放在最外层的包下,才可扫描到所有的子类)

package com.wanshi;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication //标注这是一个SpringBoot的主启动类
public class ApplicationMain {

    public static void main(String[] args) {
        //将SpringBoot应用启动、
        //参数一:应用入口类  参数类:命令行参数
        SpringApplication.run(ApplicationMain.class,args);
    }

}

SpringBoot配置文件:

 SpringBoot到底可以配置哪些东西?        

    1.了解原理:

        SpringBoot使用一个全局配置文件,名称固定:application.yml 或 application.properties

        作用:修改SpringBoot自动配置的默认值,如修改端口号等等。。

#yml配置端口号
server:
  port: 80

可以在yml中写好一个类的 默认属性:

user:
  username: 李四
  age: 19
  list:
    - code
    - music

在类中引用:

package com.wanshi.spring.entity;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

@Data
@Component
@ConfigurationProperties(prefix = "user")
public class user {
    private String username;
    private String age;
    List list;
}

最后打印即可看到类被赋值了:

 核心注解:@ConfigurationProperties,将配置文件中声明的属性映射到实体类上,举一反三,例如让他用于配置类,jdbc的URL等

JSR303校验

在user实体类加入数据校验注解,并且在属性上加入格式限制注解,可进行数据格式校验

package com.wanshi.spring.entity;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.Email;
import java.util.List;

@Data
@Component
@ConfigurationProperties(prefix = "user")
@Validated //数据校验
public class user {
    @Email()
    private String username;
    private String age;
    List list;
}

如果给的参数格式不正确,会报错:

格式限制如下:

SpringBoot接收参数并返回json数据

前台进行ajax或axios请求时,后台需要加上@CrossOrigin注解,以便进行跨域请求

一个简单接收json请求并返回数据的controller:

package com.wanshi.controller;


import com.wanshi.spring.service.userService;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController //返回所有数据为json格式
@CrossOrigin //支持跨域请求
public class HelloWorldController {

    @Resource
    private userService userService;

    @GetMapping("/hello")
    public String hello(){
        return "hello World";
    }

    //如若要使用,最好是下面这样
    @RequestMapping("/hello")
    public String hello(@RequestBody user user){
        return "hello World";
    }

}

当你在页面输入localhost/hello后,会在页面输出打印一句:hello World,下面的hello请求会接收前台json请求发送的参数,并且自动映射

接下来照常进行三层架构,返回数据即可,数据最好返回 统一格式:

package com.wanshi.spring.pojo;


import org.springframework.stereotype.Component;

//公共json类
@Component
@Data
public class Json<C> {

    private Integer code;
    private String msg;
    private C data;

    public static Json create(int _code,String _msg,Object _data){
        Json json=new Json();
        json.code = _code;
        json.msg = _msg;
        json.data = _data;
        return json;
    }

    public static Json create(int _code,String _msg){
        return create(_code,_msg,null);
    }
}

SpringBoot配置slf4j日志

百度百科里的一段话:

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

要使用它也很简单,先在要使用的类中引入对象:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Test {
    private static final Logger logger = LoggerFactory.getLogger(Test.class);
    // ……
}

使用方式:

logger.info("日志打印了");

Spring Boot 对 slf4j 支持的很好,内部已经集成了 slf4j,一般我们在使用的时候,会对slf4j 做一下配置。配置如下:

application.yml:

logging:
  config: src/main/resources/logback/logback.xml #resources文件夹下的logback下的日志文件
  level:
    com.wanshi.spring.mapper: trace

logback.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
    <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
    <!-- 定义日志存储的路径,不要配置相对路径 -->
    <property name="FILE_PATH" value="E:/logs/demo.%d{yyyy-MM-dd}.%i.log" />

    <!-- 控制台输出日志 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 按照上面配置的LOG_PATTERN来打印日志 -->
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!--每天生成一个日志文件,保存15天的日志文件。rollingFile是用来切分文件的 -->
    <appender name="FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${FILE_PATH}</fileNamePattern>
            <!-- keep 15 days' worth of history -->
            <maxHistory>15</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 日志文件的最大大小 -->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <!-- project default level -->
    <logger name="src" level="INFO" />

    <!-- 日志输出级别 常用的日志级别按照从高到低依次为:ERROR、WARN、INFO、DEBUG。 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

效果:

main方法中引用:

    public static void main(String[] args) {
        logger.info("日志打印:项目启动");
        //将SpringBoot应用启动
        SpringApplication.run(ApplicationMain.class,args);
        logger.info("日志打印:项目启动完成。。");
    }

Spring Boot中的项目属性配置

在项目中,很多时候需要用到一些配置的信息,这些信息可能在测试环境和生产环境下会有不同的配置,后面根据实际业务情况有可能还会做修改,针对这种情况,我们不能将这些配置在代码中写死,最好就是写到配置文件中。比如可以把这些信息写到 application.yml 文件中。

1. 少量配置信息的情形

举个例子,在微服务架构中,最常见的就是某个服务需要调用其他服务来获取其提供的相关信息,那么在该服务的配置文件中需要配置被调用的服务地址,比如在当前服务里,我们需要调用订单微服务获取订单相关的信息,假设 订单服务的端口号是 8002,那我们可以做如下配置:

#yml配置端口号
server:
  port: 80

url:
  orderUrl: http://localhost:8082

在业务代码中我们使用@Value来获取配置文件中的值:

@Value("${url.orderUrl}")
private String orderUrl;

打印属性结果: 

 在实际项目中也是这么用的,后面如果因为服务器部署的原因,需要修改某个服务的地址,那么只要在配置文件中修改即可。

2. 多个配置信息的情形

随着业务复杂度的增加,一个项目中可能会有越来越多的微服务,某个模块可能需要调用多个微服务获取不同的信息,那么就需要在配置文件中配置多个微服务的地址。可是,在需要调用这些微服务的代码中,如果这样一个个去使用 @Value 注解引入相应的微服务地址的话,太过于繁琐,也不科学。

所以,在实际项目中,业务繁琐,逻辑复杂的情况下,需要考虑封装一个或多个配置类。举个例子:假如在当前服务中,某个业务需要同时调用订单微服务、用户微服务和购物车微服务,分别获取订单、用户和购物车相关信息,然后对这些信息做一定的逻辑处理。那么在配置文件中,我们需要将这些微服务的地址都配置好:

# 配置多个微服务的地址
url:
  orderUrl: http://localhost:8082
  userUrl: http://localhost:8083
  shappingUrl: http://localhost:8084

也许实际业务中,远远不止这三个微服务,甚至十几个都有可能。对于这种情况,我们可以先定义一个 UrlConfig 类来专门保存微服务的 url,如下:

package com.wanshi.spring.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties("url")
public class UrlConfig {
    private String orderUrl;
    private String userUrl;
    private String shappingUrl;
}

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

使用:

 @Resource
    private UrlConfig urlConfig;

    @RequestMapping("/hello")
    public String hello(@RequestBody user user){
        logger.info("=====获取的订单服务地址为:{}", urlConfig.getOrderUrl());
        logger.info("=====获取的用户服务地址为:{}", urlConfig.getUserUrl());
        logger.info("=====获取的购物车服务地址为:{}", urlConfig.getShappingUrl());
        return "hello World";
    }

在请求hello时,会打印:

3. 指定项目配置文件

我们知道,在实际项目中,一般有两个环境:开发环境和生产环境。开发环境中的配置和生产环境中的配置往往不同,比如:环境、端口、数据库、相关地址等等。我们不可能在开发环境调试好之后,部署到生产环境后,又要将配置信息全部修改成生产环境上的配置,这样太麻烦,也不科学。

最好的解决方法就是开发环境和生产环境都有一套对用的配置信息,然后当我们在开发时,指定读取开发环境的配置,当我们将项目部署到服务器上之后,再指定去读取生产环境的配置。

我们新建两个配置文件: application-dev.yml 和 application-pro.yml,分别用来对开发环境和生产环境进行相关配置。这里为了方便,我们分别设置两个访问端口号,开发环境用 8001,生产环境用 8002.

#开发环境端口号
server:
  port: 8081
#生产环境端口号
server:
  port: 8082

然后在 application.yml 文件中指定读取哪个配置文件即可。比如我们在开发环境下,指定读取 applicationn-dev.yml 文件,如下:

spring:
  profiles:
    active:
      - dev

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值