Spring Boot核心注解大全:从入门到精通(三)

本系列文章简介:

Spring Boot是一款非常流行的Java开发框架,它通过简化配置和提供丰富的开箱即用功能,使得Java开发变得更加快速和简单。在Spring Boot中,核心注解扮演着非常重要的角色,它们定义了应用程序的行为和特性。因此,了解并熟练掌握这些核心注解是非常重要的。

本系列文章将带您从入门到精通,介绍Spring Boot的核心注解,帮助您深入理解它们的作用和用法。无论您是初学者还是有一定经验的开发者,都可以通过本系列文章学习到有关Spring Boot注解的重要知识。

在本系列文章中,我们将按照不同的功能和用途对核心注解进行分类和介绍。这些注解包括但不限于:配置注解、启动注解、路由注解、数据访问注解、事务注解等。我们将逐一介绍每个注解的作用和如何使用它们。

此外,我们还将提供大量的示例代码和实际应用场景,帮助您更好地理解和应用这些注解。通过学习本系列文章,您将能够掌握Spring Boot注解的核心概念和用法,快速上手并有效地开发出高质量的应用程序。

无论您是正在学习Spring Boot,还是希望提升自己的开发技能,本系列文章都将是一个很好的参考资料。我们相信,通过学习Spring Boot核心注解,您将能够更加高效地进行Java开发,为您的项目带来更大的成功。让我们一起开始吧!

欢迎大家订阅《Java技术栈高级攻略》专栏,一起学习,一起涨分!

目录

1、前言

2、缓存注解

