侧边栏壁纸
博主头像
QM博主等级

行动起来,活在当下

  • 累计撰写 13 篇文章
  • 累计创建 11 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Spring Boot 注解

wangqm
2025-02-19 / 0 评论 / 0 点赞 / 5 阅读 / 16136 字

Spring Boot 注解

Spring Boot 通过一系列注解简化了 Spring 应用的开发过程,使得开发者能够更专注于业务逻辑的实现。本文将详细介绍 Spring Boot 中常用的注解,帮助开发者更好地理解和使用这些注解。

一、Spring Boot 简介

Spring Boot 是 Spring 家族中的一个框架,旨在简化 Spring 应用的开发。它通过自动配置、内嵌容器、独立运行等特点,让开发者能够快速构建和部署应用。

二、Spring Boot 注解详解

1. 核心注解

(1)@SpringBootApplication

@SpringBootApplication 是 Spring Boot 的核心注解,通常用于标记主程序类。它是一个复合注解,包含了 @Configuration@EnableAutoConfiguration@ComponentScan 注解。

java复制

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

(2)@EnableAutoConfiguration

@EnableAutoConfiguration 注解用于启用 Spring Boot 的自动配置机制。它会根据项目中的依赖和配置,自动配置 Spring 应用。

java复制

@EnableAutoConfiguration
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

(3)@Configuration

@Configuration 注解用于声明一个类为配置类,相当于一个 Spring XML 配置文件。配置类中可以包含一个或多个 @Bean 注解的方法,这些方法会返回要注册到 Spring 容器中的 Bean。

java复制

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

2. 自动配置条件注解

Spring Boot 提供了一系列条件注解,用于控制自动配置的条件。

(1)@ConditionalOnClass 和 @ConditionalOnMissingClass

@ConditionalOnClass 注解用于在指定类存在时才生效,而 @ConditionalOnMissingClass 注解用于在指定类不存在时才生效。

java复制

@Configuration
@ConditionalOnClass(DataSource.class)
public class MySQLAutoconfiguration {
    // ...
}

(2)@ConditionalOnBean 和 @ConditionalOnMissingBean

@ConditionalOnBean 注解用于在指定 Bean 存在时才生效,而 @ConditionalOnMissingBean 注解用于在指定 Bean 不存在时才生效。

java复制

@Bean
@ConditionalOnBean(name = "dataSource")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    // ...
}

(3)@ConditionalOnProperty

@ConditionalOnProperty 注解用于根据配置文件中的属性值来决定是否生效。

java复制

@Bean
@ConditionalOnProperty(name = "usemysql", havingValue = "local")
public DataSource dataSource() {
    // ...
}

(4)@ConditionalOnResource

@ConditionalOnResource 注解用于在指定资源存在时才生效。

java复制

@ConditionalOnResource(resources = "classpath:mysql.properties")
public Properties additionalProperties() {
    // ...
}

(5)@ConditionalOnWebApplication 和 @ConditionalOnNotWebApplication

@ConditionalOnWebApplication 注解用于在应用为 Web 应用时才生效,而 @ConditionalOnNotWebApplication 注解用于在应用不是 Web 应用时才生效。

java复制

@ConditionalOnWebApplication
public HealthCheckController healthCheckController() {
    // ...
}

(6)@ConditionalExpression

@ConditionalExpression 注解用于在 SpEL 表达式求值为 true 时才生效。

java复制

@Bean
@ConditionalExpression("${usemysql} && ${mysqlserver == 'local'}")
public DataSource dataSource() {
    // ...
}

(7)@Conditional

@Conditional 注解用于指定自定义条件类,以评估自定义条件。

java复制

@Conditional(HibernateCondition.class)
public Properties additionalProperties() {
    // ...
}

3. 组件相关注解

(1)@Controller

@Controller 注解用于标识一个类为控制器类,处理 Web 请求,返回视图或数据。

java复制

@Controller
@RequestMapping("/users")
public class UserController {
    @GetMapping
    public String getAllUsers(Model model) {
        List<User> users = userRepository.findAll();
        model.addAttribute("users", users);
        return "users/list";
    }
}

(2)@RestController

@RestController 注解是 @Controller@ResponseBody 的组合注解,用于创建 RESTful Web 服务,直接返回数据(如 JSON)。

java复制

@RestController
@RequestMapping("/api/users")
public class UserController {
    @GetMapping
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

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

(3)@Service

@Service 注解用于标识一个类为服务层组件,声明一个对象时,会实例化该类对象并将其注入到 Bean 容器中。

java复制

@Service
public class UserService {
    private final UserRepoistory userRepository;

    @Autowired
    public UserService(UserRepoistory userRepository) {
        this.userRepository = userRepository;
    }

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}

(4)@Repository

@Repository 注解用于标识一个类为数据访问对象(DAO)层组件,专注于系统数据的处理,例如数据库中的数据。

java复制

@Repository
public class UserRepository {
    // 数据访问方法
}

(5)@Component

@Component 注解用于标识一个通用组件,当组件难以分类时,可以使用此注解进行标记。

java复制

@Component
public class MyComponent {
    // 组件方法
}

4. 配置相关注解

(1)@Configuration

@Configuration 注解用于声明一个基于 Java 的配置类,相当于以前在 XML 中配置 Bean。

java复制

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
        dataSource.setUrl("jdbc:hsqldb:hsql://localhost/xdb");
        dataSource.setUsername("sa");
        dataSource.setPassword("");
        return dataSource;
    }
}

