springboot实战

xiafengyi      2022-04-28     483

关键词:

 

SpringBoot精要

 SpringBoot的四个核心

    1.自动配置:针对很多Spring应用程序常见的应用功能,SpringBoot能自动提供相关配置。

      在任何Spring应用程序的源代码中,都可以找到java配置或XML配置,他们为应用程序开启了特定的特性和功能。

    2.起步依赖:告诉SpringBoot需要什么功能,他就能引入需要的库。

      SpringBoot起步依赖基本都以spring-boot-starter打头,随后是直接代表其功能的名字,比如web、test。

    3.命令行界面:这是SpringBoot的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建。

    4.Actuator:让你能够深入运行中的SpringBoot应用程序,一探究竟。
      Spring应用程序上下文里配置的Bean
      SpringBoot的自动配置做的决策
      应用程序取到的环境变量、系统属性、配置属性和命令行参数
      应用程序里线程的当前状态
      应用程序最近处理过的HTTP请求的追踪情况
      各种和内存用量、垃圾回收、Web请求以及数据源用量的相关指标

  SpringBoot不是什么

    SpringBoot不是应用服务器

      SpringBoot可以把Web应用程序变为可自执行的JAR文件,不用部署到传统Java应用服务器里就能在命令行里运行。SpringBoot在应用程序里嵌入了一个Servlet容器(tomcat、Jetty或Undertow),以此实现这一功能。但这是内嵌的Servlet容器提供的功能,不是SpringBoot实现的。

    SpringBoot没有引入任何形式的代码生成,而是利用了Spring 4的条件化配置特性,以及Maven和Gradle提供的传递依赖解析,以此实现Spring应用程序上下文里的自动配置。

    Spring4.0对条件化配置提供了支持,根据应用程序的Classpath、环境和其他因素,运行时决策将使用哪些配置,忽略哪些配置。

    从本质上来说SpringBoot就是Spring,它做了那些没有它你自己也会做的Spring Bean配置。

  使用IEDA构建第一个SpringBoot应用

    File→newProject→SpringInitalizr

    项目创建完成后,你会看到如下图的项目结构

    技术图片

    整个项目遵循传统Maven或Gradle项目的布局,即主要应用程序代码位于src/main/java目录里,资源都在src/main/resource目录里,测试代码则在src/test/java目录里。

    ReadingListAppliaction.java : 应用程序的启动类(bootstrap class),也是主要的Spring配置类。

    Application.properties : 用于配置应用程序和SpringBoot的属性。

    RedingListApplicationTests.java : 一个基本的集成测试类。

  1.启动Spring

    ReadingListApplication在SpringBoot应用程序里有两个作用:配置和启动引导。首先,这是主要的Spring配置类。虽然SpringBoot的自动配置免除了很多Spring配置,但你还需要少量配置来启用自动配置。

    技术图片

    

    @SpringBootApplication开启了Spring的组件扫描和SpringBoot的自动配置功能。实际上,@SpringBootApplicationj将三个有用的注解组合在了一起。
      )1.Spring的@Configuration:标明该类使用Spring的基于Java的配置。
      )2.Spring的@ComponentScan:启用组件扫描,这样你写的Web控制器和其他组件才能被自动发现并注册为Spring应用上下文里的Bean。
      )3.SpringBoot的@EnableAutoConfiguration:开启了SpringBoot的自动配置
    要运行SpringBoot应用程序有几种方式,其中包含传统的war文件部署。但这里的main()方法可以让你在命令行里把该应用程序当作一个可执行的JAR文件来运行。这里想SpringApplication.run()传递了一个ReadingListApplication类的引用,还有命令行参数,通过这些东西启动应用程序。
    应用程序跑起来之后,会启动一个监听8080端口的Tomcat服务器。可以通过localhost:8080,但由于还没有写控制器类,你只会收到一个HTTP 404错误页面。

  2.测试SpringBoot应用

    RedingListApplicationTest不止是个用于测试的占位符,他还是一个例子,告诉你如何为SpringBoot应用程序编写测试。

    技术图片

    一个典型的Spring集成测试会用@ContextConfiguration注解标识如何加载Spring的应用程序上下文。但是,为了充分发挥SpringBoot的魔力,这里应该用@SpringApplication-Configuration注解。正如上图,ReadingListApplicationTests使用@SpringApplicationConfiguration注解从ReadingListApplication配置类里加载Spring应用程序上下文。

    ReadingListApplicationTest里还有一个简单的测试方法,即contextLoads()。实际上它是就是个空方法。但这个空方法足以证明应用程序上下文的加载没有问题。如果ReadingListApplication里定义的配置是好的,就能通过测试,如果有问题,测试就会失败。

  3.配置应用程序属性  

    Initializr为你生成的applicaiton.properties文件是一个空文件。实际上,这个文件完全是可选的,可以删除,对程序运行没有任何影响。
    我们现在可以在里面配置一些东西
    server.port= 8000
    加上这一行,嵌入式Tomcat的监听端口就变成了8000。
    这说明application.propeties文件可以很方便的帮你细粒度地调整SpringBoot的自动配置,还可以用它来指定应用程序代码所需的配置项。
    要注意的是,完全不用告诉SpringBoot为你加载application.propeties,只要它存在就会被加载,Spring和应用程序代码都能获取其中的属性。

  SpringBoot集成Mybatis

    在pom文件中加入Mybatis相关依赖:  

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

    在application.properties中加入:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/successful_said?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Hongkong
