@Transactional
)与编程式事务@RequestMapping
注解路由@Valid
)spring-boot-autoconfigure
按需加载配置spring-boot-starter-web
)java -jar
)Spring Framework → Spring MVC(Web层实现)
Spring Framework → Spring Boot(配置抽象层)
Spring Boot ⊃ Spring MVC(通过spring-boot-starter-web)
Spring就像个拿着扳手的强迫症工程师 ,整天念叨:
“你的Bean呢?生命周期回调呢?AOP代理怎么没配置?”
经典死亡场景:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService service = (UserService) context.getBean("userService"); // 此时发现beans.xml少了个逗号
冷知识:Spring的XML配置复杂度与程序员发量成反比,直到注解拯救了世界:
@Repository
public class UserDaoImpl implements UserDao {
@Autowired // 自动注入?真香!
private DataSource dataSource;
}
Spring MVC就像个操心的餐厅领班 ️:
血泪教训:当你在Controller写下:
@GetMapping("/api/users")
public void getUserList() { /* 忘记加@ResponseBody */ }
Spring MVC会亲切地帮你寻找不存在的getUserList.jsp
,并附赠404大礼包
Spring Boot的魔法咒语是:
“你只管写业务代码,其他我搞定!” ♂️
对比实验:
传统Spring项目 | Spring Boot项目 |
---|---|
配置数据源:30行XML | 配置数据源:3行application.yml |
启动耗时:8秒 | 启动耗时:1.8秒 |
依赖冲突:日均1次 | 依赖冲突:本月0次 |
头发存量:持续下降 | 头发存量:稳定值 |
代码の极简主义:
@SpringBootApplication
public class MagicApp {
public static void main(String[] args) {
SpringApplication.run(MagicApp.class, args); // 点击即送内嵌Tomcat
}
}
@RestController
public class JokeController {
@GetMapping("/dad-joke")
public String dadJoke() {
return "为什么Java程序员戴眼镜?因为他们不会C#!"; // 自动转JSON
}
}
初级程序员:
@Conditional
的玄学问题Servlet
原理,面试被挂概不负责