Spring & SpringBoot 注解分类整理

系统性地整理Spring和SpringBoot的核心注解,按照功能分类,并提供详细说明和示例代码。

一、核心注解分类

1. 配置相关注解

@Configuration
  • 作用:标识一个类为配置类,相当于XML配置文件
  • 示例
@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
@ComponentScan
  • 作用:自动扫描指定包及其子包下的组件
  • 属性:
    • basePackages:指定扫描的基础包
    • excludeFilters:排除特定组件
  • 示例
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {}
@Bean
  • 作用:声明一个方法的返回值为Bean
  • 属性:
    • name:指定Bean名称
    • initMethod/destroyMethod:生命周期方法
  • 示例
@Bean(name = "dataSource", initMethod = "init")
public DataSource dataSource() {
    return new HikariDataSource();
}
@Import
  • 作用:导入其他配置类
  • 示例
@Configuration
@Import({DatabaseConfig.class, SecurityConfig.class})
public class AppConfig {}
@PropertySource
  • 作用:加载properties/yml配置文件
  • 示例
@Configuration
@PropertySource("classpath:app.properties")
public class AppConfig {
    @Value("${app.name}")
    private String appName;
}

2. 依赖注入相关注解

@Autowired
  • 作用:自动装配依赖
  • 使用位置:字段、构造方法、setter方法
  • 示例
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
}
@Qualifier
  • 作用:当有多个同类型Bean时指定具体Bean
  • 示例
@Autowired
@Qualifier("masterDataSource")
private DataSource dataSource;
@Resource
  • 作用:JSR-250标准注解,按名称装配
  • 示例
@Resource(name = "slaveDataSource")
private DataSource dataSource;
@Value
  • 作用:注入属性值或表达式结果
  • 示例
@Value("${jdbc.url}")
private String jdbcUrl;

@Value("#{systemProperties['java.version']}")
private String javaVersion;

3. Spring MVC相关注解

@Controller
  • 作用:标识一个类为控制器
  • 示例
@Controller
@RequestMapping("/users")
public class UserController {
    @GetMapping("/{id}")
    public String getUser(@PathVariable Long id, Model model) {
        // ...
    }
}
@RestController
  • 作用:@Controller + @ResponseBody组合
  • 示例
@RestController
@RequestMapping("/api/users")
public class UserApiController {
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        // ...
    }
}
@RequestMapping
  • 作用:映射请求路径
  • 属性:
    • value/path:请求路径
    • method:请求方法
    • consumes/produces:请求/响应类型
  • 示例
@RequestMapping(value = "/users", method = RequestMethod.GET)
@GetMapping/@PostMapping等
  • 作用:特定HTTP方法的简写
  • 示例
@GetMapping("/users/{id}")
@PostMapping("/users")
@PutMapping("/users/{id}")
@DeleteMapping("/users/{id}")
@PathVariable
  • 作用:获取URL路径变量
  • 示例
@GetMapping("/users/{id}")
public User getUser(@PathVariable("id") Long userId) {
    // ...
}
@RequestParam
  • 作用:获取请求参数
  • 属性:
    • name/value:参数名
    • required:是否必须
    • defaultValue:默认值
  • 示例
@GetMapping("/users")
public List<User> listUsers(@RequestParam(defaultValue = "1") int page) {
    // ...
}
@RequestBody
  • 作用:获取请求体并反序列化
  • 示例
@PostMapping("/users")
public User createUser(@RequestBody User user) {
    // ...
}
@ResponseBody
  • 作用:将返回值序列化为响应体
  • 示例
@GetMapping("/users/{id}")
@ResponseBody
public User getUser(@PathVariable Long id) {
    // ...
}

4. AOP相关注解

@Aspect
  • 作用:声明一个切面类
  • 示例
@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        // ...
    }
}
@Pointcut
  • 作用:定义切点表达式
  • 示例
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceLayer() {}

@Before("serviceLayer()")
public void logBefore(JoinPoint joinPoint) {
    // ...
}
@Before/@After/@Around等
  • 作用:定义通知类型
  • 示例
@Before("execution(* com.example.service.*.*(..))")
public void beforeAdvice(JoinPoint joinPoint) {
    // ...
}

@Around("execution(* com.example.service.*.*(..))")
public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
    // ...
    return pjp.proceed();
}

5. 事务管理相关注解