spring.datasource.data-username=root
spring.datasource.data-password=root

    在启动类中加入:

@MapperScan("com.example.second.demosecond.dao")

    在src/main/resource目录下创建mapper文件(也可使用注解开发),并在mapper文件中创建userMapper.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.second.demosecond.dao.UserDao" >
    <resultMap id="BaseResultMap" type="com.example.second.demosecond.entity.User" >
        <id column="id" property="id" jdbcType="INTEGER" />
        <result column="name" property="userName" jdbcType="VARCHAR" />
        <result column="address" property="address" jdbcType="VARCHAR" />
    </resultMap>
    <sql id="Base_Column_List" >
        id, name, address
    </sql>
    <select id="selectUser" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from user
    </select>
</mapper>

    其中, mapper标签的namespace属性对应的是你的Dao,resultMap的type属性对应的是你的JavaBean。

    在你的启动类的平级目录下创建Entity,Dao,Controller,Service四个文件夹,并编写相关代码,如下。

     )1.在Entity文件夹中创建JavaBean,编辑代码如下:

     

public class User {

    private String UserName;

    private Integer id;

    private String address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getUserName() {
        return UserName;
    }

    public void setUserName(String userName) {
        UserName = userName;
    }

}

      )2.在Dao文件夹中创建Dao,代码如下:

import java.util.List;

@Mapper
public interface UserDao {

    List<User>  selectUser();
}

      )3.在Controller文件中创建Controller,代码如下:

import com.example.second.demosecond.dao.UserDao;
import com.example.second.demosecond.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@EnableAutoConfiguration
@RequestMapping(value = "/boot")
public class BootController {

    @Autowired
    private UserDao userDao;
    @RequestMapping(value = "getUser")
    public User getUser()
    {
        User user=new User();
        user.setUserName("test");
        return user;
    }

