SpringBoot框架的学习

Updated on with 0 views and 0 comments

SpringBoot框架的学习

SpringBoot框架

SpringBoot 简介

Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序,您可以“直接运行”这些应用程序。

简化了项目配置,甚至可以没有配置,xml 文件没有了

简化开发

两种 一种是联网 一种是maven项目自己写

快速开发 必须连接网络

https://start.spring.io/

idea中 注意版本选2.4.9 选择 启动器

image-20210729140317798

image-20210729143826612

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

插件保证打包时候 将 依赖打成 jar 包 Boot-INFO 的 lib 下

通过 properties、yml/yaml 文件 设置 需要修改的参数

SpringBoot 优势

  1. 快速构建项目
  2. 对主流开发框架无配置集成
  3. 项目可独立运行,无需外部依赖Servlet容器(表面上是Java项目,本质上web项目)
  4. 提供运行时的应用监控
  5. 极大的提高了开发、部署效率
  6. 与云计算的天然集成(SpringCloud)
image-20210729142543668

启动器 借助了 maven 的依赖传递

敏捷开发的依据

SpringBoot 配置文件

  1. 配置文件作用规范

    properties 预定义、自定义的键值对

    ymal/yml

  2. yml 文件书写格式

    • key:空格value 如 name: zhangfei
    • 并列关系,左侧对齐
    • 有上下级关系的缩进几个
    • 设置数组属性用 - 、或 []
    • 双引号则 有转义字符的功能
    • 单引号 为字符串拼接
    name: zhangfei
    age: 30
    
    #person.pname=zhangfei
    #person.page=30
    #person.idcard.cname=123
    person:
      pname: "zhang \n fei"
      page: 30
      idcard:
        cname: 123
      ids:
        - 10
        - 20
        - 30
    

    注入实体类属性

    @Component
    @ConfigurationProperties(prefix = "person")
    

SpringBoot 多环境配置

建立多个 yml 文件 不同文件不同配置

一个 application.yml 主文件 配置如下

#springboot 预定义配置 -- 配置的作用就是设置当前项目处于哪个环境,就需要使用哪个配置文件
#spring.profiles.active 写名字即可
spring:
  profiles:
    active: test

配置文件的位置

项目类路径下/类路径config 文件夹下 (package 打包之后的路径 Boot-INFO 的 classes 是类路径)(磁盘路径 项目config开发可以用 不常用)

SpringBoot 的 Web 开发

静态资源 建目录 a/b

四个默认目录

image-20210729163322095

自定义目录

# 自定义静态资源保存位置
spring:
  resources:
    static-locations: classpath:/static/,classpath:/resources/,classpath:/public/,classpath:META-INF/resources/,file:C:\Users\Administrator\Desktop\pic\

maven 图片打成 jar 包 放到本地仓库 jar包依赖配置

建立目录 src/main/resources/META-INF/resources/webjars 放图片

image-20210729205835690

install 安装到本地仓库.

需要使用的地方导入 maven 依赖即可

主启动类 格式固定

@SpringBootApplication
public class SpringBootThirdApplication {

    public static void main(String[] args) {

        SpringApplication.run(SpringBootThirdApplication.class,args);
    }
}

静态资源的访问:

第一种

localhost:8080/图片名称

第二种

localhost:8080/webjars/图片名称

SpringBoot 中的拦截器

public class FirstInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("放行或者拦截的方法。。。。。。");
        return true;
    }
}
// 自定义配置类 声明此类配置类
@Configuration
public class CustomConfig implements WebMvcConfigurer {
    // 拦截器注册 -- 把自顶有拦截器实现注册
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new FirstInterceptor()).addPathPatterns("/**");

SpringBoot 中的视图控制器 -- 定义全局视图

在当前项目中,由客户端只要是发出/main请求,就返回main.html视图页面

多个服务请求同一个页面 所以定义一个全局的视图 进行重定向

//配置视图控制器
@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/main").setViewName("/main.html");
}
@RequestMapping("sec")
public String sec() {
    return "redirect:/main";
}

@RequestMapping("third")
public String third() {
    return "redirect:/main";
}

SpringBoot 中的页面

需求:数据传递页面模板

页面模板 不同的商品详情、不同的新闻详情 都是类似的模板。

模板引擎/网页静态化技术 Thymeleaf、Freemarker

template文件夹是受保护的,不能直接访问,为了前端页面先渲染时有数据,必然要用同步方案。

模板引擎工作原理图