@Transactional
  • 作用:声明事务
  • 属性:
    • propagation:传播行为
    • isolation:隔离级别
    • timeout:超时时间
    • rollbackFor:指定异常回滚
  • 示例
@Transactional(propagation = Propagation.REQUIRED, 
               isolation = Isolation.DEFAULT,
               timeout = 30,
               rollbackFor = Exception.class)
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
    // ...
}

6. Spring Boot特有注解

@SpringBootApplication
  • 作用:主配置类注解,包含:
    • @Configuration
    • @EnableAutoConfiguration
    • @ComponentScan
  • 示例
@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}
@EnableAutoConfiguration
  • 作用:启用自动配置
  • 示例
@Configuration
@EnableAutoConfiguration
public class MyConfig {}
@Conditional系列
  • 作用:条件化配置
  • 常见注解:
    • @ConditionalOnClass
    • @ConditionalOnMissingBean
    • @ConditionalOnProperty
  • 示例
@Bean
@ConditionalOnMissingBean
public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder().build();
}
@ConfigurationProperties
  • 作用:将配置文件属性绑定到Bean
  • 示例
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppProperties {
    private String name;
    private String version;
    // getters/setters
}

7. 测试相关注解

@SpringBootTest
  • 作用:Spring Boot集成测试
  • 示例
@SpringBootTest
class MyServiceTest {
    @Autowired
    private MyService myService;
    
    @Test
    void testService() {
        // ...
    }
}
@MockBean
  • 作用:模拟Bean并注入
  • 示例
@SpringBootTest
class UserServiceTest {
    @MockBean
    private UserRepository userRepository;
    
    @Autowired
    private UserService userService;
    
    @Test
    void testFindUser() {
        // ...
    }
}
@TestConfiguration
  • 作用:测试专用配置
  • 示例
@TestConfiguration
static class TestConfig {
    @Bean
    public MyService testService() {
        return new TestMyService();
    }
}

二、综合示例

1. RESTful API示例

@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping
    public ResponseEntity<List<User>> getAllUsers() {
        return ResponseEntity.ok(userService.findAll());
    }

    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        return userService.findById(id)
                .map(ResponseEntity::ok)
                .orElse(ResponseEntity.notFound().build());
    }

    @PostMapping
    @Transactional
    public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
        User savedUser = userService.save(user);
        return ResponseEntity.created(URI.create("/api/users/" + savedUser.getId()))
                .body(savedUser);
    }

    @PutMapping("/{id}")
    @Transactional
    public ResponseEntity<User> updateUser(@PathVariable Long id, 
                                         @Valid @RequestBody User user) {
        if (!userService.existsById(id)) {
            return ResponseEntity.notFound().build();
        }
        user.setId(id);
        return ResponseEntity.ok(userService.save(user));
    }

    @DeleteMapping("/{id}")
    @Transactional
    public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
        userService.deleteById(id);
        return ResponseEntity.noContent().build();
    }
}

2. 自定义注解示例

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuditLog {
    String action();
    String module();
}

@Aspect
@Component
public class AuditLogAspect {
    @Autowired
    private AuditLogService auditLogService;

    @AfterReturning("@annotation(auditLog)")
    public void afterReturning(JoinPoint joinPoint, AuditLog auditLog) {
        String action = auditLog.action();
        String module = auditLog.module();
        // 记录审计日志
        auditLogService.log(action, module);
    }
}

@Service
public class UserService {
    @AuditLog(action = "CREATE_USER", module = "USER_MANAGEMENT")
    public User createUser(User user) {
        // 创建用户逻辑
    }
}

三、最佳实践建议

  1. 分层使用注解
    • 控制器层:使用@RestController@RequestMapping
    • 服务层:使用@Service@Transactional
    • 数据访问层:使用@Repository@Entity
  2. 合理使用自动配置
    • 优先使用Spring Boot的自动配置
    • 需要定制时使用@ConfigurationProperties
  3. 事务管理
    • 在服务层方法上使用@Transactional
    • 明确指定传播行为和隔离级别
  4. AOP使用
    • 使用切面处理横切关注点(日志、审计、权限等)
    • 避免过度使用,保持代码可读性
  5. 测试
    • 单元测试使用Mockito
    • 集成测试使用@SpringBootTest

希望这份整理对您作为的工作有所帮助!如需更深入的某个部分,可以进一步探讨。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