【springboot】基础篇 - 学习记录

1. 简介

在基础学习部分使用SpringBoot+Postgresql+mybatis技术进行实现。

2. SpringBoot

Spring Boot 是一个基于 Java 的开源框架,由 Pivotal 团队开发,旨在简化 Spring 应用程序的创建、配置和部署过程。它通过“约定优于配置”的设计理念,减少了开发人员的工作量,使开发者能够快速构建出高质量的应用程序。Spring Boot 的核心目标是简化新 Spring 应用的初始搭建以及开发过程,通过特定的方式进行配置,从而避免了繁琐的样板化配置。

2.1 springdata 数据获取

  1. Spring Data:Spring Data 是 Spring Framework 的一部分,它提供了一种一致的数据访问方法,包括关系型、非关系型和 MapReduce 等。Spring Data 通过简化数据访问层的开发,使得开发者可以专注于业务逻辑的实现,而不是繁琐的数据访问配置。

2.2 springframework 核心功能

  1. Spring Framework 核心功能:Spring Framework 最初的核心功能是 Spring IoC(控制反转)和 Spring AOP(面向切面编程)。这些功能奠定了 Spring 的基础,随着 Spring 的不断发展,它引入了 Spring 事务、Spring MVC 等一系列伟大的产品,最终成就了 Spring 帝国,几乎可以解决企业开发中的所有问题。

2.3 springsecurity认证授权

  1. Spring Security:Spring Security 是 Spring Framework 的一部分,它通过全面且可扩展的身份验证和授权支持来保护应用程序。Spring Security 提供了多种安全机制,如基于表单的登录、基于 JWT 的认证、基于角色的访问控制等,确保应用程序的安全性。

2.4 springamqp消息传递

  1. Spring AMQP:Spring AMQP 是 Spring Framework 的一部分,它提供了一种简单的方式来使用 RabbitMQ 进行消息传递。Spring AMQP 通过抽象 RabbitMQ 的底层细节,使得开发者可以专注于业务逻辑的实现,而不是繁琐的消息传递配置

2.5 springcloud服务治理

  1. Spring Cloud:Spring Cloud 是一系列框架的集合,它利用 Spring Boot 的开发便利性,简化了分布式系统基础设施的开发。Spring Cloud 包括服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等功能,可以实现一键启动和部署。Spring Cloud 是为了解决微服务架构中的服务治理问题而开发的框架,它完全基于 Spring Boot 开发。

2.6 传统spring与springboot对比

1传统构建spring应用程序缺点 

导入依赖繁琐

项目配置繁琐

 2 springboot应用程序优点

起步依赖:本质就是一个Maven坐标,整合了一个完成一个功能需要的所有坐标

自动配置:bean对象会自动注入到ioc容器,不需要手动声明,简化开发

其他特性:内嵌的Tomcat,Jetty(无需部署WAR文件),外部化配置,不需要XML配置(properties/yml)

补充:

Spring Boot 的主要特点包括:

  1. 内嵌 Servlet 容器:Spring Boot 内嵌了 Tomcat、Jetty 或 Undertow 等 Servlet 容器,使得开发者无需部署 WAR 文件,只需将项目打包成 JAR 文件,然后通过 java -jar 命令即可运行。
  2. 简化 Maven 配置:Spring Boot 提供了丰富的 starter 依赖,开发者只需添加这些 starter,Spring Boot 会自动引入所需的依赖项,从而简化了 Maven 的配置。
  3. 自动配置:Spring Boot 通过 META-INF/spring.factories 文件实现了自动配置,根据项目的依赖关系自动配置 Spring 的组件,减少了手动配置的工作量。
  4. 支持多种技术集成:Spring Boot 支持与多种技术的集成,如 MyBatis、Hibernate、Thymeleaf、WebSocket、Redis、RabbitMQ 等,使得开发者可以灵活地选择所需的技术栈。
  5. 快速开发:Spring Boot 提供了丰富的 starter 和默认配置,使得开发者能够快速构建应用程序,而无需花费大量时间在配置上。

