IDEA版SpringBoot全教程 02

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: IDEA版SpringBoot全教程 02

lombok安装

当一个类的字段特别多时,整个文件看起来将非常不简洁。所幸IDEA提供了一款lombok插件,可以在代码阶段,通过添加注解的形式,省去手写getter, setter的麻烦。


File - settings


依次点击: Plugins -> Browse repositories -> Lombok -> Install


安装好了以后重启


0.png


pom.xml添加依赖

<!-- lombok -->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <scope>compile</scope>
</dependency>

还是上一节的Cat类,去掉所有的setter和getter方法,还有toString方法。改成这样

@Component
@ConfigurationProperties(prefix = "cat" )
@Data
public class Cat {
    private String name;
    private int sex;
    private List<String> hobbies;
    private String nameAndSex;
}

多环境切换

实际开发项目的时候,分为多套环境,比如开发环境,测试环境,生产环境。不同环境的配置是不一样的。

spring:
  profiles:
    active: dev
---
cat:
  name: 机器猫${random.int[1,100]}
  #sex:
  hobbies:
    - 吃铜锣烧
    - 和小咪聊天
    - 用竹蜻蜓飞天
  nameAndSex: ${cat.name},性别是${cat.sex:男}
spring:
  profiles: dev
---
cat:
  name: Hello Kitty
  #sex:
  hobbies:
    - 不知道
  nameAndSex: ${cat.name},性别是${cat.sex:女}
spring:
  profiles: test

用---代表配置文件的分组,profiles的意思是当前环境的名称,在最顶上可以设置实际激活的环境名称。


使用SpringBoot进行web开发

彻底搞定静态资源

先找到这个类:WebMvcAutoConfiguration,在这个jar包里面,还是自动配置

1.png

WebMvcAutoConfiguration中有一个 addResourceHandlers  方法,这是自动配置静态资源目录的。

public void addResourceHandlers(ResourceHandlerRegistry registry) {
            if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
            } else {
                this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
                this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
                    registration.addResourceLocations(this.resourceProperties.getStaticLocations());
                    if (this.servletContext != null) {
                        ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
                        registration.addResourceLocations(new Resource[]{resource});
                    }
                });
            }
        }

先看这个:

if (!this.resourceProperties.isAddMappings()) {
   logger.debug("Default resource handling disabled");
}

如果isAddMappings为false,就打印默认资源映射路径失效了。isAddMappings方法其实就是返回一个addMappings变量(在WebProperties中)


addMappings的含义就是运行访问静态资源,如果你设置成false,就是禁用所有静态资源映射。


站长在写这篇教程的时候,用的SpringBoot版本为2.5.1,是目前最新的版本。发现和之前的版本比起来,改动还是很大的。翻源码很麻烦,我就直接告诉你结论就行了。


默认的静态资源目录是:

new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};

这点和以前是一样的,测试一下

2.png

访问什么路径能返回public.js呢?

在WebMvcProperties中,有一个staticPathPattern属性。

3.png

