@ConditionalOnMissingBean作用
时间: 2024-01-16 17:19:02 浏览: 27
`@ConditionalOnMissingBean` 是 Spring 框架中的一个条件注解。当它在类或方法上被使用时,它提供了一种机制来自动配置特定的 Bean。这个注解的具体行为是,如果对应的 Bean 在当前的 Spring 上下文中不存在,那么就会创建并配置这个 Bean。换句话说,如果没有找到该类型的 Bean,Spring 就会尝试创建一个新的 Bean 并进行相应的配置。这对于避免重复配置或使用 Spring 的 Bean 工厂而不是依赖注入来创建新的 Bean 非常有用。`@ConditionalOnMissingBean` 可以用于任何 Spring 支持的 Bean 类型,包括 @Component、@Service、@Repository 和 @Controller 等。注意,如果你想为特定接口创建多个实现,并希望在某些情况下忽略特定实现,那么 `@ConditionalOnMissingBean` 可能不是最佳选择,因为它会为每个接口实例化一个新的 Bean。在这种情况下,你可能需要使用其他条件注解或自定义逻辑来处理这种情况。
相关问题
@ConditionalOnMissingBean 作用
@ConditionalOnMissingBean是一个用于修饰bean的注解,它的作用是当你的bean被注册之后,如果注册相同类型的bean,就不会成功,它会保证你的bean只有一个实例。如果你注册多个相同的bean,就会出现异常,以此来告诉人员。一般来说,对于自定义的配置类,我们应该加上@ConditionalOnMissingBean注解,以避免多个配置同时注入的风险。如果你想要注册多个相同类型的bean,可以使用@Primary来确定你要哪个实现。@Primary标识哪个是默认的bean。
举个例子,假设我们有一个AutoConfig类,其中包含了两个AMapper类型的bean:aMapper1和aMapper2。如果我们在aMapper1上面标识了@ConditionalOnMissingBean(AMapper.class),那么当我们进行aMapper2注册时,系统会出现异常,因为AMapper类型的bean只能有一个实现。如果我们想要注册多个相同类型的bean,可以使用@Primary来确定哪个是默认的bean。
```java
@Component
public class AutoConfig {
@Bean
public AConfig aConfig() {
return new AConfig("lind");
}
@Bean
@ConditionalOnMissingBean(AMapper.class)
public AMapper aMapper1(AConfig aConfig) {
return new AMapperImpl1(aConfig);
}
@Bean
@Primary
public AMapper aMapper2(AConfig aConfig) {
return new AMapperImpl2(aConfig);
}
}
```
@ConditionalOnMissingBean 作用在类上
`@ConditionalOnMissingBean` 是 Spring 框架中的一个注解,它可以用于类级别上,用于根据是否存在指定类型的 Bean 来决定是否创建当前类的实例。
当我们在一个类上添加了 `@ConditionalOnMissingBean` 注解时,Spring IoC 容器会根据当前上下文中是否已经存在指定类型的 Bean 来判断是否创建该类的实例。如果不存在该类型的 Bean,则会创建当前类的实例并加入容器中;如果已经存在该类型的 Bean,则不会创建当前类的实例。
这个注解通常用于条件化地创建一些默认的 Bean,当用户未显式配置相关的 Bean 时,才会被创建。它可以帮助我们在不同场景下有选择地创建 Bean,以满足特定需求。
以下是一个示例:
```java
@Configuration
public class MyConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService() {
return new MyServiceImpl();
}
}
```
在上面的示例中,`@ConditionalOnMissingBean` 注解应用于 `myService()` 方法上。它表示只有当容器中不存在 `MyService` 类型的 Bean 时,才会创建并注册 `myService()` 方法所返回的 `MyServiceImpl` 实例。
这样,当用户没有显式定义 `MyService` 的 Bean 时,Spring IoC 容器会自动创建一个默认的 `MyServiceImpl` 实例。而如果用户已经定义了 `MyService` 的 Bean,则默认的实例不会被创建。