0
点赞
收藏
分享

微信扫一扫

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

骨灰级搬砖工 04-13 13:30 阅读 2

本系列文章简介:

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

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

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

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

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

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

目录

1、前言

2、缓存注解

2.1 @Cacheable

2.2 @CachePut

2.3 @CacheEvict

3、定时任务注解

3.1 @Scheduled

3.2 @EnableScheduling

4、异步方法注解

4.1 @Async

5、条件注解

5.1 @Conditional

6、配置注解

6.1 @Configuration

6.2 @Value

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注解时,可以指定一个缓存的名称和一个缓存键的生成策略。例如:

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

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

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

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

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

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

@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或者其他缓存框架提供的缓存管理器。

下面是一个示例代码:

@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注解的例子:

@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注解可以配置定时任务的执行时间、执行频率、执行逻辑等。

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

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注解的示例:

@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:

public class MyCondition implements Condition {

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

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

@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注解的使用示例:

@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注解,可以直接为属性赋值。例如:

@Component
public class MyBean {
    @Value("Hello World")
    private String message;
    
    //...
}

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

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

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

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

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

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

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

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

@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.

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

@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注解将这个配置类注入到其他地方使用:

@Autowired
private MyAppConfig myAppConfig;

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

String appName = myAppConfig.getName();
String appVersion = myAppConfig.getVersion();
String appDescription = myAppConfig.getDescription();

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

@NotBlank(message = "Name cannot be blank")
private String name;

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

private String name = "Default Name";

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

7、结语

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

举报

相关推荐

0 条评论