Spring中各个注解详解

1.@Cacheable注解

@Cacheable注解是Spring框架中的注解,用于将返回结果缓存起来以提高程序性能。

当使用@Cacheable注解时,Spring会先检查缓存中是否有对应的数据。如果有,则直接返回缓存数据;如果没有,则执行方法,并将方法返回值缓存起来供下次调用使用。

@Cacheable注解有三个比较重要的参数:

  • value:缓存的名称,在同一个应用程序中,多个@Cacheable注解可以使用相同的名称,这样它们会共享同一个缓存。
  • key:缓存的key,可以使用SpEL表达式指定key。默认情况下,它使用方法参数中的所有参数来组成key。
  • condition:缓存的条件,它使用SpEL表达式指定缓存的条件,如果为true,则数据被缓存;否则不使用缓存。

例如,假设我们有一个方法getUserById(int id),通过在方法上添加@Cacheable注解并使用#root.methodName作为key,我们可以在缓存中缓存getUserById方法返回的结果。这样,在下次调用getUserById方法时,如果缓存中已经存在相同的缓存key,Spring将直接从缓存中获取结果,而不是再次调用getUserById方法。

示例代码:

@Cacheable(value = "users", key = "#root.methodName + '_' + #id")
public User getUserById(int id) {
    // 从数据库中获取User信息
}

#root.methodName是SpEL(表达式语言)中的一种语法,用于获取当前被注解的方法名。在@Cacheable注解中,它可以用于定义缓存的key,因为每个方法都有一个唯一的方法名。

在这个例子中,我们定义了一个名为users的缓存,使用了方法的名称和传入的id作为缓存key。

使用@Cacheable注解时需要开启缓存功能,可以通过在配置文件中配置@EnableCaching注解来开启缓存。

2.@PostConstruct注解

@PostConstruct 是一个标准的 Java EE 注解,它表示一个方法应该在依赖注入完成后立即被调用,也就是在构造函数之后、初始化方法之前。

@PostConstruct 注解通常用于在创建 bean 后,执行一些初始化的操作。例如,初始化 bean 的某些属性,或者启动一些必要的服务等。

@PostConstruct 注解有以下几个特点:

  1. 注解方法必须是无参数的。
  2. 注解方法可以有任意的访问修饰符。
  3. 注解方法不能是 static 方法。
  4. 如果一个类中有多个方法被 @PostConstruct 注解修饰,那么这些方法的执行顺序不能被保证。

示例:

@Component
public class MyBean {

    private String message;

    @PostConstruct
    public void init() {
        this.message = "Hello World!";
    }

    // getters and setters
}

在上面的示例中,@PostConstruct 注解修饰的 init() 方法会在 MyBean 对象被创建后立即被调用,并且在该方法内部会初始化 message 属性。

在使用Spring框架时,@PostConstruct注解通常用于标记一个Bean的初始化方法。当一个Bean被创建并配置完毕后,Spring容器将会调用该Bean的初始化方法,该方法可以在Bean被使用之前执行一些必要的初始化工作,如资源加载、依赖注入等操作。

@PostConstruct注解的使用方法很简单,只需要在要使用的初始化方法上添加该注解即可。需要注意的是,@PostConstruct注解只能用于标记一个方法,在Bean的生命周期中只会被调用一次。

例如:

@Service
public class MyService {
    
    @PostConstruct
    public void init() {
        // 初始化操作
    }
    
}

3.@Retention注解

@Retention注解是Java中的元注解,用来声明注解的保留策略,即定义注解在何时有效。

@Retention有三个取值:

  1. @Retention(RetentionPolicy.SOURCE):表示该注解仅在源代码中有效,编译器会将其忽略,不会写入class文件。
  2. @Retention(RetentionPolicy.CLASS):表示该注解在编译时有效,会被写入class文件,但是在运行时会被忽略。
  3. @Retention(RetentionPolicy.RUNTIME):表示该注解在运行时有效,会在运行时被JVM读取和使用。

通常情况下,我们使用@Retention(RetentionPolicy.RUNTIME)来定义注解,因为它能够在运行时被反射获取到,实现一些运行时的动态处理。

示例代码:

@Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String value() default "default_value"; }

在该示例代码中,@Retention(RetentionPolicy.RUNTIME)表明MyAnnotation注解在运行时有效。

 

4.@Target注解

@Target注解用于指定该注解所应用的目标元素类型。在Java中,有很多种元素类型可以使用注解进行标记,例如类、方法、字段等等。@Target注解就是用来指定注解所应用的元素类型。

@Target注解的用法如下:

@Target(ElementType.TYPE) //指定注解应用于类、接口或枚举类型
public @interface MyAnnotation {
    //注解的属性
}

上述示例中,@Target注解的参数为ElementType.TYPE,即表示该注解只能用于类、接口或枚举类型上。其他常用的ElementType参数包括:

  • METHOD:适用于方法
  • FIELD:适用于域或属性
  • PARAMETER:适用于参数
  • CONSTRUCTOR:适用于构造方法
  • LOCAL_VARIABLE:适用于局部变量
  • ANNOTATION_TYPE:适用于注解类型
  • PACKAGE:适用于包

可以使用多个@Target注解来指定注解可以应用于多种元素类型。例如:

@Target({ElementType.METHOD, ElementType.FIELD}) //指定注解应用于方法和属性
public @interface MyAnnotation {
    //注解的属性
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值