SpringBoot - Syntax

 

1. 环境搭建

完整配置项清单,详见: Common Application Properties (spring.io)
SpringBoot Starter,详见: Developing with Spring Boot

1.1 Spring.io 建立项目

通过Spring.io 网站,自动建立一个springboot项目,失败的常见问题列表:

 

1.2 Spring Initializer建立项目

通过IntelliJ Idea 当中的Spring initializer,自动建立一个springboot项目,失败的常见原因列表:

  • 在POM文件当中加入 "spring-boot-stareter-web" 的artifactId,仍然无法启动tomcat,原因是包没有被导入,刷新 Intellij Idea中Maven的Dependencies即可。

Note备注:

  • Spring Boot banner在线生成网站为: https://www.bootschool.net/ascii 
  • @Controller, @RestController 以及 @ResponseBody的区别为 @ResponseBody三种的对比

 

2. SpringBoot 自动装配

2.1 pom.xml

  • spring-boot-dependencies: 核心依赖在父工程中
  • 我们在写或者引入一些springboot依赖的时候,不需要指定版本,就因为有这些版本仓库
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.14</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.crevew</groupId>
    <artifactId>springboot-02-config</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-02-config</name>
    <description>springboot-02-config</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
View Code

 

2.2 启动器Starter

  • 说明了就是Springboot的启动场景,比如说: spring-boot-starter-web,就是帮我们自动导入web环境所有的依赖
  • springboot会将所有的功能场景,都变成一个个的启动器
  • 我们要使用什么功能,只需要找到对应的启动器就可以了,启动器列表为: Spring Boot Reference Documentation
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

2.3 主程序

  • @SpringBootApplication: 标注这个类是一个springboot的应用,包括
    • @SpringBootConfiguration
      • @Configuration: Spring配置类
      • @Component: 说明这也是一个spring的组件
    • @EnableAutoConfiguration:自动配置
      • @AutoConfigurationPackage: 自动配置包
        • @Import(AutoConfigurationPackages.Registrar.class): 自动配置,包注册
      • @Import(AutoConfigurationImportSelector.class): 自动配置导入选择
  • SpringApplication.run(): 将springboot应用启动

2.3.1 @SpringBootApplication分析

 结论:springboot所有自动配置都是在启动的时候扫描并加载,org.springframework.boot:spring-bot-autoconfigure/META-INF/spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的starter,就有对应的启动了,有了启动器,我们自动装配就会身高,然后就配置成功。

  1. springboot在启动的时候,从类路劲下 /META-INF/spring.factories获取指定的值;
  2. 将这些自动配置的类导入容器,自动配置就会生效,帮我们进行自动配置;
  3. 以前我们需要自动配置的东西,现在springboot帮我们做了;
  4. 整个JavaEE,解决方案和自动配置的东西都在spring-boot-autoconfig....jar 这个包下;
  5. 它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器;
  6. 容器中也会存在非常多的xxxAutoConfiguration的文件,就是这些类给容器中导入了这个场景所需要的所有组件,并自动配置 @Configuration
  7. 有了自动配置类,免去了我们手动编写配置文件的工作。

2.3.2 SpringApplication.run() 分析

 这个类主要做了一下四件事情:

  1. 推断应用的类型是普通的项目还是Web项目
  2. 查找并加载所有可用初始化器,设置到initializers属性中
  3. 找出所有的应用程序监听器,设置到listenners属性中
  4. 推断并设置main方法的定义类,找到运行的主类

 

3. SpringBoot 配置文件

完整配置项清单,详见: Common Application Properties (spring.io)
SpringBoot Starter,详见: Developing with Spring Boot
yaml可以给实体类赋值. 关于Java类赋值的几种方式:

  • Java, new出一个对象赋值
  • Spring, applicationContext.xml文件 (Bean,properties注入)
  • Spring, @Value, 注解注入, @Autowired
  • SpringBoot,@ConfigurationProperties (Spring Boot application.yaml注入),  @Autowired,此种方式下,yaml文件里面可以包括EL表达式,非常强大
  • SpringBoot,  @PropertySource (Spring Boot properties注入),@Autowired

 

Spring Boot

@ConfigurationProperties 

Spring

@Value

功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

 

结论:

  • 配置yml和配置properties都可以获取到值,强烈推荐yaml
  • 如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下@value
  • 如果我们专门编写了一个JavaBean来和配置文件进行映射,就直接使用@ConfigurationProperties,不要犹豫

JSR303校验
引入@Validated之后,@Email仍然报红色,解决方案是 @ JSR303数据校验中@Email爆红问题解决
JSR303的定义如下: @ (17条消息) JSR-303_jsr303是什么

4. Spring Boot Web开发

