Bootstrap

spring注解详细说明

一、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、处理请求、实现缓存和事务等。这些注解不仅提高了代码的可读性,还增强了开发效率。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。