image-20210730211745080

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>入门案例</title>
</head>
<body>
<p>模板引擎入门案例</p>
<p th:text="${name}"></p>
</body>
</html>
# 禁用 thymeleaf缓存的设置
spring:
  thymeleaf:
    cache: false
  • 实体类对象的解析

    <p>实体类对象如何解析</p>
    <p>
        <span th:text="${user.uid}"></span>-
        <span th:text="${user.uname}"></span>-
        <span th:text="${user.upwd}"></span>
    </p>
    
  • 集合对象的解析

    <!-- c:foreach items="" var="" varStatus=""下标-->
    <p>集合对象如何解析:集合的遍历</p>
    <p th:each="user,iterStat : ${list}">
        <!-- INDEX 绝对的下标 从 0-->
        <span th:text="${iterStat.index}"></span>-
        <!-- count 从 1 开始计数-->
        <span th:text="${iterStat.count}"></span>-
        <span th:text="${user.uid}"></span>-
        <span th:text="${user.uname}"></span>-
        <span th:text="${user.upwd}"></span>
    </p>
    
  • 如何处理图片

    <p>如何处理图片</p>
    <img th:src="${imageUrl}">
    <p>如何处理超链接</p>
    <a th:href="${url}">百度</a>
    
  • 如何处理字符串

    <p>如何处理字符串片段</p>
    <p th:text="'字符串片段' + ${str}"></p>
    <p th:text="|字符串片段${str}|"></p>
    <!-- 格式错误 只能以上两种-->
    <!--<p th:text="字符串片段${str}"></p>-->
    
  • 网页内容分割片段

    头部 header 定义 相当于 id

    <p>头部页面片段</p>
    <h3 th:fragment="headerH3">头部共用部分</h3>
    

    三种引入方式

    <!-- 页面片段引入-->
    <!-- 三种 引入方式-->
    <!-- inser 插入 整个内容往里添加 div>h3>文字-->
    <div th:insert="~{header ::headerH3}"></div>
    <!-- replace 替换 没有div了 h3>文字-->
    <div th:replace="~{header ::headerH3}"></div>
    <!-- include 包含 没有了h3 只有文字 div>文字-->
    <div th:include="~{header ::headerH3}"></div>
    
  • 模板判断选择

    <p>选择结构</p>
    <!-- 条件成立-->
    <span th:if="${sex == 1}">男</span>
    <!-- 条件不成立-->
    <span th:unless="${sex == 1}">男</span>
    <!-- 多向判断-->
    <p th:switch="${score}">
        <span th:case="60">及格</span>
        <span th:case="70">中等</span>
        <span th:case="80">良好</span>
        <span th:case="90">优秀</span>
    </p>
    
  • 内置函数

    <p>内置函数</p>
    <p th:text="${date}"></p>
    <p th:text="${#dates.format(date,'yyyy-MM-dd')}"></p>
    <p th:text="${#dates.year(date)}"></p>
    <hr>
    <p>数字操作</p>
    <p th:text="${num}"></p>
    <p th:text="${dou}"></p>
    <!-- 格式化 小数点前凑够5位,后保留两位 进位-->
    <p th:text="${#numbers.formatDecimal(dou,5,2)}"></p>
    <!-- 生成序列 1到10-->
    <p th:text="${#numbers.sequence(1,10)}"></p>
    <p th:each="seq : ${#numbers.sequence(1,10)}">
        <span th:text="${seq}"></span><br>
    </p>
    <hr>
    <p>字符串操作</p>
    <p th:text="${str}"></p>
    <!-- 省略多余的字符-->
    <p th:text="${#strings.abbreviate(str,30)}"></p>
    
  • 渲染 css、js 路径

    同时配置 href/src 与 th:href/src 路径正确 并且提示正常

    <link rel="stylesheet" type="text/css" href="main.css" th:href="@{/main.css}">
        <script type="text/javascript" src="jquery.js" th:src="@{/jquery.js}"></script>
    

SpringBoot 整合 单元测试

还是去主启动器启动 加入测试启动器注解换SpringBootTest

<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
@SpringBootTest
class Springboot03Thymeleaf2ApplicationTests {
    @Autowired
    private User user;

    @Test
    void contextLoads() {
        System.out.println(user);
    }
}

SpringBoot 整合 Mybatis

mybatis 整合启动器

mysql 驱动

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

配置文件

#数据源配置
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///mybatis?characterEncoding=utf8
    username: root
    password: admin