需要解决的问题是:

  • 导入静态资源
  • 首页
  • jsp,模版引擎Thymeleaf
  • 装配扩展SpringMVC
  • 增删改查
  • 拦截器
  • 国际化

4.1 静态资源加载方式

在Springboot中,可以使用一下方式处理静态资源

  • Webjars: webjars 官网 @ WebJars - Web Libraries in Jars 
  • classpath:/META-INF/resources/  >  classpath:/resources/ >  classpath:/static (默认) >  classpath:/public/   (按照优先级排序)

4.2 首页加载

首页index.html放在 resource > static > public下,如果放在templates下午,需要在controller里面做映射。

4.3 模版引擎

前端交给我们的页面,是html页面。如果是我们以前开发,我们需要把他们转成jsp页面,jsp好处就是当我们查出一些数据转发到JSP页面以后,我们可以用jsp轻松实现数据的显示,及交互等。jsp支持非常强大的功能,包括能写Java代码;但是呢,我们现在的这种情况,SpringBoot这个项目首先是以jar的方式,不是war;第二,我们用的还是嵌入式的Tomcat,所以呢,他现在默认是不支持jsp的。
那不支持jsp,如果我们直接用纯静态页面的方式,那给我们开发会带来非常大的麻烦,那怎么办呢?SpringBoot推荐你可以来使用模版引擎。
那么这模版引擎,我们其实大家听到很多,其实jsp就是一个模版引擎,还有以前用的比较多的freemarker,包括SpringBoot给我们推荐的Thymeleaf,模版引擎有非常多,但再多的模版引擎,他们的思想都是一样的,什么样一个思想呢?

Thymeleaf 官网: Thymeleaf,  GitHub: Thymeleaf · GitHub

 4.4 SpringMVC 自动配置

SpringBoot对我们的SpringMVC还做了一些配置,包括扩展,定制等。
SpringMVC 官方文档 @ Web (spring.io)

在springboot中,有非常多的xxxConfiguration帮助我们进行扩展配置,只要看见这个东西,我们就要注意。

 5. 员工管理系统

员工管理系统源码下载 @ (狂神说)员工管理系统(静态资源+完整代码)

1. 所有页面的静态资源,都需要Thymeleaf接管;

2. 页面国际化: (1). 需要配置i18n文件;(2). 如果在项目中需要进行按钮自动切换,则需要自定义一个组件LocaleResolver; (3) 记得通过@Bean将自己写的组件配置到Spring容器 。 (4) 通过#{}取得国际化的消息。

3. 登录与拦截器

4. CRUD 增删改查
提取公共页面 (th:fragment="sidebar", th:repace, th:insert), 如果需要传参则需要用()传参

 x-admin: 后台管理模版

bootstrap, lay-ui: 前端管理

6. JDBC/DRUID/Mybatis

DRUID @ druid-spring-boot-starter的使用方法

Mybatis 只能采用2.3.1 版本 @ Maven Repository:mybatis-spring-boot-starter

 7. 安全Shiro/Spring Security

Shiro, Spring Security 很像,除了类不一样,名字不一样;其他基本一致,包括:认证,授权

代码静态资源: 狂神Springboot视频中的SpringSecurity静态资源

如果遇到Spring Security默认的login页面加载时间过长,是因为bootstrap.min.cs 文件无法下载,需要FQ,请打卡VPN;或者直接下载css文件即可

 7.1 Spring Security

Spring Security 是针对Spring项目的安全框架,也是SpringBoot底层安全模块默认的技术选型,可以实现强大的Web安全控制,对于其使用,只要少量的配置,即可使用。
记住几个类:

  • WebSecurityConfigurerAdapter: 自定义Security策略
  • AuthenticationManagerBuilder: 自定义认证策略
  • @EnableWebSecurity: 开启WebSecurity模式 

Spring Security 内部功能详解为: SpringSecurity学习

  Spring Security如果没有任何配置,会自动enable user login 账户,可以去除,方法为:This generated password is for development use only.

Spring & Thymeleaf, 必须使用 3.0.5 RELEASE或者更低版本。 thymeleaf-extras-springsecurity5

  同时,关于角色role不匹配的问题,详见: (18条消息) SpringBoot---spring-security配置问题_记录菌的博客-CSDN博客

7.2 Shiro

Apach Shiro ,按照GitHub samples/quickstart里面的配置,拷贝后发现编译出错,原因是: (18条消息) shiro报错:import org.apache.shiro.ini.IniSecurityManagerFactory出错;报Cannot resolve symbol ‘ini_cannot resolve org.apache.shiro:shiro-core:1.12.1_普通网友的博客-CSDN博客

8. Swagger

8.1 背景

背景,前后端联调的解决方案,指定schedule,实时更新API,降低集成的风险。
早些年:制定word文档
后来采用:

  •    前端测试后端接口:postman
  •    后端提供接口,需要实时更新最新的消息及改动

