赤峰市网站建设_网站建设公司_服务器维护_seo优化
2026/1/14 2:44:50 网站建设 项目流程

Spring Boot 常用注解详解

一、核心注解分类

1.配置类注解

@Configuration
  • 用途:声明一个类为配置类,相当于XML配置文件

  • 特点:会被CGLIB代理,确保@Bean方法返回单例

@Configuration public class AppConfig { // 内部可以定义@Bean方法 }
@Bean
  • 用途:在配置类中声明Bean,将方法返回值加入Spring容器

  • 属性

    • name/value:Bean名称(默认方法名)

    • initMethod/destroyMethod:初始化和销毁方法

@Configuration public class AppConfig { @Bean(name = "dataSource") public DataSource dataSource() { return new HikariDataSource(); } @Bean(initMethod = "init", destroyMethod = "cleanup") public MyService myService() { return new MyService(); } }

2.依赖注入注解

@Autowired
  • 用途:自动注入依赖,可省略setter方法

  • 注入方式

// 1. 字段注入(最常用) @Service public class UserService { @Autowired private UserRepository userRepository; } // 2. 构造器注入(Spring 4.3+可省略@Autowired) @Service public class UserService { private final UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } } // 3. Setter方法注入 @Service public class UserService { private UserRepository userRepository; @Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; } }
@Qualifier
  • 用途:配合@Autowired,指定注入的Bean名称

@Component @Qualifier("mysqlDataSource") public class MysqlDataSource implements DataSource { } @Component @Qualifier("oracleDataSource") public class OracleDataSource implements DataSource { } @Service public class ReportService { @Autowired @Qualifier("mysqlDataSource") private DataSource dataSource; }
@Resource
  • JSR-250标准:功能类似@Autowired,但默认按名称注入

@Component public class OrderService { @Resource(name = "userService") // 按名称注入 private UserService userService; }
@Inject
  • JSR-330标准:功能同@Autowired,需额外依赖

<dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency>

3.属性配置注解

@Value
  • 用途:注入配置文件值、SpEL表达式