#配置mybatis规则
mybatis:
  mapper-locations: classpath:mappers/*.xml # sql映射文件位置
  type-aliases-package: com.bh.pojo # 配置了实体的别名
  configuration:
    map-underscore-to-camel-case: true # 开启驼峰命名法 不写全局 配置文件在 configuretion 对象中
    #该配置项就是指将带有下划线的表字段映射为驼峰格式的实体类属性。

生成代理对象

局部配置 Mapper注解 获取持久层代理对象

// 局部配置 -- 获取持久层代理对象
@Mapper
public interface UserDao {
    List<User> selectAll();
}

全局配置 主启动器上 MapperScan(basePackages = "com.bh.dao")

@SpringBootApplication
// 全局配置 -- 获取持久层代理对象
@MapperScan(basePackages = "com.bh.dao")
public class Springboot04MybatisApplication {

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

}

SpringBoot 整合 Redis

开启Redis

# 进入bin目录
cd /usr/app/software/redis/bin
# 后台启动 redis
./redis-server redis-conf
# 查看 redis 进程
ps -aux | grep redis
# 进入 redis 客户端 -a 密码 123
./redis-cli -a 123
# 清空所有库中的所有数据
flushall

加入 启动器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置文件 application.yml 端口默认6379

spring:
  redis:
    host: 192.168.159.128
    password: 123

注入操作Redis的模板

RedisTemplate、StringRedisTemplate两种模板

// 注入 redis 模板对象 保存键值对数据 区别
// RedisTemplate 模板会自动给 key、value 加入序列化数据,显示十六进制编码
// StringRedisTemplate模板不会自动给 key、value 加入序列化数据,中文显示
@Autowired
private RedisTemplate redisTemplate;

@Autowired
private StringRedisTemplate stringRedisTemplate;

主启动类排除数据源 自动添加

exclude ={DataSourceAutoConfiguration.class}

image-20210730225444619

RedisTemplate 模板会自动给 key、value 加入序列化数据,显示十六进制编码

StringRedisTemplate模板不会自动给 key、value 加入序列化数据,中文显示

不能混着用 用哪个操作哪个对象

方法如下:

redisTemplate.boundValueOps().set/get

// 测试 -- 向库中添加数据 -- string类型
// set
@Test
public void testSaveString() {

    redisTemplate.boundValueOps("name1").set("张飞");
    // 设置有效时间 TimeUnit 泛型的值为单位
    redisTemplate.expire("name1",1, TimeUnit.MINUTES);

}

// get
@Test
public void testGetString() {
    String name1 = (String) redisTemplate.boundValueOps("name1").get();
    System.out.println(name1);
}

// set
@Test
public void testSaveString2() {

    stringRedisTemplate.boundValueOps("name2").set("李炳汉");

}

// get
@Test
public void testGetString2() {
    String name1 = (String) stringRedisTemplate.boundValueOps("name2").get();
    System.out.println(name1);
}

// 删除数据
// del
@Test
public void testDelString() {
    redisTemplate.delete("name1");
}

// 列表类型的操作
// lpush
@Test
public void testSaveList() {
    redisTemplate.boundListOps("list1").leftPushAll("aaa","bbb","ccc","ddd","aaa");
}

// lrange
@Test
public void testGetList() {
    List list1 = redisTemplate.boundListOps("list1").range(1, -1);
    System.out.println(list1);
}

// lindex
@Test
public void testIndex() {
    String list1 = (String) redisTemplate.boundListOps("list1").index(1);
    System.out.println(list1);
}

// lrem
@Test
public void remove() {
    redisTemplate.boundListOps("list1").remove(1,"aaa");
}

// set 集合操作 无序
// sadd
@Test
public void testSaveSet() {
    redisTemplate.boundSetOps("set1").add("aaa","bbb","ccc","ddd");
}

// smembers
@Test
public void testGetSet() {
    Set set1 = redisTemplate.boundSetOps("set1").members();
    System.out.println(set1);
}

// srem
@Test
public void testDeleteSet() {
    redisTemplate.boundSetOps("set1").remove("aaa");
}

// 散列结构操作

// hmset
@Test
public void testSaveHash() {
    Map<String,Object> map = new HashMap<>();
    map.put("name","张飞");
    map.put("age",30);
    map.put("bir",new Date());
    redisTemplate.boundHashOps("hash1").putAll(map);
}

// hkeys、hget 结合使用
@Test
public void testGetHash() {
    Set<String> keys = redisTemplate.boundHashOps("hash1").keys();
    for (String key : keys) {
        Object value = redisTemplate.boundHashOps("hash1").get(key);
        System.out.println(key+"--"+value);
    }
}

// hdel
@Test
public void testDeleteHash() {
    redisTemplate.boundHashOps("hash1").delete("name");
}

SpringBoot 整合 Dubbo

  1. 启动 Zookeeper

    ./zkServer.sh start

    ps -aux | grep zookeeper

  2. 打开 dubbo-admin

  3. 先准备提供者、在准备消费者

    1)导入 jar、web 项目

    <!-- zookeeper 客户端-->
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.9</version>
    </dependency>
    <!-- 整合 dubbo 启动器-->
    <dependency>
        <groupId>com.alibaba.spring.boot</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>2.0.0</version>
    </dependency>
    

    2)对外提供功能、远程调用功能

    需要两个注解 因为 使用了 SpringBoot 大容器套小容器

    Component(Ioc 容器管理对象) 和

    Service(Dubbo 容器管理对象) 注解都加上

    远程调用功能需要先造接口一模一样

    3)yml配置文件

    名称、端口、注册中心地址、注册哪些服务

    spring:
      dubbo:
        application:
          name: provider
        registry:
          address: zookeeper://192.168.159.128:2181
        scan: con.bh.service
        protocol:
          name: dubbo
    
    #tomcat端口
    server:
      port: 8000
    

    主启动器 开启 EnableDubboConfiguration

    thymeleaf 也需要启动器!!!

    4)结果

    image-20210802210422865


标题:SpringBoot框架的学习
作者:HB2Ocean
地址:http://future-hb.top:8080/articles/2021/07/30/1627660583786.html