    @RequestMapping(value = "getAllUser")
    public List<User> getUsers()
    {
        List<User> userList= userDao.selectUser();
        return userList;
    }
}

  SpringBoot对静态资源的映射规则

    所有/webjars/**,都去classpath:/META-INF/resoures/webjars/找资源;
    webjars:以jar包的方式引入静态资源;

    webjar的网站:https://www.webjars.org/

    maven中央仓库:https://mvnrepository.com/

    页面都放在resource/templates下

  SpringBoot整合Redis作为缓存

    1.引入Redis的相关依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
            <version>1.3.8.RELEASE</version>
        </dependency>

    2.在application.properties中配置Redis

application.properties中加入:
#Redis主机地址
spring.redis.host=

    3.测试

     我这里使用Spring内置的RedisTemplate(也可以使用jedis)

    @Autowired
    StringRedisTemplate stringRedisTemplate; //操作字符串

    @Autowired
    RedisTemplate redisTemplate; //key value

     新增一个字符串类型的值

stringRedisTemplate.opsForValue().append("msg","hello");

    读取

stringRedisTemplate.opsForValue().get("msg");

    新增一个List类型的值

        stringRedisTemplate.opsForList().leftPush("list","xiaoming");
        stringRedisTemplate.opsForList().leftPush("list","xiaohong");

    存入对象类型的数据

        User user=userDao.findUserById(1);
        redisTemplate.opsForValue().set("emp01",user);

  存入后可使用RedisDesktopManager这款工具来查看。

  你会发现,存入的数据为序列化后的(乱码),虽然不会影响正常的查询,下面个人提供两种解决方式:

    默认如果保存对象,使用JDK序列化机制,序列化后的数据保存到Redis中。

     将数据以JSON的方式保存

      1)自己将对象转换成JSON

      2)改变默认的序列化规则方式

        1.创建一个类

@Configuration
public class MyRedisConfig{
    @Bean
     public RedisTemplate(Object,User)UserRedisTemplate(RedisConnectionFacation redisConntionFacation) throws UnknownHostException{
        RedisTemplate<Object,User> template = new RedisTemplate();
        templcate.setConnectionFactory(redisConnectionFacatiory);
        Jackson2JsonRedisSerializer<User> userJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<User>(User.class);
        template.setDefaultSerializer(userJackson2JsonRedisSerializer);
        return template;
  }     
} 

      2.使用@Autowired注解将方法自动装配到controoler里

    @Autowired
    RedisTemplate<Object, User> UserRedisTemplate;

      3.测试使用

UserRedisTemplate.opsForValue().set("emp02",user);

  SpringBoot任务

      1.测试异步任务(在启动方法里还要 加上 @EnableAsync 注解 才可生效)

    @Async
    public void async(){
        try {
            Thread.sleep(3000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.print("处理数据中...");
    }

    2.测试定时任务(在启动类里要加上 @EnableScheduling注解才可生效)

    @Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT")
    public void scheduled(){
        System.out.print("定时发送...");
    }

技术图片

    3.邮件任务

      1)邮件发送需要引入 spring-boot-starter-mail

      2)在appilcation.properties中配置邮箱

spring.mail.username=1242919235@qq.com
#pssword自己去邮箱里查看
spring.mail.password=
spring.mail.host=smtp.qq.com
#如果发送不出去(530)需使用以下配置
#spring.mail.properties.mail.smtp.ssl.enable=true

      3)测试

    @Autowired
    JavaMailSenderImpl javaMailSender;

    @Test
    public void email(){
        SimpleMailMessage message =new SimpleMailMessage();
        //邮件标题
        message.setSubject("今晚开会");
        //邮件内容
        message.setText("今晚7:30开会");
        //发给谁
        message.setTo("[email protected]");
        //谁发的
        message.setFrom("[email protected]");
        javaMailSender.send(message);
    }

  SpringBoot简化开发 —— lombok

    引入lombok依赖

      <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
        </dependency>

    lombok的一些注解

@NonNull : 注解在参数上, 如果该类参数为 null , 就会报出异常,  throw new NullPointException(参数名)

@Cleanup : 注释在引用变量前, 自动回收资源 默认调用 close() 方法

@Getter/@Setter : 注解在类上, 为类提供读写属性

@Getter(lazy=true) :

@ToString : 注解在类上, 为类提供 toString() 方法

@EqualsAndHashCode : 注解在类上, 为类提供 equals() 和 hashCode() 方法

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor : 注解在类上, 为类提供无参,有指定必须参数, 全参构造函数

@Data : 注解在类上, 为类提供读写属性, 此外还提供了 equals()、hashCode()、toString() 方法

@Value :

@Builder : 注解在类上, 为类提供一个内部的 Builder

@SneakThrows :

@Synchronized : 注解在方法上, 为方法提供同步锁

@Log :

@Log4j : 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象

@Slf4j : 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象

@AllArgsConstructor  生成一个无参构造

@NoArgdConstuctor    生成一个无参构造

    我们使用@Data注解就可以有以下注解的功能:
    @ToString
    @Getter
    @Setter
    @EqualsAnHashCode
    @NoArgsConstructor
    需要注意的是,同时使用@Data和@AllArgsConstructor后,默认的无藏构造函数失效,如果需要它,要需要设置@noArgsConstructor

  SpringBoot虚拟路径,物理路径的配置及跨平台时的解决方案

    1.application.properites 中配置

    技术图片

    2.添加WebMvcConfig工具类

技术图片

    3.创建文件夹

技术图片

    这样在不确定项目部署在什么平台下时,有两种选择方案,平台改变,只需修改配置文件即可。

  SpringBoot工程生产环境的发布

    1.打成Jar

      使用nohup java -jar text.jar > log.txt &命令启动工程

        log.txt : 用来存储日志,自动创建。
        & : 后台运行。
        java -jar : 系统环境变量配置的jre。
        nohup : 不挂断地运行命令,一般结合&使用。

    2.打成war(不推荐)

      1)修改pom文件

         <packaging>war</packaging> 

      2)将SpringBoot默认的tomcat设置为provided

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

      3)Application启动类继承SpringBootServletInitializer

      4)claen package

      5)copy生成的war到tomcat的wabapps下,运行tomcat

      注:tomcat的版本必须是8及以上





























文章摘要-springboot实战

简介:Springboot的4大特点:自动配置、起步依赖、命令行界面、actuator用于监视程序内部运行。 Springboot本质上就是Spring。 快速创建Springboot程序有4种方式,分别是SpringbootInitializr,SpringToolSuite,idea,SpringbootCLI。 开发第一个程序: 查看详情

springboot知识体系实战-前言

...:就像每本书都有前言一样,接下来我也为我即将分享的SpringBoot知识体系实战系列文章做一个前言介绍。作为现在微服务体系主流的框架,我想诸位都知晓SpringBoot,SpringCloud,打开Spring官网(官网链接)会发现SpringBoot已经是Spri... 查看详情

springboot实战

 SpringBoot精要 SpringBoot的四个核心    1.自动配置:针对很多Spring应用程序常见的应用功能,SpringBoot能自动提供相关配置。      在任何Spring应用程序的源代码中,都可以找到java配置或XML配置,他们为应用程序开... 查看详情

springboot实战与原理分析视频课程

1、SpringBoot概述与课程概要介绍2、Spring4快速入门3、Spring4扩展分析(一)4、Spring4扩展分析(二)5、SpringBoot快速入门6、SpringBoot配置分析(一)7、SpringBoot配置分析(二)8、SpringBoot自动配置9、SpringBoot@Enable*注解的工作原理10、Sp... 查看详情

springboot实战与原理分析视频课程

1、SpringBoot概述与课程概要介绍2、Spring4快速入门3、Spring4扩展分析(一)4、Spring4扩展分析(二)5、SpringBoot快速入门6、SpringBoot配置分析(一)7、SpringBoot配置分析(二)8、SpringBoot自动配置9、SpringBoot@Enable*注解的工作原理10、Sp... 查看详情

springboot实战(第一篇)第一个案例

...主原创文章,未经博主允许不得转载。 目录(?)[+] springboot实战(第一篇)第一个案例前言写在前面的话一直想将springboot相关内容写成一个系列的博客,今天终于有时间开始了第一篇文章以后有时间就会继续写下去。springboot... 查看详情

精通系列springboot集成elasticsearch+项目实战(代码片段)

Java之ElasticSearch7.x.x+SpringBoot+爬虫+项目实战【一篇文章精通系列】【SpringBoot集成ElasticSearch+项目实战】一、ElasticSearch的Java官方文档1、查看官方文档2、找到了原生的依赖3、初始化二、创建SpringBoot项目1、创建项目2、... 查看详情

《springboot实战》示例代码问题

*Idea环境*《JavaEE开发的颠覆者SpringBoot实战》1、2.2SpringEL读取文件获取不到:需把test.txt和test.properties放在resource文件下,将resource文件标记为资源目录,将引用目录换为"classpath:test.txt"就可以。2、2.4 Profile运行报错:GenericApplic... 查看详情

springboot整合rabbitmq之发送接收消息实战

实战前言前几篇文章中,我们介绍了SpringBoot整合RabbitMQ的配置以及实战了Spring的事件驱动模型,这两篇文章对于我们后续实战RabbitMQ其他知识要点将起到奠基的作用的。特别是Spring的事件驱动模型,当我们全篇实战完毕RabbitMQ并... 查看详情

《02.springboot连载:springboot实战.springboot核心原理剖析》

在上节中我们通过了一个小的入门案例已经看到了SpringBoot的强大和简单之处。本章将详细介绍SpringBoot的核心注解,基本配置和运行机制。笔者一直认为:精通一个技术一定要深入了解这个技术帮助我们做了哪些动作,深入理解它... 查看详情

原创003|搭上基于springboot事务思想实战专车

...意思,就是需要你的窥屏^_^专车介绍该趟专车是开往基于SpringBoot事务思想实战的专车,在上一篇搭上SpringBoot事务源码分析专车[1]中我们详细介绍了SpringBoot事务实现的原理,这一篇是基于上一篇的实战。在实战之前,我们再次回... 查看详情

springboot揭秘与实战源码分析-工作原理剖析

...tion4. 扩展阅读3.1. 核心注解3.2. 注入Bean结合《SpringBoot揭秘与实战源码分析-开箱即用,内藏玄机》一文,我们再来 查看详情

apollo客户端springboot实战

1.apollo客户端springboot实战(四)1.1.前言??经过前几张入门学习,基本已经完成了apollo环境的搭建和简单客户端例子,但我们现在流行的通常是springboot的客户端,所以这章还是来学习下springboot客户端如何和apollo整合??接下来我来... 查看详情

springboot实战一:发送邮件

...件,HTML邮件,附件邮件,图片邮件模板邮件来进行一个SpringBoot项目的实战,发送一下邮件,这里我们先了解一下邮件的协议邮件协议SMTP协议:简单邮件传输协议(SimpleMailTransferProtocol),邮件从一台服务器传送到另一台服务器POP3... 查看详情

springboot+sftp实现文件上传与下载实战

参考技术ASFTP介绍实战1.相关依赖(基于SpringBoot)2.相关配置3.将application.properties中配置转为一个Bean4.将上传下载文件封装成Service5.上传文件6.下载文件7.删除文件8.最后 查看详情

springboot从原理到实战

“回眸一笑百媚生”,说的就是SpringBoot。开始只是听说了这个名词,那它和spring有啥区别啊,名字有点类似哦。所以说:SpringBoot是spring的升级版,但并不是对spring功能上的增强,而是提供了一种快速使用spring的方式:开箱即用... 查看详情

重磅发布-springboot实战实现分布式锁视频教程

概要介绍:历经一个月的时间,我录制的分布式锁实战之SpringBoot实战实现系列完整视频教程终于出世了!在本课程中,我分享介绍了分布式锁出现的背景、实现方式以及将其应用到实际的业务场景中,包括“重复提交”、“CRM... 查看详情

springboot应用监控的实战教程

概述SpringBoot监控核心是spring-boot-starter-actuator依赖,增加依赖后,SpringBoot会默认配置一些通用的监控,比如jvm监控、类加载、健康监控等。我们之前讲过Docker容器的可视化监控,即监控容器的运行情况,包括CPU使用率、内存占用... 查看详情