默认就是/**,所以,无论你访问什么,都可以被静态资源处理器接受。

启动项目,访问http://localhost:8888/public.js

4.png

成功访问,现在我们手动添加一个静态目录。

spring:
  profiles: test
  resources:
    static-locations: [classpath:/my/]


5.png


访问http://localhost:8888/my.txt,也成功了。

最后,把静态资源开关关掉。

spring:
  profiles: test
  resources:
    static-locations: [classpath:/my/]
    add-mappings: false

这样就访问不到任何静态资源了,不过一般来说不用关。

再谈static-locations

static-locations表示自定义静态目录,如果配置了这个属性,默认的静态资源目录就会失效!

也可以用这个配置来访问本地资源


spring:
  profiles: test
  resources:
    static-locations: file:C:/upload/article/
    add-mappings: true

file:表示访问本地文件。

6、.png

比如我现在要访问1.jpg


重启项目,访问 http://localhost:8888/20210415/1.jpg ,可以成功访问。


但是,其他静态资源就访问不了了。因为我们设置了static-locations,是一个覆盖操作,默认的目录都没了。


像访问这种本地文件的情况,一般是文件上传和下载的目录,这种的都是放在本地磁盘的,不会和项目绑定。


如果原来的目录我们也想要获取,又要访问本地文件该咋办呢?这个时候,就不要去配置static-locations,我们可以额外配置一个资源映射。


7.png


注释掉,正常情况下,用默认的资源映射绰绰有余了。难道那么多文件夹还不够你放资源吗。。。

(注意:上图中的resources也要注释掉,不然会报错)

然后,新建一个配置类。

8.png


package com.java18.vipmgr.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyWebResourcesHandler implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/upload/**")
                .addResourceLocations("file:C:/upload/article/");
    }
}

重启,访问http://localhost:8888/upload/20210415/1.jpg就能看到图片了,并且也不会影响原来的资源目录。这才是项目中推荐的做法。


SpringBoot整合JDBC

添加jdbc依赖:

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

mysql依赖本来就有:

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

修改yml配置:

spring:
  profiles: test
  #resources:
    #static-locations: file:C:/upload/article/
    #add-mappings: true
  #配置数据源
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/idea?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password:

默认用的是mysql8.x的驱动包,url要注意加上时区,不然会报错的。

测试数据源是否加载成功:

@SpringBootTest
class DataTests {
    @Autowired
    DataSource dataSource;
    @Test
    void dataSource() {
        System.out.println(dataSource.getClass());
    }
}

打印:class com.zaxxer.hikari.HikariDataSource

这是springboot默认的数据源。

测试sql语句查询

@Test
void dataSource() {
    //System.out.println(dataSource.getClass());
    List<Map<String, Object>> users = jdbcTemplate.queryForList("select * from users");
    System.out.println(users);
}

结果:[{id=1, username=zhangsan, password=123, points=1000}]

数据库:

9.png

举一反三:

1.为什么jdbcTemplate能直接用?

10.png


因为SpringBoot有自动配置,条件是:

@ConditionalOnClass({DataSource.class, JdbcTemplate.class})
@ConditionalOnSingleCandidate(DataSource.class)

DataSource已经配好了,JdbcTemplate因为引入了spring-boot-starter-jdbc,肯定也是有的。所以就直接自动配置了。

11.png再看JdbcTemplateConfiguration:

12.png



SpringBoot整合Druid数据源


首先帮大家理清几个概念,啥是数据源?


数据源就是连接池,啥是连接池?


我们正常写jdbc代码,不是要获取连接,用完再关闭连接吗。一开一关,是不是很影响性能啊!


既然如此,我们为什么不在一开始就生成假如20个jdbc连接呢?你要用就给你一个,用完你再还回来,岂不美哉!


druid就是阿里公司针对jdbc自己封装的一套连接池代码,说白了就是一个jar包,里面有一些类。


所以:


Druid数据源


=  一个jar包


= 一个dependency


好了,明白这些概念后,我们开始整合Druid数据源。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.18</version>
</dependency>

注意,每次导入新的依赖,都要右键项目,maven,reload一下,有的idea是reimport。

然后,在application.yml配置文件中修改默认的数据源配置。

#配置数据源
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/idea?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password:
    type: com.alibaba.druid.pool.DruidDataSource

就是加一个type属性,如果不加则用的是默认的数据源。

druid还有一些其他配置,直接贴上去,和type是平级的。

initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
#   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

重点:编写配置类,开启sql监控

package com.java18.vipmgr.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DruidConfig {
    /**
     * 用ConfigurationProperties的方式装配Druid对象
     * @return
     */
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druid(){
        return  new DruidDataSource();
    }
    //配置Druid的监控
    //其实就是相当于在web.xml中配置一个管理后台的Servlet
    //这个Servlet开启后可以访问后台页面,映射地址为/druid/*
    @Bean
    public ServletRegistrationBean statViewServlet(){
        /**
         * Druid内置提供了一个StatViewServlet用于展示Druid的统计信息。
         * 这个StatViewServlet的用途包括:
         * 提供监控信息展示的html页面
         * 提供监控信息的JSON API
         */
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        Map<String,String> initParams = new HashMap<>();
        //这里是配置管理员的账号密码,写死即可
        initParams.put("loginUsername","admin");
        initParams.put("loginPassword","123456");
        initParams.put("allow","");//默认就是允许所有访问
        initParams.put("deny","192.168.x.x"); //这是默认禁止某个IP访问
        bean.setInitParameters(initParams);
        return bean;
    }
    //2、配置一个web监控的filter
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
        Map<String,String> initParams = new HashMap<>();
        initParams.put("exclusions","*.js,*.css,/druid/*");
        bean.setInitParameters(initParams);
        bean.setUrlPatterns(Arrays.asList("/*"));
        return  bean;
    }
}

为了方便测试,我们加一个Controller

package com.java18.vipmgr.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    JdbcTemplate jdbcTemplate;
    @GetMapping("getAll")
    public List<Map<String,Object>> getAll(){
        return jdbcTemplate.queryForList("select * from users");
    }
}

注意,这边有个小坑,因为我们用了druid的监控功能,会默认打印日志,于是就需要引入log4j。

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

启动项目,访问http://localhost:8888/user/getAll,可以查询数据。然后再访问 http://localhost:8888/druid

13.png

输入账号密码就可以进入监控页面啦

14.png

可以查看各条sql的运行情况,这就是为什么使用Druid的原因啦。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
Cloud Native Java C++
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
文章介绍如何在Spring Boot 3中利用GraalVM将Java应用程序编译成独立的本机二进制文件,从而提高启动速度、减少内存占用,并实现不依赖JVM运行。
403 1
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
|
3月前
|
前端开发 Java 数据安全/隐私保护
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
文章通过一个简单的SpringBoot项目,详细介绍了前后端如何实现用户登录功能,包括前端登录页面的创建、后端登录逻辑的处理、使用session验证用户身份以及获取已登录用户信息的方法。
549 2
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
|
3月前
|
IDE Java 程序员
学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程
本文提供了如何使用学生邮箱免费获取并安装JetBrains全家桶(包括IDEA、PyCharm等)的详细教程,涵盖了学生认证、软件下载、安装及常见问题的解决方法。
661 0
学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程
|
1天前
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
11 0
|
3月前
|
Java API Apache
Springboot+shiro,完整教程,带你学会shiro
这篇文章提供了一个完整的Apache Shiro与Spring Boot结合使用的教程,包括Shiro的配置、使用以及在非Web和Web环境中进行身份验证和授权的示例。
153 2
Springboot+shiro,完整教程,带你学会shiro
|
3月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
782 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
3月前
|
缓存 NoSQL Java
springboot的缓存和redis缓存,入门级别教程
本文介绍了Spring Boot中的缓存机制,包括使用默认的JVM缓存和集成Redis缓存,以及如何配置和使用缓存来提高应用程序性能。
149 1
springboot的缓存和redis缓存,入门级别教程
|
4月前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
|
3月前
|
Java Maven Spring
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)
这篇文章介绍了在IntelliJ IDEA社区版中创建Spring Boot项目的三种方法,特别强调了第三种方法的详细步骤。
2005 0
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)
|
3月前
|
Oracle IDE Java
IDEA安装教程配置java环境(超详细)
IDEA安装教程配置java环境(超详细)
1808 1

热门文章

最新文章