Spring & SpringBoot 注解分类整理
·
文章目录
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) {
// 创建用户逻辑
}
}
三、最佳实践建议
- 分层使用注解:
- 控制器层:使用
@RestController、@RequestMapping等 - 服务层:使用
@Service、@Transactional等 - 数据访问层:使用
@Repository、@Entity等
- 控制器层:使用
- 合理使用自动配置:
- 优先使用Spring Boot的自动配置
- 需要定制时使用
@ConfigurationProperties
- 事务管理:
- 在服务层方法上使用
@Transactional - 明确指定传播行为和隔离级别
- 在服务层方法上使用
- AOP使用:
- 使用切面处理横切关注点(日志、审计、权限等)
- 避免过度使用,保持代码可读性
- 测试:
- 单元测试使用Mockito
- 集成测试使用
@SpringBootTest
希望这份整理对您作为的工作有所帮助!如需更深入的某个部分,可以进一步探讨。
更多推荐
所有评论(0)