0%

Springboot

SpringBoot

1.创建springboot项目

创建一个springinitializr项目,选择对应的依赖,完成项目的创建

项目的目录结构中会有一个程序的主入口以及一个空的配置文件
以添加了spring-web依赖的springboot项目为例子,pom文件配置如下

==如果jdk版本为8,则需要修改spring-boot-starter-parent的版本低于3开头的版本,因为3以上版本需要jdk最低的版本为17==

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?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.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.kuang</groupId>
<artifactId>helloworld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringBootTest1</name>
<description>SpringBootTest1</description>
<properties>
<java.version>22</java.version>
</properties>

<!-- springboot项目中的依赖都是以spring-boot-starter开头的 -->
<dependencies>
<!--web依赖:tomcat,dispatcherServlet,xml,... -->
<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>
</dependencies>
<build>
<plugins>
<!-- 打jar包的插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

==在application.properties配置文件中可以修改端口号等等==

2.SpringBoot自动装配原理

自动配置:

pom.xml

  • spring-boot-dependencies:核心依赖在父工程中
  • 我们在写入或者引入一些Springboot依赖的时候,不需要指定版本,就因为有这些版本仓库

启动器

  •        <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    - 启动器:说白了就是SpringBoot的启动场景

    - 比如说spring-boot-starter-web,他就会帮我们自动导入web环境的所有依赖

    - springboot会将所有的功能场景,都变成一个个启动器

    - 我们要使用什么功能,只需要找到对应的启动器就可以了

    **主程序**

    - ```java
    //springboot本身就是spring的一个组件
    //程序的主入口,不能删不能改
    @SpringBootApplication//标注这个类是一个springboot的应用
    public class SpringBootTest1Application {
    //将springboot应用启动
    public static void main(String[] args) {
    SpringApplication.run(SpringBootTest1Application.class, args);
    }
    }
  • springApplication类主要做的四大事件

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

结论:springboot所有自动配置都是在启动的时候,扫描并且加载:spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们的自动装配就会生效,然后配置成功

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

3.Springboot配置

我们一般不用后缀为properties的配置文件,而用后缀为yml的配置文件

yaml可以直接给实体类赋值

下面是yaml表达式:

1
2
3
4
5
6
7
8
9
10
11
12
13
person:
name: qingjiang
age: 3
happy: false
birth: 2019/11/02
maps: {k1: v1,k2: v2}
lists:
- code
- music
- girl
dog:
name: 旺财
id: 3

对应的person类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Data
@Component
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
}

yaml配置文件对person的属性进行批量赋值

4.SpringBoot Web开发

jar:webapp!

自动装配

springboot到底帮我们装配了什么,能不能进行修改,能修改哪些东西,能不能进行拓展

  1. xxxAutoConfigure: 向容器中自动装配组件
  2. xxxProperties :自动装配类,装配配置文件中自定义的一些内容

web开发解决的问题:

  • 导入静态资源问题……..
  • 首页
  • jsp,模板引擎Thymeleaf
  • 装配拓展springmvc
  • 增删改查
  • 拦截器
  • 国际化

静态资源总结:

1.在springboot,我们可以使用以下方式处理静态资源

  • webjars localhost:8080/webjars/
  • public ,static,/**,resources localhost:8080/

2.优先级:resources>static(默认)>public

5.模板引擎

导入对应的依赖

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>3.2.4</version>
</dependency>

将html页面放在templates目录下即可

1
2
private String prefix = "classpath:/templates/";
private String suffix = ".html";

6.员工管理系统

6.1首页

根目录下面的东西最好在config类里面配置

在html头部添加 xmlns:th=”http://www.thymeleaf.org"约束

在属性面前添加th

6.2登录

给index.html页面绑定username和password属性

7.SpringBoot整合JDBC

7.1整合JDBC

springboot默认的数据源是hikari

连接数据库的application.yaml配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
spring:
datasource:
username: root
password: 20050116
url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
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: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

7.2SpringBoot整合Druid

更换springboot的数据源:**在yaml文件中配置 type: 数据源的名称

Druid自带有log4j日志功能,需要导入log4j-core的依赖

Druid绑定yaml文件:

1
2
3
4
5
6
7
8
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource dataSource(){
return new DruidDataSource();
}
}

对如上代码的解释

这段代码是一个典型的Spring Boot中使用@Configuration注解配置数据源的示例。下面是每一行代码的解释:

  1. @Configuration: 这是一个注解,用于标识这个类是一个配置类,它告诉Spring容器这个类包含了Bean的配置信息。

  2. public class DruidConfig {: 定义了一个名为DruidConfig的Java类,这个类用于配置Druid数据源。

  3. @ConfigurationProperties(prefix = "spring.datasource"): 这是一个Spring Boot提供的注解,它能够从application.propertiesapplication.yml文件中读取以spring.datasource开头的属性,并将它们绑定到对应的字段或属性上。

  4. @Bean: 这是一个方法级别的注解,用于告诉Spring容器,这个方法将会返回一个Bean,并且将其加入到容器中。在这个示例中,dataSource()方法将返回一个DataSource类型的Bean。

  5. public DataSource dataSource(){: 这是一个公共方法,返回类型为DataSource,方法名为dataSource(),它是用来创建并配置数据源Bean的。

  6. return new DruidDataSource();: 在dataSource()方法中,创建了一个新的DruidDataSource对象,并将其作为数据源Bean返回。

通过以上代码,Spring容器会读取application.propertiesapplication.yml中以spring.datasource开头的属性,然后将这些属性值绑定到DruidDataSource对象中,最后将这个数据源Bean加入到Spring容器中供其他组件使用。

Druid监控功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//后台监控 :web.xml,ServletRegistrationBean
//因为springboot内置了servlet容器,所以没有web.xml 替代方法:ServletRegistraBean 自己注入
@Bean
public ServletRegistrationBean StatViewServlet(){
ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");//druid是访问的url
//后台需要登录,配置账号密码
HashMap<String,String> initParameters = new HashMap<>();
//增加配置
initParameters.put("loginUsername","admin"); //登录key是固定的,即loginUsername和loginPassword这两个键是不可改变的
initParameters.put("loginPassword","20050116");

//允许谁可以访问
// initParameters.put("allow","");如果allow后面的参数为空,则所有人都可以访问
initParameters.put("allow","localhost");//一般是写具体的人,在这里是本机可以访问

//禁止谁可以访问
//initParameters.put("kuangshen","192.168.11.123");//配置完成后,禁止该ip进行访问

bean.setInitParameters(initParameters);//设置初始化参数
return bean;
}

Druid过滤器

1
2
3
4
5
6
7
8
9
10
11
12
//filter
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
//可以过滤哪些请求
HashMap<String,String > initParameters = new HashMap<>();
//这些东西不进行统计
initParameters.put("exclusion","*.js,*.css,/druid/*");
bean.setInitParameters(initParameters);
return bean;
}

8.SpringBoot整合Mybatis

整合包,导入mybatis-spring-boot-starter依赖

1
2
3
4
5
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>

在application文件中配置mybatis:即==整合mybatis==

1
2
mybatis.type-aliases-package="对应pojo包的位置"
mybatis.mapper-locations=classpath:"mapper接口对用放xml文件的包的位置"/*.xml

写sql语句也可以使用注解开发,在对应方法上加上select注解,但是在复杂的关系表中不建议使用注解开发

1
2
@Select("select * from users")
List<Users> AllUser();

SQL片段的作用和使用

  • 作用:
    将重复的sql语句抽出来放到sql标签中,然后通过<include refid=”” />来引入
1
2
3
4
5
<sq1 id="userColumns">id,user_name,password,name,age,sex,birthday,created,updated</sql>
<select id= "queryUserByID" parameterType= "long" resultMap= "userResul tMap">
SELECT <include refid="userColumns"/> FROM tb_ user WHERE id = ${id}
</select>

  • 使用:

    • 在一个mapper.xml 中使用<sql id=(id就是一个标识)> 去定义sql片段,然后在需要的位置使用<include> 引入

      注意:这里include里面的refid属性填写的内容是定义sql片段的id

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      <!--定义sql片段-->
      <sql id= "userColumn ">
      id, user_ name,password, name , age, sex, birthday , created , updated
      </sql>
      <!--书写CURD操作 -->
      <!--id是方法的名字
      resultType :结果集映射类型
      -->
      <select id= "queryAllUser" resultType= "User">
      select <include refid= "userColumn"></include> from tb_ user
      </ select>

    • 将所有的公用的SQL片段集中定义到一个Mapper.xml文件中,其他Mapper.xml文件如需引入mybatis-config.xml,通过命名空间.id即可

    ==url请求都是get请求==

@Mapper

@Mapper注解通常用于基于 MyBatis 框架的 Java 项目中。它的作用是将一个 Java 接口标记为 MyBatis 的映射器接口,用于定义 SQL 查询、更新、删除等数据库操作的方法。MyBatis 框架会根据这些接口生成对应的实现类,从而实现数据访问操作。

@Repository

@Repository 注解通常用于 Spring 框架中的 Java 项目中。它的作用是将一个 Java 类标记为数据访问组件,通常用于与数据库交互的 DAO 类。@Repository 注解通常与其他 Spring 组件,如 @Service@Controller 配合使用,以实现数据访问、业务逻辑处理和控制层的分离

9.MVC架构再理解

  1. 对应数据库编写对应的实体类
  2. dao层即数据对象访问层,跟mapper层差不多,在该层主要由接口构成,这些接口与数据库进行交互,定义一系列方法,每个方法对应一个对数据库的操作
  3. service层即服务层,编写一个service接口和该service接口的实现类,在service接口写出相应方法,在实现类中继承接口,自动注入对应的Mapper接口,重写service接口里面的方法,调用mapper接口里面的方法并返回
  4. controller层即控制层,在controller层自动注入service层接口,定义方法,在方法里面调用接口的方法,在Controller层通过接口类型注入Service时,Spring框架会自动找到该接口的某个实现类(前提是已经配置或扫描到了这个实现类,并且实现了接口中声明的所有方法)。在实际执行时,调用接口方法时,实际上是调用了该接口对应实现类中重写的方法。

10.SpringSecurity

在web开发中,安全是第一位的,可以使用过滤器和拦截器进行保障安全(但是需要大量的原生代码,冗余),也可以使用框架保护安全

常见的安全框架:SpringSecurity,shiro

功能:认证,授权

权限的分类

  • 功能权限
  • 访问权限
  • 菜单权限

AOP:横切 - 配置类

记住几个类:

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