3. 创建简单项目

3.1 IDEA无springboot插件时

【springboot】IDEA手动创建SpringBoot简单工程(无插件)-CSDN博客

3.2 IDEA有springboot插件时 

【springboot】IDEA创建SpringBoot简单工程(有插件)-CSDN博客

4. 学习路径

4.1 配置文件

1. propertoes配置文件

官方文档

常见应用程序属性 :: Spring Boot

示例

修改Tomcat的端口号和虚拟目录

2. yaml配置文件

更加常用:1.层级表示更加明确2.更关注数据

application.yml

示例
server:
  port: 9191
  servlet:
    context-path: /start1

3. 配置信息书写与获取

三方技术配置信息

自定义配置信息

如果将相关的配置信息写入代码中,那么在打包的时候就会修改java代码并且需要重新打包,如果卸载配置文件中,只需要更改配置文件即可也不需要重新打包

书写

数组配置书写

获取:单个获取

简化:整个类属性批量获取

4.2 整合MyBatis

4.2.1 创建数据库 

1. 数据库安装:

【PostgreSQL】安装及使用(Navicat/Arcgis),连接(C#)_postgresql navicat-CSDN博客

2. 数据库连接

下载驱动

由于我电脑上安装的两个版本的Postgresql12和14所以端口得修改

添加表数据

打开编写窗口

以下是mysql数据库的语句

create database if not exists mybatis;

use mybatis;

create table user(
    id int unsigned primary key auto_increment comment 'ID',
    name varchar(100) comment '姓名',
    age tinyint unsigned comment '年龄',
    gender tinyint unsigned comment '性别, 1:男, 2:女',
    phone varchar(11) comment '手机号'
) comment '用户表';

insert into user(id, name, age, gender, phone) VALUES (null,'白眉鹰王',55,'1','18800000000');
insert into user(id, name, age, gender, phone) VALUES (null,'金毛狮王',45,'1','18800000001');
insert into user(id, name, age, gender, phone) VALUES (null,'青翼蝠王',38,'1','18800000002');
insert into user(id, name, age, gender, phone) VALUES (null,'紫衫龙王',42,'2','18800000003');
insert into user(id, name, age, gender, phone) VALUES (null,'光明左使',37,'1','18800000004');
insert into user(id, name, age, gender, phone) VALUES (null,'光明右使',48,'1','18800000005');

以下是postgresql的语句(注意不要建立user表,会与原始的user表冲突)

-- 1. 创建数据库(兼容IF NOT EXISTS语法需调整)
CREATE DATABASE mybatis;


-- 2. 连接数据库(PostgreSQL无USE命令)
\c mybatis;


-- 3. 创建表(处理自增主键、无符号类型、注释语法)
CREATE TABLE "usertest" (
                        id SERIAL PRIMARY KEY,  -- 自增主键改造
                        name VARCHAR(100),      -- 字符串类型兼容
                        age SMALLINT,           -- TINYINT UNSIGNED → SMALLINT
                        gender SMALLINT,        -- 同age处理逻辑
                        phone VARCHAR(11)       -- 保留原定义
);
COMMENT ON TABLE "usertest" IS '用户表';  -- 表注释单独设置
COMMENT ON COLUMN "usertest".id IS 'ID';
COMMENT ON COLUMN "usertest".name IS '姓名';
COMMENT ON COLUMN "usertest".age IS '年龄';
COMMENT ON COLUMN "usertest".gender IS '性别, 1:男, 2:女';
COMMENT ON COLUMN "usertest".phone IS '手机号';

-- 4. 插入数据(处理自增列、单引号规范)
INSERT INTO "usertest" (name, age, gender, phone) VALUES
                                                  ('白眉鹰王', 55, 1, '18800000000'),  -- 省略自增id [[20]][[10]]
                                                  ('金毛狮王', 45, 1, '18800000001'),
                                                  ('青翼蝠王', 38, 1, '18800000002'),
                                                  ('紫衫龙王', 42, 2, '18800000003'),
                                                  ('光明左使', 37, 1, '18800000004'),
                                                  ('光明右使', 48, 1, '18800000005');

4.2.2 代码实现

1. 添加镜像,方便下载依赖
    <!-- 配置阿里云仓库 -->
    <repositories>
        <repository>
            <id>aliyun-repos</id>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>aliyun-repos</id>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
2.添加mybatis起步依赖

        <!--mybatis的起步依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
3. 添加 postgresql 数据库的驱动依赖

        <!--postgresql驱动依赖-->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>
4. 创建User实体类
package com.zwh.springbootmybatis.pojo;

public class User {
    
    private Integer id;
    private String name;
    private Short age;
    private Short gender;
    private String phone;

    public User() {
    }

    public User(Integer id, String name, Short age, Short gender, String phone) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.phone = phone;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Short getAge() {
        return age;
    }

    public void setAge(Short age) {
        this.age = age;
    }

    public Short getGender() {
        return gender;
    }

    public void setGender(Short gender) {
        this.gender = gender;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                ", phone='" + phone + '\'' +
                '}';
    }
}
5. 创建数据库交互接口 Mapper
package com.zwh.springbootmybatis.mapper;

import com.zwh.springbootmybatis.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper {
    @Select("select * from user where id = #{id}")
    public User findById(Integer id);
}
6. 创建业务逻辑接口 Service

package com.zwh.springbootmybatis.service;

import com.zwh.springbootmybatis.pojo.User;

public interface UserService {
    public User findById(Integer id);
}
7. 创建接口的实现类 ServiceImpl

package com.zwh.springbootmybatis.service.impl;

import com.zwh.springbootmybatis.mapper.UserMapper;
import com.zwh.springbootmybatis.pojo.User;
import com.zwh.springbootmybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public User findById(Integer id) {
        return userMapper.findById(id);
    }
}
8. 处理前端请求  Controller

