SpringBoot的启动过程以及常用的注解

星期四, 4月 23, 2026 | 1分钟阅读 | 更新于 星期四, 4月 23, 2026

@

springboot框架约定好了各个部分代码的职责,分层明显,各个模块各司其职,这样比较好维护。但是整个后端项目是如何启动的?我要去了解一下原理。

同时看一下各个模块常用的注解是什么?方便我看懂代码。

springboot的main方法只有寥寥几行代码,从main方法并不能看出来整个后端的代码是如何跑起来的。所以还是得从springboot的架构入手。

第一步

spring是一个大Map,键值对的类型分别是String和Object,启动的第一步就是创建出一个巨大的空的Map,用来把各种对象装进去,各种对象就是Bean。

启动的时候main有一个注解,是SpringBootApplication,这个注解有一个功能是组件扫描,启动的时候从main所在的类开始寻找,将所有的带注解的对象都记下来。比如带Controller、Service、Component注解的对象。

启动的时候自动配置一堆东西,比如数据库、依赖。这个主要是根据pom.xml,application.yml这些配置文件。

第二步

将上一步扫描到的Bean都实例化,放到IoC容器里面,就是一开始创建的Map,然后就要决定这些Bean用到哪里去?

代码里面会写明,这个叫依赖注入,或者叫构造器注入。

一般会用Autowired注解来说明当前的代码需要一个实例化的Bean来使用。

比如一个Controller需要一个Service,但是Controller不需要自己new一个,IoC会给它一个。

到这一步,就是启动的时候在命令行上看到Spring字符画的时候。这个时候就算是Tomcat容器启动好了。

Controller常用的注解

主要有

  • @RestController,不返回网页html,只返回json数据。
  • @RequestMapping,规定这个方法负责哪个路径的请求。
  • @GetMapping,同上,负责get请求。
  • 接收参数的三个注解
    • @PathVariable,得到url路径里面的参数
    • @RequestParam,得到url的问号后面的参数
    • @RequestBody,得到请求的json里面的参数,json直接变成java对象
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/{id}") // 对应请求 /user/1
    public User getUser(@PathVariable Integer id) { ... }

    @PostMapping("/add") // 对应提交一大段用户信息的 JSON
    public String addUser(@RequestBody User user) { ... }
}

Service常用的注解

  • @Service,标明这是一个Service,需要实例化。
  • @Autowired,依赖注入,向Map请求一个实例化的对象。
  • @Resource,同上
  • @RequiredArgsConstructor,用来代替Autowired。
  • @Transactional,发生错误的话,数据会回滚。
@Service
public class UserService {

    @Autowired
    private UserMapper userMapper; // 大管家给我一个仓库管理员

    @Transactional // 保证这个方法中途报错的话,数据能撤销
    public void buySomething(Integer userId) {
        // 1. 扣钱
        // 2. 减库存
    }
}

Mapper常用的注解

  • @Mapper,Mybatis的注解,标明是用于数据库连接的对象。
  • @Select等sql语句,直接用注解的方法将sql写在方法上面,就不需要在xml文件里面写sql了。
  • @Param,给sql里面传参数。
@Mapper
public interface UserMapper {
    // 简单的直接写注解
    @Select("SELECT * FROM user WHERE age > #{age} AND gender = #{gender}")
    List<User> findUsers(@Param("age") Integer age, @Param("gender") String gender);

    // 复杂的通常不在注解里写,而是去 UserMapper.xml 里写
    void complexUpdate();
}

© 2026 My Blog

🌱 Powered by Hugo with theme Dream.