记录工作中使用Springboot相关知识

有关SpringBoot总结

一、前言:本文包括但不限于SpringBoot知识

二、有关SpringBoot的讲解。

1.SpringBoot是一款Spring家族的微服务框架,贯穿一个规则:约定大于配置!!!!通过多个服务之间定义良好的接口和契约联系起来,职责范围明确很重要!

2.SpringBoot并不是一门新的框架,它更像是一个组合。把原本需要繁琐配置的程序,简化为可以无需配置即可立即运行的程序(jar文件)。

做过SpringMVC的人,最头痛的就是各种配置,web.xml,spring配置,数据库配置等等等等。但是我们还发现,每次配置的东西都大体相同,无非是个别地方改一改,但是却要每次都配置一遍。

SpringBoot替我们解决了这一点,如果没有特殊要求,那么将按照默认配置进行操作,即约定大于配置。

3.SpringBoot集成了很多组件,内嵌jetty,tomcat等容器,支持多种持久层框架(我只用过mybatis,jdbc)。这主要是由于提供了starter模式的使用包,使得内嵌成为可能。

由于内嵌了tomcat和jetty容器,所以Springboot可以打包为jar或者war包。jar包的情况下可直接java -jar xxx.jar运行(如果需要读取文件,且文件也需要打包进jar的慎用,否则会出现路径错误问题)。

如果是war包,就直接放进外部配置好的tomcat的webapp下即可。

4.SpringBoot配置文件。它支持yml文件或property文件。我更喜欢用yml一点,因为更加方便、直观、简洁。

5.SpringBoot是微服务框架,最好每个服务有明确的负责范围,在一组或者多组服务器上部署多个服务来完成功能(不要和分布式搞混)。

三、根据Demo进行简单剖析

1.首先通过maven创建一个maven程序,然后再pom.xml里加入下列依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.chx.platform</groupId>
    <artifactId>platform</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <description>平台</description>
    <modules>
        <module>customerpro</module>
        <module>platformcommon</module>
    </modules>
    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <guava.version>19.0</guava.version>
        <fastjson-version>1.2.75</fastjson-version>
        <mybatisPlus.verison>3.1.1</mybatisPlus.verison>
    </properties>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2.此时,一个SpringBoot微服务框架已经搭起来了,只需要填充内容即可。首先是配置文件,在resources下创建application.yml文件(注意:没有特殊需求不要修改本文件名),demo如下:

spring:
  profiles:
    active: dev

说明:由于线上和线下的配置文件大多都不同,所以我们的项目分为开发环境-dev和线上环境prod,上线时只需要修改dev为prod即可,非常方便。如果只是练习的话,可以直接在application写配置而不区分环境。目前我知道的有dev,prod,test(其实只要文件名匹配即可)。

此处贴出demo,可自行百度。在resources下创建application-dev.yml文件(和上面对应)。

spring:
  application:
    name: CUSTOMER-SERVICE
  datasource:
    url: jdbc:mysql://192.168.1.41:3306/ppp?characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  redis:
    host: 192.168.1.41
    port: 6379
    password: root
server:
  port: 9527
mybatis-plus:
  mapper-locations: classpath:mappers/*Mapper.xml
  type-aliases-package: platformc.chx.customerp.dao.*Mapper

3.看上去已经万事俱备了,接下来创建一个java文件,作为主启动类。需要注意的是,SpringBoot的启动类比较特殊,它会从该类向下自动寻找,所以将改启动类放在最外层!!!!

package com.kh.xx;

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

@SpringBootApplication
public class PdsApplication {
    public static void main(String[] args) {
        SpringApplication.run(PdsApplication.class, args);
    }
}

SpringBootApplication该注解是

@SpringBootConfiguration(对@Configuration的封装,标注当前类是配置类。又相当于@Component表示希望被IOC容器管理)。

@EnableAutoConfiguration(Spring Boot会自动根据你jar包的依赖来自动配置项目)

@ComponentScan(会自动扫描指定包下的全部标有@Component的类,并装入bean容器)三个注解的默认值,可自行百度作用。

4.右键run即可。再次提醒,打包jar时,务必确保没有需要读取的文件被打包进去,否则会出现读取文件失败的情况。如AboutWordParamServiceImp.class.getResource("").getPath()获取当前路径,拼接文件名进行读取文件,会出现jar不可读取的情况!!!!

四、有关于starter

starter是将第三方程序统一配置、集成而给定的入口,可以通过application.yml进行更改。

那么如何开发自己程序的starter包:步骤:

1.需要打成jar包的程序引入spring-boot-configture

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

2.定义接口:

public interface WelcomeInterface {
    void sayHello();
}

3.编写能够通过application.yml修改的入口

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties("chx.name")
public class ConfigProperty {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

4.编写配置托管到springboot,并给予实例化入口:

@Configuration
@ConditionalOnClass
//能够让配置类生效
@EnableConfigurationProperties(ConfigProperty.class)
public class WelcomeAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public WelcomeInterface start(){
        //创建实例
        return new WelcomeImp();
    }
}

5.实现自定义的welcome接口

import org.springframework.beans.factory.annotation.Autowired;

public class WelcomeImp implements WelcomeInterface {
    @Autowired
    private ConfigProperty config;

    @Override
    public void sayHello() {
        System.out.println("Hello world" + config.getName());
    }
}

6.能够让springboot自动装配

在resource里的MATE-INF文件夹中(没有就自己创建一个)添加spring.factories文件,加入

org.springframework.boot.autoconfigure.EnableAutoConfiguration=myinterface.WelcomeAutoConfiguration

  注意红色字体部分是自己自动装配类的完整路径,即第四步的类。

7.将此程序打包,并加入到springboot的程序中。

利用maven的install功能,打包。在springboot程序中引入此包

<dependency>
            <groupId>MyUtils</groupId>
            <artifactId>Configs-starter</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
</dependency>

  在启动类中加入实现类进行测试。

  8.在controller层加不加@RequestBody的区别:

当请求ContentType是application/x-www-form-urlencoded; charset=UTF-8时,不用加@RequestBody,jquery的默认ajax即为此格式,所以不用加。其格式为key=value&key2=value2。

当请求ContentType是application/json时,及传到后台的是字符串,则需要添加注解。

详细转到这位大佬博文,讲的很好。

 五、Springboot中使用Feign远程调用

1.引包

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>

2.注解使用

@FeignClient(value = "被调用的服务名,如System",configuration = MyEsbFeignConfig.class)

public interface EMSFeignClient {
  @PostMapping("/path")
  String queryMsg();
}

注意的是,可以在注解FeignClient里指定访问地址,即加上url = "IP:端口"。可以不指定configuration。还需要注意,逛他人博客的时候发现有些低版本支持POJO传参,也可以在RequestInterceptor

里进行get set封装后进行传参。详情请看这里

3.指定拦截器配置可以做注入session或者token等功能。

package com.chx.util;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;

@Slf4j
@Configuration
public class MyFeignConfig implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        String userCheck = request.getHeader("session");
        log.info("session:{}", userCheck);
        requestTemplate.header("session", userCheck);
    }
} 

4.SpringbootApplication启动类加上@FeignClient注解,以及@EnableDiscoveryClient。因为feign底层是使用了ribbon作为负载均衡的客户端,而ribbon的负载均衡也是依赖于eureka 获得各个服务的地址,所以要引入eureka-client。

六、有关实现自定义包扫描

明日上代码,这里有个大佬写的不错,点击前往

posted @ 2020-01-19 16:46  chxLonely  阅读(316)  评论(0编辑  收藏  举报