SpringBoot框架(万字图文全面详解)

SpringBoot框架(万字图文全面详解)-mikechen

SpringBoot框架定义

Spring Boot 是一个基于 Spring 框架的轻量级开发框架,它可以帮助开发者快速创建、配置和部署基于 Spring 的应用程序。

Spring Boot简化了 Spring 应用程序的开发和部署流程,让开发者可以更专注于业务开发,而不必过多关注底层技术和配置。

 

SpringBoot框架特点

SpringBoot框架(万字图文全面详解)-mikechen

Spring Boot 的特点:

  1. 简单易用:Spring Boot 可以快速创建和部署应用程序,使得开发者可以更专注于业务逻辑的实现。
  2. 自动配置:Spring Boot 可以根据项目的依赖自动配置应用程序,开发者不必手动进行配置。
  3. 微服务支持:Spring Boot 提供了一些微服务相关的特性,例如基于 HTTP、REST、WebSocket 的通信、服务发现和注册等。
  4. 组件化:Spring Boot 可以将应用程序划分为不同的模块,每个模块都是一个组件,可以独立开发、测试和部署。
  5. 健康检查:Spring Boot 提供了健康检查功能,可以监测应用程序的运行状况,帮助开发者快速发现和解决问题。

 

SpringBoot框架入门案例

第一步:创建项目,首先在左上角的file->new->project。

如下图所示:

SpringBoot框架(万字图文全面详解)-mikechen

第二步:SpringBoot初始化,选择左侧的Spring Initializer。

如下图所示:

SpringBoot框架(万字图文全面详解)-mikechen

第三步:添加项目名称信息,选择JDK安装版本,以及填写项目名称和本地存储路径。

如下图所示:

SpringBoot框架(万字图文全面详解)-mikechen

第四步:选择Maven依赖,选择依赖Spring Web,其他依赖看需要勾选。

如下图所示:

SpringBoot框架(万字图文全面详解)-mikechen

第五步:一路Next,最后完成项目。

然后点击Next,最后Finish项目创建完成,Springboot目录结构如下图所示:

SpringBoot框架(万字图文全面详解)-mikechen

 

SpringBoot框架配置文件

Spring Boot配置文件格式,主要包括:properties和yaml。

1.properties格式

properties文件格式是key=value的形式,一般用于配置简单的属性。

在Spring Boot中,可以通过在application.properties文件中设置属性来配置应用程序。

示例如下:

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=123456

 

2.YAML文件格式

在Spring Boot中,可以通过在application.yml文件中设置属性来配置应用程序。

YAML文件格式是基于缩进的层级结构,相对于properties文件更加灵活和易读。

示例如下:

# 服务端口号
server:
  port: 8080

# 数据库配置
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&characterEncoding=utf-8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

# MyBatis配置
mybatis:
  mapper-locations: classpath:mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true

# 日志配置
logging:
  level:
    root: info
    com.example: debug

在YAML文件中,每个属性都必须对齐,并且不能使用tab键进行缩进。

 

3.SpringBoot配置文件

SpringBoot项目启动会扫描以下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件。

比如:下面我以application.properties配置文件为例,application.properties可以放置四个位置,优先级从1到4依次递减。

file:./config/ ( 项目根路径下的config文件夹)
file:./  (项目根路径)
classpath:/config/ (类路径下的config文件夹)
classpath:/ (类路径)

如下图所示:
SpringBoot框架(万字图文全面详解)-mikechen
优先级由高到底,高优先级的配置会覆盖低优先级的配置。

所以说,我们平时通过IDEA创建的SpringBoot工程在resource目录下自动生成的配置文件,优先级最低。

 

SpringBoot常用注解

我们开发任何一个Spring Boot项目,都会用到如下的启动类:

SpringBoot框架(万字图文全面详解)-mikechen

这里就会涉及到SpringBoot注解,我们点击这个注解,如下图所示:

SpringBoot框架(万字图文全面详解)-mikechen

@SpringBootApplication我标出来的这三个注解,是非常重要的。

分别是:

  • @SpringBootConfiguration;
  • @ComponentScan;
  • @EnableAutoConfiguration;

自动配置@EnableAutoConfiguration

Spring Boot自动配置注解,开启这个注解之后,此注释自动载入应用程序所需的所有Bean——这依赖于Spring Boot在类路径中的查找。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
 
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
 
    Class<?>[] exclude() default {};
 
    
    String[] excludeName() default {};
 
}

 

组件扫描@ComponentScan

组件扫描其实很简单,@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中。

比如:

@ComponentScan(“com.mikechen.test”)
@SpringBootApplication
public class SpringbootApplication {

这么做扫描的范围扩大到整个父包com.mikechen.test包。

@ComponentScan注解默认就会装配标识了:

  • @Controller
  • @Service
  • @Repository
  • @Component

 

@Service注解

@Service注解用于类上,标记当前类是一个service类。

比如:

@Service("courseDAO")
@Scope("prototype")
public class CourseDAOImpl extends HibernateDaoSupport implements CourseDAO{
        ...    
}

 

@Repository注解

用于标注数据访问组件,即DAO组件,使用@Repository注解可以确保DAO或者repositories提供异常转译。

具体示例,如下:

@Repository
public class UserDaoImpl implements UserDao{
    
