搭建方式 idea脚手架
然后勾选Spring Web
官网搭建 访问start.spring.io
生成SpringBoot
项目 下载项目,解压并导入idea
手动搭建 添加依赖 创建一个maven
项目,在pom.xml
文件中添加SpringBoot
的起步依赖
SpringBoot
项目必须继承spring-boot-starter-parent
,spring-boot-starter-parent
中定义了常用配置、插件等信息
1 2 3 4 5 6 7 <parent > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-parent</artifactId > <version > 3.4.4</version > <relativePath /> </parent >
起步依赖中包含了其他依赖,如spring-boot-starter
、spring-boot-starter-tomcat
、spring-web
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <dependencies > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-web</artifactId > <version > 3.4.4</version > </dependency > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-test</artifactId > <version > 3.4.4</version > <scope > test</scope > </dependency > </dependencies >
插件的作用是将SpringBoot
项目打包成可执行的jar
包
1 2 3 4 5 6 7 8 9 <build > <plugins > <plugin > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-maven-plugin</artifactId > </plugin > </plugins > </build >
编写启动类 @SpringBootApplication
是一个组合注解,包含了@Configuration
、@EnableAutoConfiguration
和@ComponentScan
三个注解,用于标识一个类是一个SpringBoot
应用程序的启动类
@Configuration
:标识该类是一个配置类,用于定义Bean
的配置信息@EnableAutoConfiguration
:启用自动配置机制,自动配置Spring
所需的依赖项和配置@ComponentScan
:扫描当前包及其子包中@Component
、@Service
、@Repository
和@Controller
注解的类,为它们注册Bean
1 2 3 4 5 6 @SpringBootApplication public class SpringBootApp { public static void main (String[] args) { SpringApplication.run(SpringBootApp.class, args); } }
编写配置文件 在src/main/resources
目录下创建application.properties
文件,用于配置SpringBoot
应用程序的各种属性,如数据库连接、端口号、日志级别等
1 2 3 spring.application.name =test server.port =8080
编写控制类 @Controller
:用于定义控制器类,负责处理HTTP
请求@RequestMapping
:用于定义请求映射,将HTTP
请求映射到指定的方法上,该注解也可以用在类上。@GetMapping
、@PostMapping
、@PutMapping
、@DeleteMapping
等注解是@RequestMapping
的简化版,分别用于处理GET
、POST
、PUT
、DELETE
请求@ResponseBody
:将Controller
方法的返回值直接写入HTTP
响应体,如果是对象,则会自动转换为JSON
格式。SpringBoot
默认使用Jackson
库进行对象的序列化和反序列化1 2 3 4 5 6 7 8 9 @Controller public class TestController { @RequestMapping("/test") @ResponseBody public String test () { return "test" ; } }
@RestController
:是@Controller
和@ResponseBody
的组合注解1 2 3 4 5 6 7 8 @RestController public class TestController { @RequestMapping("/test") public String test () { return "test" ; } }
带参数的请求,如下代码发送请求时可以附带name
和age
参数,附带的参数必须与方法的参数名一致
1 2 3 4 @RequestMapping("/test") public String test (String name, int age) { return "{name: \"" + name + "\", age: " + age + "}" ; }
常用注解 @RequestParam 通过@RequestParam
注解,如下代码发送请求时可以附带name
和age
参数,附带的参数可以与方法的参数名不一致
1 2 3 4 @RequestMapping("/test") public String test (@RequestParam("name") String s1, @RequestParam("age") int i1) { return "{name: \"" + s1 + "\", age: " + i1 + "}" ; }
@PathVariable @PathVariable
用于获取路径参数,将路径中的参数绑定到方法的参数上
如下代码,在路径中附带的id
参数会绑定到方法的userId
参数上,发送请求时的路径为/user/123
,则userId
的值为123
1 2 3 4 @RequestMapping("user/{id}") public String user (@PathVariable("id") int userId) { return "User id is " + userId; }
如下代码,路径中的id
参数会绑定到方法的userId
参数上,附带的name
参数会绑定到方法的name
参数上,发送请求时的路径为/user/123?name=Tom
,则userId
的值为123
,name
的值为Tom
1 2 3 4 @RequestMapping("user/{id}") public String user (@PathVariable("id") int userId, @RequestParam("name") String name) { return "User id is " + userId + ", name is " + name; }
@RequestBody 当@RequestBody
注解方法的参数时,SpringBoot
会将请求体中的数据反序列化为注解的对象,假设发送Post
请求时的请求体为
1 2 3 4 { "name" : "Tom" , "id" : 10 }
UserBean
类
1 2 3 4 public class UserBean { private String name; private int id; }
如下方法,SpringBoot
会将请求体中的数据反序列化为UserBean
对象,然后绑定到方法的参数上
1 2 3 4 @PostMapping("/user") public String user (@RequestBody UserBean userBean) { return "User = " + userBean; }
IOC与DI IOC 控制反转:IOC(Inversion of Control)
。传统的面向对象编程中,对象的创建和管理通常由程序员来完成,这称为主动控制
。而在IOC
中,对象的创建和管理交给了外部容器来完成,称为控制反转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Component public class UserDaoImpl implements UserDao { @Override public List<String> getUserList () throws IOException { InputStream inputStream = getClass().getClassLoader().getResourceAsStream("./data/users.txt" ); BufferedReader reader = new BufferedReader (new InputStreamReader (inputStream)); List<String> userList = new ArrayList <>(); String line; while ((line = reader.readLine()) != null ) { userList.add(line); } return userList; } }
此外,为了更好的实现三层架构,SpringBoot
提供了@Repository
、@Service
和@Controller
,用于标识数据访问层、服务层和控制层的组件,@Repository
、@Service
和@Controller
底层都是对@Component
的封装,作用与@Component
相同
DI 依赖注入:DI(Dependency Injection)
。IOC
的一种实现方式,通过DI
,自动将依赖的对象注入到需要依赖的对象中
直接注入方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @Autowired private UserDao userDao;@Override public List<String> getUserList () throws IOException { List<String> userList = userDao.getUserList(); return userList.stream().map(new Function <String, String>() { @Override public String apply (String user) { String[] split = user.split("," ); return "{\"name\": \"" + split[0 ] + "\", \"age\": " + split[1 ] + "}" ; } }).collect(Collectors.toList()); }
构造器注入方式
1 2 3 4 5 private UserDao userDao;@Autowired public UserServiceImpl (UserDao userDao) { this .userDao = userDao; }
Set
注入方式
1 2 3 4 5 private UserDao userDao;@Autowired public void setUserDao (UserDao userDao) { this .userDao = userDao; }