本文主要介绍关于SpringBoot中Bean注入常用到的一些注解

@Conditional
用途:
@Conditional注解用于标记一个配置类或配置方法,告诉Spring根据指定的条件来决定是否应用这个配置。示例:
1
2
3
4
5
public class MyConfig {
// 配置类的内容
}
条件接口
- 实现条件:Spring提供了一系列条件接口,例如
OnClassCondition、OnPropertyCondition、OnBeanCondition等,它们各自对应不同的条件判断逻辑。 - **
OnClassCondition**:检查类路径中是否存在指定的类。 - **
OnPropertyCondition**:检查系统属性或环境属性中是否存在特定的值。 - **
OnBeanCondition**:检查容器中是否存在特定的Bean。 - **
OnMissingBeanCondition**:与OnBeanCondition相反,检查容器中是否不存在特定的Bean。
条件类
自定义条件:除了Spring提供的条件接口,你也可以创建自己的条件类,实现
Condition接口。Condition接口定义了一个matches方法,这个方法返回一个布尔值,指示是否满足条件。1
2
3
4
5
6
7public class MyCustomCondition implements Condition {
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 实现自定义条件逻辑
return true; // 或者 false
}
}组合条件:可以使用
ConditionalComposition类来组合多个条件。ConditionalComposition提供了and、or和not方法来组合条件。
@ConditionalOnProperty
@ConditionalOnProperty 注解有几个可选属性,允许你精细控制条件匹配的逻辑:
name:配置属性的名称。默认情况下,它使用注解所在位置的方法名作为属性名。havingValue:配置属性的预期值。如果配置属性存在并且其值与指定值匹配,则条件成立。notHavingValue:与havingValue相反,配置属性存在但值不匹配时条件成立。matchIfMissing:如果配置属性不存在,条件是否成立。默认情况下,如果属性不存在,条件不成立。havingAnyValue:如果配置属性的值是列表中的任何一个,则条件成立。notMatchIfMissing:与matchIfMissing相反,如果配置属性不存在,条件不成立。
@ConditionalOnMissingBean
- 条件:
@ConditionalOnMissingBean注解检查Spring容器中是否已经存在具有指定名称或类型的Bean。如果存在,则不会创建新的Bean。 - 名称:可以通过
name属性指定Bean的名称。如果指定了名称,则只有当容器中不存在具有该名称的Bean时,才会创建新的Bean。 - 类型:可以通过
type属性指定Bean的类型。如果指定了类型,则只有当容器中不存在该类型的Bean时,才会创建新的Bean。 - 组合条件:可以同时使用
name和type属性来组合条件,确保只有同时满足名称和类型条件时才会创建Bean。 - 依赖条件:还可以使用
dependentOnBean属性来指定一个依赖的Bean名称,只有当依赖的Bean存在时,才会创建新的Bean。
@EnableConfigurationProperties
配置属性类
配置属性类通常遵循以下规范:
- 类上使用
@ConfigurationProperties注解。 - 字段名应与配置文件中的属性名匹配(默认情况下,字段名和属性名是自动映射的,但不区分大小写)。
- 可选地,可以指定
prefix属性来定义配置文件中属性的命名前缀。
示例
假设你有一个配置属性类 MyProperties,它定义了两个属性,对应 application.properties 文件中的 myapp 前缀下的属性:
1 |
|
接下来,在配置类中使用 @EnableConfigurationProperties 注解来启用 MyProperties 类的自动配置:
1 |
|
自动装配
一旦启用了配置属性类的自动配置,Spring会自动:
- 创建配置属性类的Bean。
- 将配置文件中的属性值绑定到配置属性类的字段上。
- 自动装配配置属性类的Bean到任何需要它的地方。
@Profile
@Profile 注解用于指定一个Bean或配置只在特定的Spring配置文件(profile)激活时才生效。Spring支持多个配置文件,每个配置文件可以针对不同的运行环境(如开发、测试、生产等)。
@Profile({"prod", "test"})这里的括号内列出了多个环境名称(prod和test),这意味着被这个注解标记的Bean或配置仅在激活了名为prod或test的profile时才会被加载和使用。
示例
1 |
|
在这个例子中,MyConfig 类中定义的 someBean() 方法只有在 prod 或 test profile被激活时才会创建 SomeBean 的实例。
@Lazy
@Lazy 注解用于指示Spring容器在首次请求Bean时才创建它的实例。默认情况下,Spring容器会在应用启动时创建所有单例Bean的实例。使用 @Lazy 可以延迟Bean的创建,这对于减少应用启动时的资源消耗或实现其他逻辑(如懒加载)很有帮助。
- 当
@Lazy与@Profile结合使用时,它会影响Bean的创建时机,即使配置文件被激活。
示例
1 |
|
@Primary
@Primary是Spring框架中的一个注解,用于指定在存在多个Bean候选者时,哪一个应该被首选注入。在依赖注入时,如果存在多个Bean实现了相同的接口或符合相同的类型,Spring需要决定使用哪个Bean。在这种情况下,@Primary注解可以帮助Spring决定首选的Bean。
使用 @DependsOn
1 |
|
在这个例子中,MyConfig 配置类会在 openai_model、openai_use_count 和 user_credit_random 这些Bean创建之后创建。
参数
value:一个字符串数组,指定了依赖于的Bean的名称。
@PreDestroy | @PostConstruct
@PostConstruct是Java EE(Java Platform, Enterprise Edition)的一个注解,它用于标记一个方法,这个方法应该在应用初始化之后运行。它通常用于在依赖注入容器(如Spring框架中的Bean)初始化Bean之后执行一些初始化代码。
@PreDestroy是Java EE(Java Platform, Enterprise Edition)的一个注解,用于标记一个方法,这个方法将在应用关闭或容器销毁Bean之前运行。它通常用于清理资源,如关闭数据库连接、释放文件句柄等。
@PropertySource
@PropertySource 注解用于指定一个或多个配置文件的位置,Spring容器会从这些位置加载属性文件,并将其属性添加到Spring的环境中。
使用示例
1 | import org.springframework.context.annotation.Configuration; |
在这个例子中,AppConfig 配置类使用了 @PropertySource 注解来指定 application.properties 文件的位置,该文件应该位于类路径下 properties 目录中。
参数
value或locations:这两个参数可以用来指定属性文件的位置。value参数接受一个字符串数组,而locations参数接受一个PropertySource对象数组。
@ImportResource
@ImportResource 注解用于从XML配置文件中加载Bean定义。在Spring 3.1及以后版本中,推荐使用基于Java的配置方式,但有时仍然需要与传统的XML配置文件一起使用。