(2)@EnableAutoConfiguration

@EnableAutoConfiguration 注解用于启用 Spring Boot 的自动配置机制,根据项目中的依赖和配置,自动配置 Spring Bean。

java复制

@EnableAutoConfiguration
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

(3)@ComponentScan

@ComponentScan 注解用于指定哪些路径下的类需要被 Spring 扫描,用于自动发现和组装一些 Bean 对象。

java复制

@Configuration
@ComponentScan(basePackages = {"com.example.service", "com.example.repository"})
public class AppConfig {
}

(4)@EnableTransactionManagement

@EnableTransactionManagement 注解用于启用事务支持,相当于 XML 配置方式中的 tx:annotation-driven

java复制

@Configuration
@EnableTransactionManagement
public class AppConfig {
}

(5)@ConfigurationProperties

@ConfigurationProperties 注解用于批量注入外部配置,并以对象的形式导入具有指定前缀的配置。

java复制

@ConfigurationProperties(prefix = "app")
public class AppProperties {
    private String name;
    private int port;

    // getters and setters
}

(6)@Value

@Value 注解用于注入配置文件中的属性值或常量。

java复制

@Service
public class ConfigService {
    @Value("${app.name}")
    private String appName;

    @Value("10")
    private int someNumber;

    @Value("#{systemProperties['os.name']}")
    private String osName;
}

(7)@PropertySource

@PropertySource 注解用于读取自定义的配置文件。

java复制

@Configuration
@PropertySource("classpath:custom.properties")
public class CustomConfig {
}

5. 事务管理相关注解

(1)@Transactional

@Transactional 注解用于声明式事务管理,可以应用于类级别或方法级别。

java复制

@Service
public class MyService {
    @Transactional(readOnly = true)
    public void readData() {
        // 只读操作
    }

    @Transactional
    public void writeData() {
        // 写操作
    }
}

6. Web 开发相关注解

(1)@Controller

@Controller 注解用于标识一个类为控制器类,处理 Web 请求,返回视图或数据。

java复制

@Controller
@RequestMapping("/users")
public class UserController {
    @GetMapping
    public String getAllUsers(Model model) {
        List<User> users = userRepository.findAll();
        model.addAttribute("users", users);
        return "users/list";
    }
}

(2)@RestController

@RestController 注解用于创建 RESTful Web 服务,直接返回数据(如 JSON)。

java复制

@RestController
@RequestMapping("/api/users")
public class UserController {
    @GetMapping
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

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

(3)@RequestMapping

@RequestMapping 注解用于将 HTTP 请求映射到具体的处理器方法,支持 GETPOSTPUTDELETE 等请求方法。

java复制

@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<User> getUsers() {
    return userRepository.findAll();
}

(4)@GetMapping

@GetMapping 注解用于处理 GET 请求,简化了 @RequestMapping(method = RequestMethod.GET) 的写法。

java复制

@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
    return userRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("用户不存在"));
}

(5)@PostMapping

@PostMapping 注解用于处理 POST 请求,简化了 @RequestMapping(method = RequestMethod.POST) 的写法。

java复制

@PostMapping("/users")
public User createUser(@RequestBody User user) {
    return userRepository.save(user);
}

(6)@RequestBody

@RequestBody 注解用于将 HTTP 请求体绑定到方法参数(如 JSON 格式参数对象)。

java复制

@PostMapping("/users")
public ResponseEntity<String> createUser(@RequestBody User user) {
    // 处理用户对象
    return ResponseEntity.ok("User created successfully");
}

(7)@PathVariable

@PathVariable 注解用于从 URL 路径中提取变量值。

java复制

@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
    // 根据 ID 获取用户
    return ResponseEntity.ok(user);
}

7. 其他功能相关注解

(1)@Value

@Value 注解用于注入配置文件中的属性值或常量。

java复制

@Service
public class ConfigService {
    @Value("${app.name}")
    private String appName;

    @Value("10")
    private int someNumber;

    @Value("#{systemProperties['os.name']}")
    private String osName;
}

(2)@Async

@Async 注解用于异步执行方法,需要在配置类中启用 @EnableAsync

java复制

@Service
@EnableAsync
public class AsyncService {
    @Async
    public Future<String> doSomethingAsync() throws InterruptedException {
        Thread.sleep(5000);
        return new AsyncResult<>("Done");
    }
}

(3)@Scope

@Scope 注解用于定义 Bean 的作用域,默认情况下,Spring Bean 是单例(Singleton)的。

java复制

@Service
@Scope("prototype")
public class PrototypeService {
    // 此 service 每次都会创建新的实例
}

(4)@PostConstruct 和 @PreDestroy

  • @PostConstruct 注解用于标注在依赖注入完成后需要执行的方法。

  • @PreDestroy 注解用于标注在 Bean 销毁前需要执行的方法。

java复制

@Service
public class LifecycleService {
    @PostConstruct
    public void init() {
        System.out.println("LifecycleService initialized.");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("LifecycleService destroyed.");
    }
}

三、总结

Spring Boot 的注解为开发者提供了强大的功能,简化了开发流程,提高了代码的可读性和可维护性。通过合理使用这些注解,开发者可以更专注于业务逻辑的实现,从而提高项目的质量和开发速度。希望本文的介绍能够帮助开发者更好地理解和使用 Spring Boot 的注解,提升开发效率。

0

评论区