Spring Boot 作为一种简化 Spring 应用开发的框架,使用了许多注解来减少常规配置的需要。下面是一些在 Spring Boot 中常用的注解,按功能分类并附上简要的说明:
核心注解
@SpringBootApplication
- 场景:用于主类,标记应用的启动点。
- 用法:自动包含了
@Configuration
、@EnableAutoConfiguration
和@ComponentScan
。 - 含义:表示这是一个 Spring Boot 应用的入口,并启用自动配置和组件扫描。
@EnableAutoConfiguration
- 场景:让 Spring Boot 根据类路径下的 jar 包依赖为当前项目进行自动配置。
- 用法:通常不单独使用,被包含在
@SpringBootApplication
中。 - 含义:自动配置 Spring 应用上下文。
@ComponentScan
- 场景:自动扫描并加载符合条件的组件或bean定义,一般用于指定扫描的路径。
- 用法:可以指定
basePackages
来定义扫描的包。 - 含义:让 Spring 寻找其他组件、配置和服务。
配置类相关注解
@Configuration
- 场景:定义配置类,可替代 XML 配置文件。
- 用法:在类上使用,类中的方法可用
@Bean
生成 bean。 - 含义:表明该类是用于 Spring 应用的配置。
@Bean
- 场景:在配置类中,用于定义一个 Spring 管理的 bean。
- 用法:在方法上使用,返回值是一个对象,该对象被注册为一个 bean。
- 含义:方法级别的注解,用于将方法返回的实例注册为 Spring 应用上下文中的 bean。
组件扫描注解
@Component
- 场景:定义一个组件,Spring 应该管理其生命周期。
- 用法:可用于类级别,作为一个泛指的组件标记。
- 含义:标记类为 Spring 管理的组件。
@Service
- 场景:特指服务层组件。
- 用法:用于业务逻辑服务层的类。
- 含义:标记服务层业务组件,Spring 管理其生命周期。
@Repository
- 场景:特指数据访问组件。
- 用法:用于数据访问层的类,如 DAO 类。
- 含义:标记数据访问组件,提供 CRUD 功能。
@Controller
- 场景:特指控制层组件。
- 用法:用于 MVC 模式中的控制层类。
- 含义:标记控制层组件,处理请求并返回响应。
@RestController
- 场景:控制器组件,专用于 RESTful Web 服务。
- 用法:相当于
@Controller
+@ResponseBody
。 - 含义:处理 HTTP 请求,并自动将返回的对象序列化为 JSON 或 XML 响应。
Web 映射注解
@RequestMapping
- 场景:定义请求的 URL 模式与处理方法的映射关系。
- 用法:可用于类或方法上,指定 URL、请求方法等。
- 含义:通用的请求映射注解。
@GetMapping
,@PostMapping
,@PutMapping
,@DeleteMapping
- 场景:分别用于处理 HTTP GET, POST, PUT, DELETE 请求。
- 用法:方法级
别的映射,简化了 @RequestMapping
方法。
- 含义:简化的请求映射注解,针对具体的 HTTP 方法。
数据和依赖注入相关注解
@Autowired
- 场景:自动注入 Spring 容器管理的 bean。
- 用法:可用于构造器、字段、设置方法上。
- 含义:依赖注入,减少手动编码。
@Value
- 场景:注入属性文件中的值。
- 用法:在字段上使用,与
@PropertySource
配合加载属性。 - 含义:注入配置文件或环境变量中的值。
@Transactional
- 场景:声明事务管理。
- 用法:可用于类或方法上,标记事务的边界。
- 含义:管理事务,确保数据的一致性和完整性。
下面我将为上述每个Spring Boot常用注解提供具体的示例用法:
核心注解
@SpringBootApplication
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
@EnableAutoConfiguration
(通常包含在 @SpringBootApplication
中,以下为单独使用示例)
@Configuration
@EnableAutoConfiguration
public class MyConfiguration {
}
@ComponentScan
@Configuration
@ComponentScan(basePackages = "com.example.myapp")
public class AppConfig {
}
配置类相关注解
@Configuration
@Configuration
public class ServiceConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
@Bean
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
组件扫描注解
@Component
@Component
public class MyComponent {
// class body
}
@Service
@Service
public class BookService {
// service methods
}
@Repository
@Repository
public class BookRepository {
// repository methods
}
@Controller
@Controller
public class MyController {
@RequestMapping("/greeting")
public String greeting() {
return "Hello, World!";
}
}
@RestController
@RestController
@RequestMapping("/api")
public class MyRestController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, World!";
}
}
Web 映射注解
@RequestMapping
@Controller
public class MyController {
@RequestMapping(value = "/home", method = RequestMethod.GET)
public String home() {
return "home";
}
}
@GetMapping
, @PostMapping
, @PutMapping
, @DeleteMapping
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
@PostMapping
public User addUser(@RequestBody User user) {
return userService.saveUser(user);
}
@PutMapping("/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) {
return userService.updateUser(id, user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
}
}
数据和依赖注入相关注解
@Autowired
@Service
public class UserService {
private UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
@Value
@Component
public class MyComponent {
@Value("${my.value}")
private String myValue;
}
@Transactional
@Service
public class TransactionalService {
@Transactional
public void performTransactionalOperation() {
// operation logic
}
}
每个注解都设计有特定的使用场景和目的,通过这些示例,可以清晰看到每个注解如何在实际的Spring Boot应用中使用。这有助于构建结构良好且易于管理的Spring Boot应用。