  • 使用方式

@Component public class AppConfig { // 1. 注入简单值 @Value("${app.name}") private String appName; // 2. 默认值 @Value("${app.version:1.0.0}") private String version; // 3. 数组/列表 @Value("${app.servers:localhost}") private String[] servers; // 4. SpEL表达式 @Value("#{systemProperties['java.home']}") private String javaHome; // 5. 系统环境变量 @Value("#{environment['JAVA_HOME']}") private String javaEnv; }
@ConfigurationProperties
  • 用途:批量绑定配置属性到对象

@Component @ConfigurationProperties(prefix = "app.datasource") public class DataSourceProperties { private String url; private String username; private String password; private int maxPoolSize = 10; // getters/setters } // application.yml app: datasource: url: jdbc:mysql://localhost:3306/test username: root password: 123456 max-pool-size: 20

4.组件扫描注解

@ComponentScan
  • 用途:定义扫描的包路径

@SpringBootApplication @ComponentScan(basePackages = {"com.example.service", "com.example.dao"}) public class Application { }
组件类型注解

注解

层级

用途

@Component

通用

通用组件

@Service

服务层

业务逻辑组件

@Repository

持久层

数据访问组件

@Controller

控制层

MVC控制器

@RestController

控制层

REST API控制器

使用示例

@Repository public class UserRepository { } @Service public class UserService { @Autowired private UserRepository userRepository; } @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping public List<User> getUsers() { return userService.findAll(); } }

5.条件注解

注解

条件

@ConditionalOnBean

存在指定Bean时生效

@ConditionalOnMissingBean

不存在指定Bean时生效

@ConditionalOnClass

类路径存在指定类时生效

@ConditionalOnMissingClass

类路径不存在指定类时生效

@ConditionalOnProperty

配置属性匹配时生效

@ConditionalOnExpression

SpEL表达式为true时生效

@ConditionalOnJava

指定Java版本时生效

@ConditionalOnWebApplication

Web应用时生效

@ConditionalOnNotWebApplication

非Web应用时生效

@Configuration @ConditionalOnClass(DataSource.class) @ConditionalOnProperty(name = "spring.datasource.enable", havingValue = "true") public class DataSourceConfig { @Bean @ConditionalOnMissingBean public DataSource dataSource() { // 创建数据源 } }

6.事务注解

@Transactional
  • 用途:声明式事务管理

@Service public class OrderService { @Transactional( propagation = Propagation.REQUIRED, // 传播行为 isolation = Isolation.DEFAULT, // 隔离级别 timeout = 30, // 超时时间(秒) rollbackFor = Exception.class, // 回滚异常 noRollbackFor = RuntimeException.class // 不回滚异常 ) public void createOrder(Order order) { // 业务逻辑 } }

传播行为类型

public enum Propagation { REQUIRED, // 支持当前事务,不存在则新建 SUPPORTS, // 支持当前事务,不存在则以非事务执行 MANDATORY, // 必须存在事务 REQUIRES_NEW, // 新建事务,挂起当前事务 NOT_SUPPORTED, // 非事务执行,挂起当前事务 NEVER, // 必须非事务执行 NESTED // 嵌套事务 }

7.AOP相关注解

@Aspect
@Aspect @Component public class LogAspect { // 1. 前置通知 @Before("execution(* com.example.service.*.*(..))") public void beforeAdvice(JoinPoint joinPoint) { System.out.println("方法执行前: " + joinPoint.getSignature().getName()); } // 2. 后置通知 @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result") public void afterReturningAdvice(JoinPoint joinPoint, Object result) { System.out.println("方法返回: " + result); } // 3. 环绕通知 @Around("execution(* com.example.service.*.*(..))") public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable { // 前置逻辑 Object result = joinPoint.proceed(); // 后置逻辑 return result; } }

8.测试相关注解

@SpringBootTest @AutoConfigureMockMvc @ActiveProfiles("test") // 使用test配置文件 class UserControllerTest { @Autowired private MockMvc mockMvc; @MockBean private UserService userService; // 模拟Bean @Test @DisplayName("测试用户查询") void testGetUser() throws Exception { Mockito.when(userService.findById(1L)) .thenReturn(new User(1L, "张三")); mockMvc.perform(get("/users/1")) .andExpect(status().isOk()) .andExpect(jsonPath("$.name").value("张三")); } }

9.Profile注解

@Profile
  • 用途:根据环境激活不同的配置

@Configuration public class DataSourceConfig { @Bean @Profile("dev") // 开发环境 public DataSource devDataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .build(); } @Bean @Profile("prod") // 生产环境 public DataSource prodDataSource() { HikariDataSource ds = new HikariDataSource(); ds.setJdbcUrl("jdbc:mysql://prod-server:3306/db"); return ds; } }

10.定时任务注解

@Configuration @EnableScheduling public class ScheduleConfig { @Scheduled(fixedRate = 5000) // 每5秒执行 public void task1() { // 定时任务1 } @Scheduled(cron = "0 0 2 * * ?") // 每天凌晨2点执行 public void task2() { // 定时任务2 } }

11.异步处理注解

@Configuration @EnableAsync public class AsyncConfig { @Bean public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(10); executor.setQueueCapacity(100); return executor; } } @Service public class AsyncService { @Async public CompletableFuture<String> asyncMethod() { // 异步执行 return CompletableFuture.completedFuture("结果"); } }

二、注解对比表格

注解类型

主要注解

作用域

常用属性

配置

@Configuration

-

@Bean

方法

name, initMethod, destroyMethod

注入

@Autowired

字段/方法/构造器

required

@Qualifier

字段/参数

value

@Resource

字段/方法

name, type

@Value

字段/参数

value

组件

@Component

value

@Service

value

@Repository

value

@Controller

value

@RestController

-

条件

@ConditionalOnXxx

类/方法

各种条件

事务

@Transactional

类/方法

propagation, isolation, rollbackFor

AOP

@Aspect

value

@Before/@After

方法

value

@Around

方法

value

Profile

@Profile

类/方法

value

定时

@EnableScheduling

-

@Scheduled

方法

cron, fixedRate, fixedDelay

异步

@EnableAsync

-

@Async

方法

value

三、最佳实践

1.依赖注入选择

// 推荐:构造器注入(不可变依赖) @Service public class UserService { private final UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } } // 可选:@Autowired字段注入(简洁) @Service public class UserService { @Autowired private UserRepository userRepository; }

2.配置属性管理

// 推荐:使用@ConfigurationProperties替代多个@Value @ConfigurationProperties(prefix = "app") @Data // Lombok注解 public class AppProperties { private String name; private String version; private List<String> servers = new ArrayList<>(); } // 简单配置使用@Value @Component public class SimpleConfig { @Value("${app.name}") private String appName; }

3.条件化配置

@Configuration @ConditionalOnClass({DataSource.class, JdbcTemplate.class}) @ConditionalOnProperty(name = "spring.datasource.enable", havingValue = "true") @AutoConfigureAfter(DataSourceAutoConfiguration.class) public class JdbcConfig { // JDBC相关配置 }

四、常见问题

1.@Autowired与@Resource区别

特性

@Autowired

@Resource

来源

Spring框架

JSR-250标准

注入方式

默认按类型

默认按名称

必需性

required=true

必需

适用性

Spring项目

JavaEE/Spring项目

2.@Component vs @Bean

  • @Component:类级别注解,自动扫描注册

  • @Bean:方法级别注解,在配置类中显式声明

3.@Value注入失败处理

// 设置默认值 @Value("${app.port:8080}") private int port; // 使用Optional @Value("${app.port:#{null}}") private Optional<Integer> port;

总结

Spring Boot注解大大简化了配置工作,但需注意:

  1. 合理选择注入方式,优先使用构造器注入

  2. 理解注解的生命周期和作用范围

  3. 善用条件注解实现环境适配

  4. 遵循注解的默认约定,减少显式配置

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询