[2.1 @Cacheable](#2.1 @Cacheable)

[2.2 @CachePut](#2.2 @CachePut)

[2.3 @CacheEvict](#2.3 @CacheEvict)

3、定时任务注解

[3.1 @Scheduled](#3.1 @Scheduled)

[3.2 @EnableScheduling](#3.2 @EnableScheduling)

4、异步方法注解

[4.1 @Async](#4.1 @Async)

5、条件注解

[5.1 @Conditional](#5.1 @Conditional)

6、配置注解

[6.1 @Configuration](#6.1 @Configuration)

[6.2 @Value](#6.2 @Value)

[6.3 @ConfigurationProperties](#6.3 @ConfigurationProperties)

7、结语


1、前言

Spring Boot是一个开源的Java框架,它被设计用来简化Spring应用的创建和开发过程。它基于Spring框架,通过自动配置和约定大于配置的方式,提供了一种快速创建独立的、可部署的Spring应用的方法。

本文将跟随《Spring Boot核心注解大全:从入门到精通(二)》的进度,继续介绍Spring Boot核心注解。希望通过本系列文章的学习,您将能够更好地理解Spring Boot核心注解的内部工作原理,掌握Spring Boot核心注解的使用技巧,以及通过合理的设计完成最佳实践,充分发挥优化Spring Boot核心注解的潜力,为系统的高效运行提供有力保障。

2、缓存注解

2.1 @Cacheable

@Cacheable注解用于将方法的结果缓存起来,以便在下次调用相同方法时可以直接从缓存中取值,而不需要再次执行方法。

使用@Cacheable注解时,可以指定一个缓存的名称和一个缓存键的生成策略。例如:

java 复制代码
@Cacheable(value = "myCache", key = "#param")
public Object getResult(String param) {
    // method logic here...
}

上述代码将方法的返回结果缓存在名为"myCache"的缓存中,缓存键的生成策略是根据方法的参数param来生成的。

@Cacheable注解还可以指定条件,只有当满足条件时才会将方法的返回结果缓存起来。例如:

java 复制代码
@Cacheable(value = "myCache", key = "#param", condition = "#result != null")
public Object getResult(String param) {
    // method logic here...
}

上述代码表示只有当方法的返回结果不为null时才会将结果缓存起来。

同时,@Cacheable注解还可以设置一个过期时间,表示缓存的数据在多长时间后失效。例如:

java 复制代码
@Cacheable(value = "myCache", key = "#param", condition = "#result != null", expire = 600)
public Object getResult(String param) {
    // method logic here...
}

上述代码表示缓存的数据在600秒后失效。

需要注意的是,@Cacheable注解需要配合缓存管理器一起使用,以实现真正的缓存功能。可以通过配置文件或者代码的方式配置缓存管理器。另外,还需要确保使用了@Cacheable注解的方法始终返回相同类型的值,否则会导致缓存数据类型不一致的问题。

2.2 @CachePut

@CachePut注解用于将方法的返回值保存到缓存中。它主要用于在调用方法之前,检查缓存中是否已存在相应的键值对。如果存在,则不执行方法;如果不存在,则执行方法,并将返回值保存到缓存中。

使用@CachePut注解需要先配置一个缓存管理器,比如使用Spring提供的CacheManager或者其他缓存框架提供的缓存管理器。

下面是一个示例代码:

java 复制代码
@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @CachePut(value = "users", key = "#user.id")
    public User save(User user) {
        return userRepository.save(user);
    }
}

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // ...
}

在上面的示例中,save方法使用了@CachePut注解来将返回值保存到名为"users"的缓存中,并以user对象的id作为缓存的键值。

需要注意的是,@CachePut注解与@Cacheable注解的区别在于,@CachePut注解总是执行方法,并将返回值保存到缓存中,而不去检查缓存中是否已存在相应的键值对。因此,@CachePut注解适合用于更新缓存的情况,比如更新数据库中的数据。

总结: @CachePut注解用于将方法的返回值保存到缓存中,常用于更新缓存的情况。使用@CachePut注解需要先配置一个缓存管理器,并且需要指定缓存的名称和键值。

2.3 @CacheEvict

@CacheEvict注解是Spring框架中的一个注解,用于清除缓存。它可以应用在方法上,表示该方法执行后将清除指定的缓存区域。

@CacheEvict注解的常用属性如下:

  • value:指定要清除缓存的名称,可以是一个字符串或字符串数组。若不指定,则默认使用默认缓存管理器的名称。
  • key:指定要清除的缓存项的键,支持SpEL表达式。若不指定,则会根据方法参数生成一个默认的键。
  • condition:指定清除缓存的条件,支持SpEL表达式。只有当条件为真时,才会清除缓存。默认为空,表示无条件清除。
  • allEntries:指定是否要清除缓存中的所有项。默认为false,表示只清除指定的键对应的缓存项。

以下是一个使用@CacheEvict注解的例子:

@Service
public class UserService {

    @CacheEvict(value = "users", key = "#id")
    public void deleteUserById(Long id) {
        // 执行删除用户的操作
    }

    @CacheEvict(value = "users", allEntries = true)
    public void deleteAllUsers() {
        // 执行删除所有用户的操作
    }

}

在上面的例子中,deleteUserById方法使用@CacheEvict注解清除了名为"users"的缓存区域中键为指定id的缓存项。deleteAllUsers方法使用@CacheEvict注解清除了名为"users"的缓存区域中的所有缓存项。

需要注意的是,@CacheEvict注解只能应用在有缓存注解(如@Cacheable、@CachePut)的方法上,否则无效。

3、定时任务注解

3.1 @Scheduled

@Scheduled注解是Spring框架提供的一个注解,用于定义定时任务。通过在方法上添加该注解,可以指定方法在特定的时间间隔内执行。

@Scheduled注解有几种使用方式:

  1. 固定时间间隔执行:使用fixedRate属性,指定方法的执行间隔时间,单位是毫秒。
  2. 固定延迟执行:使用fixedDelay属性,指定方法的执行间隔时间,单位是毫秒。与fixedRate不同的是,fixedDelay会等待上一个方法执行完成后再执行下一个方法。
  3. cron表达式执行:使用cron属性,指定方法的执行时间,支持cron表达式的完整语法。

下面是一个使用@Scheduled注解的例子:

java 复制代码
@Component
public class MyScheduledTask {
 
    @Scheduled(fixedRate = 5000)
    public void doTask() {
        // 方法要执行的操作
    }
 
    @Scheduled(fixedDelay = 5000)
    public void doAnotherTask() {
        // 方法要执行的操作
    }
 
    @Scheduled(cron = "0 0 12 * * ?")
    public void doCronTask() {
        // 方法要执行的操作
    }
}

在上面的例子中,MyScheduledTask类是一个Spring组件,使用@Component注解进行标记。在类中的方法上添加了@Scheduled注解,分别定义了三个定时任务方法。第一个doTask方法每隔5秒钟执行一次,第二个doAnotherTask方法等上一个方法执行完成后再等5秒钟执行,第三个doCronTask方法使用cron表达式指定每天中午12点执行一次。

需要注意的是,@Scheduled注解需要与@EnableScheduling注解一起使用,以启用Spring的定时任务功能。在Spring Boot应用中,可以直接在启动类上添加@EnableScheduling注解。

以上就是@Scheduled注解的详解和使用方法。通过使用该注解,可以轻松地定义和管理定时任务。

3.2 @EnableScheduling

@EnableScheduling是Spring框架中的一个注解,它用于启用定时任务的功能。在使用这个注解之前,我们需要先配置一个实现了SchedulingConfigurer接口的类,并在其中实现定时任务的相关逻辑。

@EnableScheduling注解的作用是告诉Spring框架,我们希望启用定时任务的功能,并且该注解可以用在Spring Boot应用程序的入口类上(通常是带有@SpringBootApplication注解的类)。

使用@EnableScheduling注解后,我们就可以在Spring应用程序中使用@Scheduled注解来定义定时任务。@Scheduled注解可以配置定时任务的执行时间、执行频率、执行逻辑等。

例如,下面是一个简单的示例:

java 复制代码
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import import org.springframework.stereotype.Component;

@Component
@EnableScheduling
public class ScheduledTasks {

    @Scheduled(fixedRate = 5000)
    public void printMessage() {
        System.out.println("Hello, world!");
    }
}

在上面的示例中,我们定义了一个名为printMessage的定时任务,它会每5秒钟打印一次"Hello, world!"。

需要注意的是,@EnableScheduling注解只能用于标记Spring应用程序的入口类,并且定时任务的方法需要有public修饰符,否则无法被Spring框架识别。

总结一下,@EnableScheduling注解的作用是启用定时任务的功能,它可以用于标记Spring应用程序的入口类,并配合@Scheduled注解来定义定时任务的执行逻辑。

4、异步方法注解

4.1 @Async

@Async注解是Spring框架提供的一个用于实现异步方法调用的注解。

在需要实现异步调用的方法上加上@Async注解,就可以将该方法的执行交给一个单独的线程来处理,而当前线程可以继续执行其他操作。

使用@Async注解需要满足以下条件:

  1. 需要在配置类中添加@EnableAsync注解,开启异步方法支持。
  2. 需要在异步方法所在的类上添加@Component或@Service注解,使其能够被Spring框架扫描到。
  3. 异步方法必须是public修饰的。

使用@Async注解的方法不能有返回值,如果需要返回结果,可以通过Future<T>对象来获取。

下面是一个使用@Async注解的示例:

java 复制代码
@Configuration
@EnableAsync
public class AppConfig {
}

@Service
public class MyService {

    @Async
    public void doSomething() {
        // 异步执行的逻辑
    }

    @Async
    public Future<String> doSomethingWithResult() {
        // 异步执行的逻辑
        return new AsyncResult<>("result");
    }
}

在上述示例中,doSomething方法和doSomethingWithResult方法被标注为@Async,因此它们的执行将在一个单独的线程中进行。

需要注意的是,使用@Async注解时要确保使用的是基于线程池的TaskExecutor,而不是SimpleAsyncTaskExecutor,因为SimpleAsyncTaskExecutor是每次调用都会创建一个新的线程,而线程池可以重用线程,性能更好。

除了上述示例中的方法级别的@Async注解,还可以在类级别上使用@Async注解,表示该类的所有方法都是异步的。

需要注意的是,@Async注解只有在使用@EnableAsync注解开启异步方法支持后才会生效。

5、条件注解

5.1 @Conditional

@Conditional注解是Spring框架提供的一个条件化注解,用于根据条件决定是否创建一个Bean。

使用@Conditional注解时,我们需要定义一个条件类,该类实现了Condition接口,并重写了其中的matches方法。matches方法返回一个boolean值,用于判断是否创建该Bean。

例如,我们定义一个条件类MyCondition:

java 复制代码
public class MyCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 根据条件判断是否创建Bean
        // 返回true,则创建Bean;返回false,则不创建Bean
    }
}

然后我们可以在需要条件化创建Bean的地方使用@Conditional注解,指定我们定义的条件类:

java 复制代码
@Configuration
public class MyConfiguration {

    @Bean
    @Conditional(MyCondition.class)
    public MyBean myBean() {
        // 创建Bean的逻辑
        return new MyBean();
    }
}

在上述例子中,只有当MyCondition.matches方法返回true时,才会创建MyBean对象并注入到Spring容器中。如果返回false,那么将不会创建MyBean对象。

@Conditional注解的使用场景非常广泛,可以用于动态创建Bean,根据不同的环境条件创建不同的Bean,或者根据某些配置属性创建Bean等等。它可以灵活的控制Bean的创建和销毁,使得应用程序的逻辑更加灵活和可配置。

6、配置注解

6.1 @Configuration

@Configuration是一个用来标识配置类的注解,表示该类是一个配置类,用于定义配置信息和创建Bean实例。

@Configuration注解通常与@Bean注解一起使用,使用@Bean注解的方法会被Spring容器托管,返回的对象会被添加到Spring容器中。可以使用@Configuration注解的类来替代XML配置文件,通过Java代码来配置Bean。

使用@Configuration注解的类通常有以下特点:

  1. 该类必须被@ComponentScan扫描到,可以通过@ComponentScan注解指定扫描的包范围。
  2. 使用@Bean注解的方法必须返回一个对象,Spring会将该对象添加到容器中。
  3. 使用@Bean注解的方法可以有参数,参数可以使用@Autowired注解进行自动装配。

@Configuration注解的使用示例:

java 复制代码
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

在上面的示例中,AppConfig类被@Configuration注解标识为配置类,使用@ComponentScan注解指定了需要扫描的包路径。另外,该类还定义了一个名为myBean的@Bean方法,用于创建一个MyBean对象,Spring会将该对象添加到容器中。

在使用@Configuration注解时需要注意以下几点:

  1. @Configuration注解标识的类内部的@Bean方法不能在同一个类中调用,否则@Bean方法会失效。
  2. 可以使用@Import注解来导入其他配置类,方便管理配置。
  3. 可以使用@PropertySource注解来加载外部的配置文件。
  4. 使用@ConfigurationProperties注解来绑定配置文件的属性到一个Bean中。

总之,使用@Configuration注解可以方便地替代XML配置文件,通过Java代码来配置Bean,提高了代码的可读性和维护性。

6.2 @Value

@Value注解是Spring框架中用于对字段进行赋值的注解。它可以用于类的属性上,也可以用于方法的参数上。

在类的属性上使用@Value注解,可以直接为属性赋值。例如:

java 复制代码
@Component
public class MyBean {
    @Value("Hello World")
    private String message;
    
    //...
}

这里的message属性会被赋值为"Hello World"。可以看到,我们可以直接在@Value注解中指定属性的值。

除了直接指定属性的值,@Value注解还支持表达式的使用。例如:

java 复制代码
@Component
public class MyBean {
    @Value("#{systemProperties['my.property']}")
    private String myProperty;
    
    //...
}

这里的myProperty属性会被赋值为系统属性my.property的值。

@Value注解还支持使用SpEL表达式。例如:

java 复制代码
@Component
public class MyBean {
    @Value("#{T(java.lang.Math).random()}")
    private double randomNumber;
    
    //...
}

这里的randomNumber属性会被赋值为一个随机数。

在方法的参数上使用@Value注解,可以将注解的值作为方法的参数传入。例如:

java 复制代码
@Component
public class MyBean {
    @Autowired
    private MyService myService;
    
    public void doSomething(@Value("Hello World") String message) {
        myService.printMessage(message);
    }
}

这里的doSomething方法的参数message会被赋值为"Hello World",然后传递给myService的printMessage方法。

总结一下,@Value注解可以用于直接为字段赋值,支持直接指定值、使用表达式和SpEL表达式;也可以用于方法的参数上,将注解的值作为方法的参数传入。

6.3 @ConfigurationProperties

@ConfigurationProperties是Spring Boot提供的一个注解,用于将配置文件中的属性值映射到一个Java对象中。它可以用在任何Spring管理的Bean上,使这个Bean成为一个配置类。

使用@ConfigurationProperties注解的步骤如下:

  1. 创建一个Java类,并在类上添加@ConfigurationProperties注解。这个类将用于映射配置文件中的属性。
  2. 在类中定义与配置文件中属性对应的字段,并为这些字段提供getter和setter方法。
  3. 在配置文件中设置属性的值。

举个例子,假设我们有一个配置文件application.properties,其中包含了以下属性:

myapp.name=My Application
myapp.version=1.0.0
myapp.description=This is a sample application.

我们可以创建一个类来映射这些属性:

java 复制代码
@ConfigurationProperties(prefix = "myapp")
public class MyAppConfig {
    private String name;
    private String version;
    private String description;
    
    // getter and setter methods here...
}

在这个类中,我们使用了prefix = "myapp"来指定属性的前缀。使用这个前缀,我们可以将配置文件中的属性值映射到这个类的对应字段中。

然后,在我们的Spring Boot应用程序中,我们可以使用@Autowired注解将这个配置类注入到其他地方使用:

java 复制代码
@Autowired
private MyAppConfig myAppConfig;

现在,我们就可以在代码中使用myAppConfig对象来访问配置文件中的属性了:

java 复制代码
String appName = myAppConfig.getName();
String appVersion = myAppConfig.getVersion();
String appDescription = myAppConfig.getDescription();

@ConfigurationProperties还支持属性的校验和默认值设置。我们可以在字段上使用javax.validation.constraints注解来定义校验规则,例如:

java 复制代码
@NotBlank(message = "Name cannot be blank")
private String name;

同时,我们也可以为字段提供默认值,当配置文件中没有为该字段设置值时,将使用默认值:

java 复制代码
private String name = "Default Name";

总之,@ConfigurationProperties注解是一个非常方便的工具,可以帮助我们轻松地将配置文件中的属性值映射到Java对象中。这样做可以使我们的代码更加清晰和可维护。

7、结语

文章至此,已接近尾声!希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注。您的支持是作者创作的最大动力,如果您觉得这篇文章对您有所帮助,请分享给身边的朋友和同事!

相关推荐
java66666888825 分钟前
在Spring Boot中集成分布式日志收集方案
spring boot·分布式·jenkins
java66666888832 分钟前
深入理解Spring Boot中的配置加载顺序
java·spring boot·后端
AllenIverrui1 小时前
MyBatisPlus的使用
spring boot·spring·java-ee·mybatis
冯宝宝^1 小时前
图书管理系统
服务器·数据库·vue.js·spring boot·后端
五月阳光暖洋洋1 小时前
SpringBoot2.2.6使用spring-boot-validation读取不到自定义配置文件中的属性
java·开发语言·spring boot
java6666688881 小时前
深入理解Spring Boot中的容器与依赖注入
java·spring boot·后端
u0104058362 小时前
Spring Boot中的依赖注入和控制反转
java·spring boot·后端
虫小宝2 小时前
解决Spring Boot中的安全漏洞与防护策略
java·spring boot·后端
java6666688882 小时前
Spring Boot与HashiCorp Vault的集成
数据库·spring boot·oracle
G皮T3 小时前
【MyBatis】MyBatis 理论 40 问(二)
java·数据库·spring boot·spring·mybatis·关系映射