Spring注入Bean时用到的注解

kyang MVP++

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

在这里插入图片描述

@Conditional

  • 用途@Conditional 注解用于标记一个配置类或配置方法,告诉Spring根据指定的条件来决定是否应用这个配置。

  • 示例

    1
    2
    3
    4
    5
    @Configuration
    @Conditional(OnPropertyCondition.class)
    public class MyConfig {
    // 配置类的内容
    }

条件接口

  • 实现条件:Spring提供了一系列条件接口,例如 OnClassConditionOnPropertyConditionOnBeanCondition 等,它们各自对应不同的条件判断逻辑。
  • **OnClassCondition**:检查类路径中是否存在指定的类。
  • **OnPropertyCondition**:检查系统属性或环境属性中是否存在特定的值。
  • **OnBeanCondition**:检查容器中是否存在特定的Bean。
  • **OnMissingBeanCondition**:与 OnBeanCondition 相反,检查容器中是否不存在特定的Bean。

条件类

  • 自定义条件:除了Spring提供的条件接口,你也可以创建自己的条件类,实现 Condition 接口。Condition 接口定义了一个 matches 方法,这个方法返回一个布尔值,指示是否满足条件。

    1
    2
    3
    4
    5
    6
    7
    public class MyCustomCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    // 实现自定义条件逻辑
    return true; // 或者 false
    }
    }
  • 组合条件:可以使用 ConditionalComposition 类来组合多个条件。ConditionalComposition 提供了 andornot 方法来组合条件。

@ConditionalOnProperty

@ConditionalOnProperty 注解有几个可选属性,允许你精细控制条件匹配的逻辑:

  • name:配置属性的名称。默认情况下,它使用注解所在位置的方法名作为属性名。
  • havingValue:配置属性的预期值。如果配置属性存在并且其值与指定值匹配,则条件成立。
  • notHavingValue:与 havingValue 相反,配置属性存在但值不匹配时条件成立。
  • matchIfMissing:如果配置属性不存在,条件是否成立。默认情况下,如果属性不存在,条件不成立。
  • havingAnyValue:如果配置属性的值是列表中的任何一个,则条件成立。
  • notMatchIfMissing:与 matchIfMissing 相反,如果配置属性不存在,条件不成立。

@ConditionalOnMissingBean

  1. 条件@ConditionalOnMissingBean 注解检查Spring容器中是否已经存在具有指定名称或类型的Bean。如果存在,则不会创建新的Bean。
  2. 名称:可以通过 name 属性指定Bean的名称。如果指定了名称,则只有当容器中不存在具有该名称的Bean时,才会创建新的Bean。
  3. 类型:可以通过 type 属性指定Bean的类型。如果指定了类型,则只有当容器中不存在该类型的Bean时,才会创建新的Bean。
  4. 组合条件:可以同时使用 nametype 属性来组合条件,确保只有同时满足名称和类型条件时才会创建Bean。
  5. 依赖条件:还可以使用 dependentOnBean 属性来指定一个依赖的Bean名称,只有当依赖的Bean存在时,才会创建新的Bean。

@EnableConfigurationProperties

配置属性类

配置属性类通常遵循以下规范:

  • 类上使用 @ConfigurationProperties 注解。
  • 字段名应与配置文件中的属性名匹配(默认情况下,字段名和属性名是自动映射的,但不区分大小写)。
  • 可选地,可以指定 prefix 属性来定义配置文件中属性的命名前缀。

示例

假设你有一个配置属性类 MyProperties,它定义了两个属性,对应 application.properties 文件中的 myapp 前缀下的属性:

1
2
3
4
5
6
7
8
9
@ConfigurationProperties(prefix = "myapp")
public class MyProperties {

private String exampleProperty;
private int anotherProperty;

// Getters and setters for the properties
// ...
}

接下来,在配置类中使用 @EnableConfigurationProperties 注解来启用 MyProperties 类的自动配置:

1
2
3
4
5
6
7
8
9
10
@Configuration
@EnableConfigurationProperties(MyProperties.class)
public class AppConfig {

@Autowired
private MyProperties myProperties;

// 使用 myProperties 字段
// ...
}

自动装配

一旦启用了配置属性类的自动配置,Spring会自动:

  • 创建配置属性类的Bean。
  • 将配置文件中的属性值绑定到配置属性类的字段上。
  • 自动装配配置属性类的Bean到任何需要它的地方。

@Profile

@Profile 注解用于指定一个Bean或配置只在特定的Spring配置文件(profile)激活时才生效。Spring支持多个配置文件,每个配置文件可以针对不同的运行环境(如开发、测试、生产等)。

  • @Profile({"prod", "test"}) 这里的括号内列出了多个环境名称(prodtest),这意味着被这个注解标记的Bean或配置仅在激活了名为 prodtest 的profile时才会被加载和使用。

示例

1
2
3
4
5
6
7
8
@Configuration
@Profile({"prod", "test"})
public class MyConfig {
@Bean
public SomeBean someBean() {
return new SomeBean();
}
}

在这个例子中,MyConfig 类中定义的 someBean() 方法只有在 prodtest profile被激活时才会创建 SomeBean 的实例。

@Lazy

@Lazy 注解用于指示Spring容器在首次请求Bean时才创建它的实例。默认情况下,Spring容器会在应用启动时创建所有单例Bean的实例。使用 @Lazy 可以延迟Bean的创建,这对于减少应用启动时的资源消耗或实现其他逻辑(如懒加载)很有帮助。

  • @Lazy@Profile 结合使用时,它会影响Bean的创建时机,即使配置文件被激活。

示例

1
2
3
4
5
6
7
8
9
@Configuration
@Profile({"prod", "test"})
@Lazy
public class MyConfig {
@Bean
public SomeBean someBean() {
return new SomeBean();
}
}

@Primary

@Primary 是Spring框架中的一个注解,用于指定在存在多个Bean候选者时,哪一个应该被首选注入。在依赖注入时,如果存在多个Bean实现了相同的接口或符合相同的类型,Spring需要决定使用哪个Bean。在这种情况下,@Primary 注解可以帮助Spring决定首选的Bean。

使用 @DependsOn

1
2
3
4
5
@Configuration
@DependsOn({"openai_model", "openai_use_count", "user_credit_random"})
public class MyConfig {
// ...
}

在这个例子中,MyConfig 配置类会在 openai_modelopenai_use_countuser_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
2
3
4
5
6
7
8
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:properties/application.properties")
public class AppConfig {
// ...配置类代码...
}

在这个例子中,AppConfig 配置类使用了 @PropertySource 注解来指定 application.properties 文件的位置,该文件应该位于类路径下 properties 目录中。

参数

  • valuelocations:这两个参数可以用来指定属性文件的位置。value 参数接受一个字符串数组,而 locations 参数接受一个 PropertySource 对象数组。

@ImportResource

@ImportResource 注解用于从XML配置文件中加载Bean定义。在Spring 3.1及以后版本中,推荐使用基于Java的配置方式,但有时仍然需要与传统的XML配置文件一起使用。

  • 标题: Spring注入Bean时用到的注解
  • 作者: kyang
  • 创建于 : 2024-09-26 17:30:32
  • 更新于 : 2025-07-11 16:56:12
  • 链接: https://blog.kyang.top/2024/09/26/Spring注入Bean时用到的注解/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论