package com.zwh.springbootmybatis.Controller;

import com.zwh.springbootmybatis.pojo.User;
import com.zwh.springbootmybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @Autowired
    private UserService userService;
    @RequestMapping("/findById")
    public User findById(Integer id){
        return userService.findById(id);
    }
}
9.运行 
http://127.0.0.1:8080/findById?id=1

 

mapperserviceimplpojocontroller讲解

在Spring Boot中,mapperserviceimplpojocontroller是分层架构中的关键组件,它们分别负责不同的职责:

  1. Mapper:通常指MyBatis的Mapper接口,用于定义与数据库交互的方法。这些方法的具体实现(如SQL语句)通常放在mapper.xml文件中。Mapper接口通过@Mapper注解标识,并且可以继承BaseMapper等通用接口。

  2. Service:表示业务逻辑层的接口,定义了业务逻辑的方法。Service接口通常由ServiceImpl实现,实现类中会调用Mapper接口来执行数据库操作。

  3. ServiceImpl:是Service接口的实现类,负责具体的业务逻辑处理。它通常通过@Service注解标识,并且会注入Mapper接口以获取数据库操作能力。

  4. Pojo(Plain Old Java Object) :表示实体类,通常用于映射数据库表。Pojo类包含字段和对应的getter/setter方法,用于在Java对象与数据库之间进行数据转换。

  5. Controller:负责处理前端请求,作为应用的入口点。Controller通过@Controller@RestController注解标识,并调用Service层的方法来处理业务逻辑。

这些组件共同构成了Spring Boot的分层架构,使得代码结构清晰、易于维护和扩展。

4.3 Bean管理

4.3.1 Bean扫描

springbootapplication注解是包含springbootconfiguration、和enableautoconfiguration和componentscan注解,所以能扫描到springbootquickstart文件夹内的内容

非springbootquickstart文件夹解决扫描问题

这样就可以扫描到itheima下的内容了

