一、Spring核心注解
1. 组件注解
这些注解用于将类标记为Spring管理的组件(Bean),并放入Spring容器中。
- @Component
作用:泛指组件,没有明确的角色。
用途:当不确定一个类属于哪个层次时,可以使用此注解。
示例:@Component
标记的类会被Spring自动扫描并管理。 - @Controller
作用:用于标记类为Spring MVC控制器。
用途:处理Web请求,通常与@RequestMapping
等注解结合使用。
示例:@Controller public class MyController { @RequestMapping("/home") public String home() { return "home"; } }
- @Service
作用:用于标记类为业务逻辑组件。
用途:与@Component
类似,但语义上表示该类是服务层逻辑。
示例:@Service public class UserService { public void saveUser() { // 业务逻辑 } }
- @Repository
作用:用于标记类为数据访问组件。
用途:通常用于持久化操作,Spring会将其捕获的异常转换为Spring数据访问异常。
示例:@Repository public class UserRepository { public User findUserById(Long id) { // 数据库查询逻辑 return new User(id, "John Doe"); } }
2. 依赖注入注解
这些注解用于自动装配依赖。
- @Autowired
作用:按类型自动注入依赖。
用途:通常用于字段、构造函数或方法上。
示例:@Service public class UserService { @Autowired private UserRepository userRepository; }
- @Qualifier
作用:与@Autowired
结合使用,按名称注入依赖。
用途:当存在多个相同类型的Bean时,用于指定具体注入哪一个。
示例:@Service public class MessageSender { @Autowired @Qualifier("emailService") private MessageService messageService; }
- @Value
作用:注入配置文件中的值。
用途:常用于注入配置属性。
示例:@Service public class AppConfig { @Value("${app.name}") private String appName; }
3. 配置类注解
这些注解用于定义配置类。
- @Configuration
作用:标记类为配置类。
用途:用于定义Bean及其依赖关系,替代XML配置文件。
示例:@Configuration public class AppConfig { @Bean public UserService userService() { return new UserService(); } }
- @ComponentScan
作用:指定Spring在初始化容器时扫描的包路径。
用途:默认扫描当前类所在包及其子包。
示例:@Configuration @ComponentScan("com.example") public class AppConfig { }
- @Bean
作用:在方法上标记,表示该方法返回的对象作为Bean注册到Spring容器中。
用途:常用于自定义Bean的创建逻辑。
示例:@Configuration public class AppConfig { @Bean public UserService userService() { return new UserService(); } }
4. AOP相关注解
这些注解用于实现面向切面编程。
- @Aspect
作用:标记类为切面类。
用途:用于定义切面逻辑。
示例:@Aspect public class LoggingAspect { @Before("execution(* com.example.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Method called: " + joinPoint.getSignature().getName()); } }
- @Before
作用:在目标方法执行前执行通知。
用途:用于前置通知。
示例:@Before("execution(* com.example.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Before method: " + joinPoint.getSignature().getName()); }
- @After
作用:在目标方法执行后执行通知。
用途:用于后置通知。
示例:@After("execution(* com.example.*.*(..))") public void logAfter(JoinPoint joinPoint) { System.out.println("After method: " + joinPoint.getSignature().getName()); }
- @Around
作用:在目标方法执行前后执行通知。
用途:用于环绕通知。
示例:@Around("execution(* com.example.*.*(..))") public Object logAround(ProceedingJoinPoint pjp) throws Throwable { System.out.println("Before method call"); Object result = pjp.proceed(); System.out.println("After method call"); return result; }
5. 缓存相关注解
这些注解用于简化缓存操作。
- @EnableCaching
作用:开启缓存功能。
用途:其他缓存注解需在此注解下生效。
示例:@Configuration @EnableCaching public class CacheConfig { }
- @Cacheable
作用:标记方法支持缓存。
用途:当方法被调用时,先从缓存中查找结果,若不存在则执行方法并将结果存入缓存。
示例:@Service public class UserService { @Cacheable("users") public User getUserById(Long id) { return userRepository.findById(id); } }
- @CachePut
作用:更新缓存。
用途:确保方法被执行,并将结果存入缓存。
示例:@Service public class UserService { @CachePut("users") public User updateUser(User user) { return userRepository.save(user); } }
- @CacheEvict
作用:清除缓存。
用途:在方法执行后清除指定缓存。
示例:@Service public class UserService { @CacheEvict("users") public void deleteUser(Long id) { userRepository.deleteById(id); } }
6. Spring MVC注解
这些注解用于构建Web应用。
- @RequestMapping
作用:映射请求路径。
用途:可以定义在类或方法上,用于映射URL。
示例:@Controller @RequestMapping("/user") public class UserController { @RequestMapping("/list") public String list() { return "userList"; } }
- @GetMapping
作用:快捷方式,等同于@RequestMapping(method = RequestMethod.GET)
。
用途:用于处理GET请求。
示例:@RestController @RequestMapping("/api") public class MyRestController { @GetMapping("/hello") public String sayHello() { return "Hello, World!"; } }
- @PostMapping
作用:快捷方式,等同于@RequestMapping(method = RequestMethod.POST)
。
用途:用于处理POST请求。
示例:@RestController @RequestMapping("/api") public class MyRestController { @PostMapping("/user") public String createUser(@RequestBody User user) { return "User created: " + user.getName(); } }
- @RequestParam
作用:绑定请求参数到方法参数。
用途:常用于获取URL中的查询参数。
示例:@GetMapping("/search") public String search(@RequestParam String name) { return "Searching for: " + name; }
- @PathVariable
作用:绑定路径变量到方法参数。
用途:常用于RESTful风格的URL。
示例:@GetMapping("/user/{id}") public String getUser(@PathVariable Long id) { return "User ID: " + id; }
- @RequestBody
作用:绑定请求体中的JSON数据到方法paramValue}
用途:常用于接收JSON数据。
示例:@RestController @RequestMapping("/api") public class UserController { @PostMapping("/user") @RequestBody public String createUser(@RequestBody User user) { return "User created: " + user.getName(); } }
- @ModelAttribute
作用:方法参数绑定表单数据。
用途:常用于处理表单提交的数据。
示例:@Controller public class MyController { @PostMapping("/user") public String createUser(@ModelAttribute User user) { return "User created: " + user.getName(); } }
- @SessionAttributes
作用:处理session中的属性。
用途:常用于在多个请求之间共享数据。
示例:@Controller @SessionAttributes("user") public class SessionController { // 控制器方法 }
7. 其他常用注解
- @Scope
作用:定义Bean的作用域。
用途:控制Bean的生命周期和实例化方式。
示例:@Service @Scope("prototype") public class UserService { }
- @Lazy
作用:延迟初始化Bean。
用途:优化启动时间,处理资源密集型Bean。
示例:@Service @Lazy public class ExpensiveBean { }
- @PostConstruct
作用:在依赖注入完成后执行的方法。
用途:常用于初始化资源。
示例:@Service public class MyService { @PostConstruct public void init() { // 初始化逻辑 } }
- @PreDestroy
作用:在Bean销毁前执行的方法。
用途:常用于清理资源。
示例:@Service public class MyService { @PreDestroy public void cleanup() { // 清理逻辑 } }
- @Conditional
作用:条件化配置。
用途:根据条件决定是否加载Bean。
示例:@Service @Conditional(MemoryCondition.class) public class MemoryIntensiveService { }
- @Import
作用:导入其他配置类。
用途:简化配置。
示例:@Configuration @Import(AnotherConfig.class) public class AppConfig { }
- @PropertySource
作用:加载属性文件。
用途:常用于读取配置文件。
示例:@Configuration @PropertySource("classpath:config.properties") public class AppConfig { }
- @Profile
作用:根据环境激活配置。
用途:用于多环境配置。
示例:@Service @Profile("dev") public class DevService { }
- @RestControllerAdvice
作用:全局异常处理。
用途:用于统一处理异常。
示例:@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public String handleException(Exception e) { return "Error: " + e.getMessage(); } }
- @SpringBootTest
作用:Spring Boot测试类。
用途:用于集成测试。
示例:@SpringBootTest public class MyTest { // 测试方法 }
总结
Spring和Spring Boot的注解大大简化了开发过程,通过组件注解、依赖注入注解、配置类注解、AOP注解、缓存注解以及Web层注解等,开发者可以更高效地管理Bean、处理请求、实现缓存和事务等。这些注解不仅提高了代码的可读性,还增强了开发效率。