前言
在没有注解之前,程序员不仅要写视图和控制器还要花费大量的精力去写Spring MVC的XML配置文件(为了让视图和控制器产生关联关系),此外还要重要的一点,控制器当中是不能有业务逻辑的,开发者需要把业务逻辑抽离出来形成service服务和component组件,当控制器想要调用服务时,需借助IoC容器来实现,所以程序员还需要注册Bean将服务配置到IOC容器当中。故程序员在开发时除了要写必要的视图、控制层、service层等还需要做大量的配置工作,当项目越大时配置就越发复杂。
所以注解的核心目标是通过注解来替代XML配置,实现“约定大于配置”的软件设计理念,简化开发流程。
下面介绍一下spring框架中的一些常用注解:
1)下面的1~12是在controller层中使用的,用于处理 HTTP 请求和响应
1.@Controller
该注解的作用是标记一个类作为Spring MVC的控制器,处理HTTP请求。
@Controller
public class UserController {
// 方法需配合@ResponseBody返回JSON
}
2.@RestController
该注解的作用是通过@Controller + @ResponseBody的组合注解,直接返回JSON/XML等数据。
@RestController
public class UserController {
// 方法直接返回数据,无需@ResponseBody
}
3.@RequestMapping
该注解的作用是映射HTTP请求路径和方法(GET/POST 等)。
@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<User> getUsers() { ... }
4.@RequestParam
该注解的作用是获取 URL 中的查询参数(如?name=John)。
@GetMapping("/users")
public List<User> getUsers(@RequestParam String name) { ... }
5.@PathVariable
该注解的作用是获取URL中的路径变量(如/users/{id})。
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) { ... }
6.@GetMapping
该注解是@RequestMapping(method = RequestMethod.GET)的简写。
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) { ... }
7.@PostMapping
该注解是@RequestMapping(method = RequestMethod.POST)的简写。
@PostMapping("/users")
public User createUser(@RequestBody User user) { ... }
8.@PutMapping
该注解是@RequestMapping(method = RequestMethod.PUT)的简写,用于更新资源。
@PutMapping("/users/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) { ... }
9.@DeleteMapping
该注解是@RequestMapping(method = RequestMethod.DELETE)的简写。
@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable Long id) { ... }
10.@ResponseBody
该注解的作用是将方法返回值序列化为JSON/XML等格式。
@Controller
@ResponseBody // 或直接用@RestController
public class UserController { ... }
11. @RequestBody
该注解的作用是将HTTP请求体(如JSON)反序列化为Java对象。
@PostMapping("/users")
public User createUser(@RequestBody User user) { ... }
12. @CrossOrigin
该注解的主要作用是解决跨域请求问题(允许前端跨域访问 API)。
@CrossOrigin(origins = "http://localhost:3000")
@GetMapping("/users")
public List<User> getUsers() { ... }
2)下面的1~4是Spring IoC容器的核心组成部分,主要目的是简化Bean的定义和管理
1.@Configuration
这个注解用在类上,表明该类是Spring的Java配置类。在配置类里,能够定义Bean以及Bean之间的依赖关系,其作用和传统的XML配置文件是一样的。
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
return new DriverManagerDataSource("jdbc:mysql://localhost:3306/mydb");
}
}
2.@Bean
此注解用在方法上,用于声明一个由Spring容器管理的Bean。它一般会搭配@Configuration一起使用,方法的返回值会被注册到容器中。
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserServiceImpl();
}
}
3.@Service
该注解用在类上,是一个专门的构造型注解。它的作用是标记服务层组件,让 Spring 能够自动扫描并注册这些组件。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
// 实现方法
}
4. @Component
这个注解是一个通用注解,用于标记任意一个 Spring 组件。其他的构造型注解,像@Service、@Repository、@Controller,其实都是基于@Component扩展而来的。
@Component
public class MyComponent {
// 组件实现
}
3)下面的1~4注解和Spring IoC容器获取依赖或者配置值相关
1.@Autowired
这是Spring提供的注解,主要用于自动装配Bean。它默认按照类型(byType)进行装配,会在容器中查找与依赖类型匹配的Bean。
@Service
public class UserService {
@Autowired
private UserRepository userRepository; // 按类型注入
}
2.@Resource
此注解来自JSR-250规范,默认按照名称(byName)进行装配。如果没有指定name属性,就会根据字段名或者方法名来查找匹配的Bean。
@Service
public class UserService {
@Resource(name = "userRepositoryImpl") // 按名称注入
private UserRepository userRepository;
}
3.@Autowired+@Qualifier
当容器中存在多个相同类型的Bean 时,可以使用@Qualifier来指定具体要注入的Bean 名称,以此解决歧义问题。
@Service
public class UserService {
@Autowired
@Qualifier("primaryUserRepository") // 指定Bean名称
private UserRepository userRepository;
}
4.@Value
该注解用于注入外部配置的值,比如.properties 文件或者.yml 文件中的属性值。
@Service
public class AppService {
@Value("${app.name}") // 注入配置属性
private String appName;
}
其他补充知识点
什么是Bean?
Bean是Spring框架中的核心概念之一,它是由Spring IoC(控制反转)容器管理的对象。这些对象会在应用启动时由容器创建,并按照配置(如注解、XML)来建立相应的依赖关系。
Spring通过 IoC容器负责Bean的创建、初始化、销毁,开发者无需手动调用new关键字从而便于测试和维护。
Spring管理Bean的完整生命周期如下:
实例化 → 属性注入 → 初始化方法调用 → 使用 → 销毁方法调用。
每天进步一点点,加油!