1. Spring Boot核心组件
Spring Boot是一个用于构建Spring应用程序的快速开始工具,它的目标是减少开发人员的工作量,使他们能够更快地构建可扩展的Spring应用程序。Spring Boot提供了许多功能,例如自动配置、嵌入式服务器、数据访问、Web等,使得开发人员可以更快地开始编写业务代码。
自动配置
Spring Boot的自动配置是其核心特性之一,它旨在尽可能自动配置Spring应用程序。自动配置尝试根据类路径上的jar依赖、定义的bean以及各种属性设置猜测并配置你可能需要的组件。
@SpringBootApplication注解
@SpringBootApplication是一个组合注解,它聚集了以下三个重要注解:
- @SpringBootConfiguration:标记为配置类,等同于@Configuration。
- @EnableAutoConfiguration:启用Spring Boot的自动配置机制。
- @ComponentScan:启用组件扫描。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
在上面的示例中,我们使用@SpringBootApplication注解主类,并通过SpringApplication.run()方法启动应用。这将开启自动配置和组件扫描。
自定义自动配置
Spring Boot允许你创建自定义自动配置,这意味着你可以根据条件自动配置自己的bean。自定义自动配置通常通过@Conditional注解实现。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@Configuration
public class CustomAutoConfiguration {
@Bean
@ConditionalOnClass(MyService.class)
@ConditionalOnProperty(name = "my.service.enabled", havingValue = "true", matchIfMissing = true)
public MyService myService() {
return new MyService();
}
}
public class MyService {
// 服务逻辑...
}
在这个例子中,MyService bean仅在MyService类在类路径上,且my.service.enabled属性值为true或缺失时才会创建。
依赖注入
依赖注入(Dependency Injection,DI)是Spring框架的核心功能之一,它实现了控制反转(IoC,Inversion of Control)模式。依赖注入允许你创建对象并将它们连接在一起,而不需要在代码内部直接实例化对象。
Spring通过IoC容器来管理对象的生命周期和依赖关系。IoC容器负责在对象生成或初始化时直接将数据注入到对象中,或者通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖。
import org.springframework.context.annotation.Component;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Autowired;
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
@Bean
public MyController myController(MyService myService) {
return new MyController(myService);
}
}
@Component
public class MyService {
public void doSomething() {
System.out.println("Service is doing something!");
}
}
public class MyController {
private final MyService myService;
@Autowired
public MyController(MyService myService) {
this.myService = myService;
}
public void execute() {
myService.doSomething();
}
}
在上面的例子中,MyController依赖于MyService。通过使用@Autowired注解,Spring IoC容器会自动将MyService的实例注入到MyController的构造函数中。
2. Spring MVC基础
Spring MVC是Spring框架的一个核心组件,它提供了一个用于处理HTTP请求和响应的框架。Spring MVC使得开发人员可以更轻松地构建Web应用程序,因为它提供了许多功能,例如数据绑定、模型解析、视图解析等。
控制器
控制器(Controller)是Spring MVC的核心组件之一,它负责处理HTTP请求并生成HTTP响应。在Spring MVC中,控制器通常是一个实现了Controller接口的类,或者是一个带有@Controller注解的类。
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "hello";
}
}
在上面的例子中,HelloController是一个控制器,它有一个处理/hello请求的hello方法。该方法将一个消息添加到模型中,并返回一个视图名称("hello")。
视图解析器
视图解析器(View Resolver)是Spring MVC的另一个核心组件,它负责将视图名称解析为视图对象。视图对象负责将模型数据转换为HTML代码并显示在浏览器中。
Spring MVC提供了多种视图解析器,例如InternalResourceViewResolver(用于解析JSP视图)、FreemarkerViewResolver(用于解析Freemarker视图)等。
例子:
在Spring Boot应用程序中,你可以通过application.properties文件配置InternalResourceViewResolver:
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
上面的配置指定了JSP视图的前缀和后缀,因此当控制器返回一个视图名称时,Spring MVC会使用这些前缀和后缀来找到相应的JSP文件。
请求映射
请求映射(Request Mapping)是Spring MVC的一个重要特性,它允许你将HTTP请求映射到特定的控制器方法上。你可以使用@RequestMapping注解来标记控制器方法,并指定它们处理的请求路径、请求方法、请求参数等。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class GreetingController {
@GetMapping("/greeting")
public String greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) {
model.addAttribute("name", name);
return "greeting";
}
}
在上面的例子中,GreetingController有一个处理/greeting请求的greeting方法。该方法使用@GetMapping注解来指定它处理的请求路径和请求方法(GET)。它还使用@RequestParam注解来从请求中获取名为"name"的参数,并为其提供一个默认值"World"。
3. 例子代码
下面是一个完整的Spring Boot和Spring MVC应用程序的示例代码。该应用程序包含一个控制器,它处理/hello请求并返回一个包含消息的视图。
项目结构:
src/
└── main/
├── java/
│ └── com/
│ └── example/
│ ├── DemoApplication.java
│ └── controller/
│ └── HelloController.java
└── resources/
├── static/
├── templates/
│ └── hello.html
└── application.properties
DemoApplication.java:
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
HelloController.java:
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "hello";
}
}
hello.html(位于src/main/resources/templates目录下):
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello, Spring MVC!</title>
</head>
<body>
<h1 th:text="${message}"></h1>
</body>
</html>