    @Override
    public int insertUser(){
        JdbcTemplate template = new JdbcTemplate();
        ...
    }
}

 

@Component注解

@component是spring中的一个注解,它的作用就是实现bean的注入。

 

@RestController注解

在一个类上添加@Controller注解,表明了这个类是一个控制器类,类似struts中的action。

具体示例如下:

@RestController
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/test")
    public Map addGoodsToCartList(Long itemId, Integer num) {
           Map map = new HashMap();
           map.put("success", true);
           map.put("message", "welcome");
           return map;
    }
}

 

SpringBoot框架整合

一.SpringBoot整合Redis

1.引入依赖包

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

 

2.添加配置文件

配置文件主要包含:服务器地址、端口、密码、连接池最大连接、最大最小空闲连接等信息。

详细的配置如下:

# Redis数据库索引(默认为0)
spring.redis.database=0

# Redis服务器地址
spring.redis.host=127.0.0.1

# Redis服务器连接端口
spring.redis.port=6379

# Redis服务器连接密码(默认为空)
spring.redis.password=mikechen

# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8

# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1

# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8

# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0

#超时时间,单位为毫秒
spring.redis.timeout=30000

 

3.创建 RedisTemplate 对象,并注入到需要使用 Redis 的类中

@Configuration
public class RedisConfig {
 
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        return template;
    }
}

 

4.在需要使用 Redis 的类中使用 RedisTemplate 对象进行操作

@Autowired
private RedisTemplate<String, Object> redisTemplate;
 
public void set(String key, Object value) {
    redisTemplate.opsForValue().set(key, value);
}
 
public Object get(String key) {
    return redisTemplate.opsForValue().get(key);
}

 

 

二.SpringBoot整合Mybatis

1.在 pom.xml 中添加 Mybatis 和数据库驱动的依赖

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
    <scope>test</scope>
</dependency>

 

2.在 application.properties 中配置数据库连接信息

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

 

3.创建一个 Mapper 接口

@Mapper
public interface UserMapper {
    User findUserById(int id);
    List<User> findAllUsers();
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}

 

4.创建对应的 Mapper XML 文件,存放在 resources 目录下

<?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.demo.mapper.UserMapper">
 
    <resultMap id="userResultMap" type="com.example.demo.entity.User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
    </resultMap>
 
    <select id="findUserById" resultMap="userResultMap">
        select id, name, age from users where id = #{id}
    </select>
 
    <select id="findAllUsers" resultMap="userResultMap">
        select id, name, age from users
    </select>
 
    <insert id="insertUser" parameterType="com.example.demo.entity.User">
        insert into users(name, age) values(#{name}, #{age})
    </insert>
 
    <update id="updateUser" parameterType="com.example.demo.entity.User">
        update users set name = #{name}, age = #{age} where id = #{id}
    </update>
 
    <delete id="deleteUser" parameterType="int">
        delete from users where id = #{id}
    </delete>
 
</mapper>

 

5.在 Spring Boot 应用程序中注入 UserMapper 接口

@Autowired
private UserMapper userMapper;

SpringBoot框架原理

SpringBoot原理,如下图所示:

SpringBoot框架(万字图文全面详解)-mikechen

主要分为如下11个步骤:

1)创建 Spring Application 实例,调用 run 方法,同时将启动入口类作 为参数传递进去,由此开始了 Spring Boot 内部相关核心组件以及配置的 启动和加载;

2)通过 Spring Factories Loader 加载 META-INF/spring.factories 文 件;

3)然后由 SpringApplicationRunListener 来发出 starting 消息;

4)创建参数,并配置当前 SpringBoot 应用需要使用的 Environment 实 例;

5)完成之后,依然由 SpringApplicationRunListener 来发出 environmentPrepared 消息;

6)创建 Spring 的应用上下文实例:ApplicationContext,初始化该实例 并设置应用环境配置实例:Environment,同时加载相关的配置项;

7)由 SpringApplicationRunListener 发出 contextPrepared 消息,告 知 SpringBoot 应用当前使用的 ApplicationContext 已准备完毕;

8)将各种 Bean 组件装载入 Spring 的 IO 容器/应用上下文: ApplicationContext 中,继续由 SpringApplicationRunListener 来发出 contextLoaded 消息,告知 SpringBoot 应用当前使用的 ApplicationContext 已准备完毕;

9)重新刷新 Refresh Spring 的应用上下文实例:ApplicationContext, 完成 IOC 容器可用的最后一步;

10)由 SpringApplicationRunListener 发出 started 消息,完成最终的 程序的启动;

11)由 SpringApplicationRunListener 发出 running 消息,告知程序已 成功运行起来了。

以上就是SpringBoot框架详解,希望对你掌握SpringBoot有所帮助!

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读作者mikechen更多架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多架构干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法