记录工作中使用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。
六、有关实现自定义包扫描
明日上代码,这里有个大佬写的不错,点击前往