4.3.2 Bean注册

1. 第三方文件如何注册

如果要注册的bean对象来自于第三方(不是自定义的),是无法用@Component及衍生注解声明bean的

解决以上方法用@Bean和@import可以解决 

安装自定义jar包
mvn install:install-file -Dfile=C:\Users\10618\Desktop\02_Bean注册资料\common-pojo-1.0-SNAPSHOT.jar -DgroupId=cn.itcast -DartifactId=common-pojo -Dversion=1.0 -Dpackaging=jar

install:install-file 通过本地文件来安装

-Dfile 本地磁盘的路径

-DgroupId 指定jar包安装完成后的组织名

-DartifactId 安装后的工程名字

-Dversion 版本

-Dpackaging 打包的方式 

安装完成

本地安装

添加依赖 

如果失败的话请查看该idea的 maven本地仓库中是否有对应文件,没有的话复制进来即可

 查看文件内容

2. 使用@Bean
在启动类中注册bean对象:不推荐

package com.zwh.springbootregedit;

import cn.itcast.pojo.Country;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringbootRegeditApplication {

    public static void main(String[] args) {

        ApplicationContext applicationContext =SpringApplication.run(SpringbootRegeditApplication.class, args);
        Country country=applicationContext.getBean(Country.class);
        System.out.println(country);
    }

    //注入Country对象
    @Bean
    public Country Country(){
        return new Country();
    }

}

在配置类中集中注册:推荐

注意添加@Configuration

先获取bean,再输出 

修改名称,默认就是函数名称

Bean嵌套使用

3. 使用@Import 

常用于

导入配置类

导入ImportSelector接口实现类

 导入配置类
数组批量注入

导入ImportSelector接口实现类(解决以上数组批量导入不优雅的情况)

优化类名从配置文件中导入,这样会让程序变得更加灵活 

写配置文件

读取配置文件

再次优化,将其写到一个注解类中

 创建注解类

引用注解类

4.3.3 添加 Bean 注册条件

注入到容器内实体类型对象的属性都是null,这些对象并没有什么实际的意义,因为实体类的对象就是来封装对象的,结果你这些对象中什么都没有;

普通解决方案

1.给这些属性赋值然后再注入bean

但是这些属性又是固定的不是很好,所以写入到配置文件中

将配置文件中的内容进行注释,发现直接报错

但是想要的效果是在配置文件中没有找到对应值,就不进行注入bean,有值的情况下才进行注入

SpringBoot提供了设置注册生效调价的注解@conditional

以下是基于该注解的衍生注解

以下三个是常用的注解

@ConditionalOnProperty

这样就没有注入Country这个类

打开配置这样就注入了

@ConditionalOnMissingBean

@ConditionalOnClass

目前我环境中的web依赖是注释掉的

4.4 自动配置原理

为什么要学习自动配置原理

1.在实际开发中我们经常会定义一些公共的组件,然后提供给各个部门使用,为了使用方便我们会将公共的组件定义为starer,如果你想自定义starter,就必须先了解自定义配置原理

2.应对,面试

自动配置

遵循预定大约配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器

之前我们注入bean并不是自动注入配置

源码分析(不用看)

举例:程序引入spring-boot-starter-web起步依赖,启动后,会自动向ioc容器中注入DispatcherServlet类

自动配置注解

总结

2.7之前的配置类是写在spring.factories中的,2.7-3.0spring.factories和imports都可以,3.0以后只支持imports

如何实现自动配置

根据以上实现思路写出以下2.0的脚本文件

引入

这个jar包可以完成自动配置

面试回答

4.5 自定义stater

场景

在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot的starter

创建自定义mybatis的starter

步骤

创建maven工程

工程1

工程2

原始mybatis的文件结构

添加依赖包

创建自动配置类

更换自己写的dmybatis-spring-boot-starter依赖,运行

参考文献

基础篇-05_yml配置信息书写和获取_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z_W_H_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值