Swagger,号称世界上最流行的API框架, Restful,文档在线自动生成工具,直接运行,支持多种语言等 官网:https://swagger.io

8.2 项目使用Swagger

 项目中使用,需要Springfox: swagger2, UI

导入POM的包依赖,以及版本对应关系,以及配置,详见 @Springboot Swagger各版本整理_springboot和swagger版本

访问管理页面: http://localhost:8080/swagger-ui/index.html#/

8.3 配置扫描接口

通过写一个SwaggerConfig类来控制Docket操作

总结:
1. 我们可以通过Swagger给一些比较难以理解的属性或者接口,增加注释信息;
2. 接口文档实时更新
3. 可以在线测试
Swagger是一个优秀的工具,几乎所有大公司都在用。
【注意】在正式发布的时候,关闭Swagger;不仅仅出于安全,也是节省内存。

9. 邮件/异步/调度

异步:@Async  @EnableAsync

邮件系统POM需要加载一个starter即可

定时有以下调度函数

  • TaskScheduler  任务调度者
  • TaskExecutor  任务执行者
  • @EnableScheduling  开启定时功能的注解
  • @Scheduled 什么时候执行
  • Cron表达式

10. 分布式+Dubbo+ZooKeeper

10.1 安装配置

Apach Dubbo (alibaba) --- RPC  @ Apache Dubbo (下载路径@版本发布 | Apache Dubbo)
ZooKeeper  @ Apache ZooKeeper (下载路径),配置.\config\zoo.cfg文件,并且加入“ admin.serverPort=8060 ” 修改端口号到8060,否则容易和其他的冲突

 Dubbo+ZooKeeper vs. Spring Cloud 比较 @ dubbo和spring cloud区别 • Worktile社区

10.2 运行

ZooKeeper直接运行就可以使用了,注意修改8080端口号为8060,.\conf\zoo.cfg 文件中修改

Dubbo需要自己编译,编译步骤和启动步骤如下,然后通过 localhost:8080 登录,用户名密码 root/root
>cd D:\environ\apache-dubbo-admin-0.4.0-source-release
>mvn clean package -Dmaven.test.skip=true
等待12分钟,即可编译完成,最后完成界面如下:

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for dubbo-admin 0.4.0:
[INFO]
[INFO] dubbo-admin ........................................ SUCCESS [01:36 min]
[INFO] dubbo-admin-ui ..................................... SUCCESS [07:11 min]
[INFO] dubbo-admin-server ................................. SUCCESS [01:34 min]
[INFO] dubbo-admin-distribution ........................... SUCCESS [ 2.052 s]
[INFO] dubbo-admin-test ................................... SUCCESS [ 38.054 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11:13 min
[INFO] Finished at: 2023-08-02T17:28:50+08:00
[INFO] ------------------------------------------------------------------------

 

Zookeeper: 注册中心
dubbo-admin: 是一个监控管理后台,查看我们注册了哪些服务,哪些服务被消费了;可以不要的,非核心组件
dubbo:是一个jar包,从maven下载

POM比较特殊

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.14</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.crevew</groupId>
    <artifactId>consumer-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>consumer-server</name>
    <description>consumer-server</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--        //导入依赖-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId> dubbo-spring-boot-starter</artifactId>
            <version>3.2.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>

        <!--        日志会冲突-->
        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>5.5.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>5.5.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-x-discovery -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-x-discovery</artifactId>
            <version>5.5.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.8.2</version>
            <!--            排除这个slf4j-log4j12-->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
View Code

11. 微服务扩展

11.1 主流微服务框架

1. Spring Cloud NetFlix 一站式解决方案

  • API网关,Zuul组件
  • 通信,Feign, HttpClient, Http通信方式,同步并阻塞
  • 服务注册与发现,Eureka
  • 熔断机制,Hystrix

2. Apache Dubbo, Zookeeper 解决方案

  • API: 没有
  • 通信: Zubbo, 高性能的基于Java实现的RPC通信框架
  • 服务注册与发现: zookeeper (Hadoop, Hive etc.)
  • 熔断机制: 没有,借助Hystrix

3. Spring Cloud Alibaba,一站式解决方案

11.2 服务网格

目前,又提出了一种方案,服务网格 (下一代微服务标准)Server Mesh。代表的解决方案是 istio

总结:万变不离其宗,一通百通!

  1. 1. API网关,服务路由
  2. 2. HTTP,RPC框架,异步调用
  3. 3. 服务注册与发现,高可用
  4. 4. 熔断机制,服务降级

基于这四个问题,就可以开发出一套解决方案。

 

posted @ 2023-07-28 21:01  zjfun  阅读(231)  评论(0)    收藏  举报