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 注解有以下几个特点:
- 注解方法必须是无参数的。
- 注解方法可以有任意的访问修饰符。
- 注解方法不能是 static 方法。
- 如果一个类中有多个方法被 @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有三个取值:
- @Retention(RetentionPolicy.SOURCE):表示该注解仅在源代码中有效,编译器会将其忽略,不会写入class文件。
- @Retention(RetentionPolicy.CLASS):表示该注解在编译时有效,会被写入class文件,但是在运行时会被忽略。
- @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 {
//注解的属性
}