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();
}