Spring Boot 2.1 bean override 与 Primary

作者:编程家 分类: spring 时间:2025-09-22

Spring Boot是一个开源的Java框架,用于开发和构建独立的、基于Spring的应用程序。它简化了Spring应用程序的配置和部署过程,提供了一种快速、方便的方式来创建可独立运行的、生产级别的Spring应用程序。

在Spring Boot中,bean是应用程序的核心组件。它们是由Spring容器管理的对象,可以在应用程序中被注入和使用。然而,在某些情况下,我们可能需要覆盖默认的bean定义,或者指定一个主要的bean定义。

在Spring Boot 2.1中,bean的覆盖和主要性可以使用两种方式来实现:@Primary注解和@Bean注解的覆盖。

@Primary注解用于指定一个bean定义为主要的。当存在多个bean的类型匹配时,Spring容器将选择主要的bean定义作为注入的候选对象。这对于解决依赖注入中的歧义性非常有用。

下面是一个示例代码,演示了如何使用@Primary注解来指定主要的bean定义:

java

@Configuration

public class AppConfig {

@Bean

public GreetingService primaryGreetingService() {

return new PrimaryGreetingService();

}

@Bean

@Primary

public GreetingService secondaryGreetingService() {

return new SecondaryGreetingService();

}

}

public interface GreetingService {

String greet();

}

public class PrimaryGreetingService implements GreetingService {

@Override

public String greet() {

return "Hello from primary greeting service!";

}

}

public class SecondaryGreetingService implements GreetingService {

@Override

public String greet() {

return "Hello from secondary greeting service!";

}

}

@RestController

public class GreetingController {

private final GreetingService greetingService;

public GreetingController(GreetingService greetingService) {

this.greetingService = greetingService;

}

@GetMapping("/greet")

public String greet() {

return greetingService.greet();

}

}

在上面的示例中,我们定义了一个AppConfig类,用于配置bean。在配置类中,我们使用了@Bean注解来创建GreetingService的两个实例:primaryGreetingService和secondaryGreetingService。其中,secondaryGreetingService上使用了@Primary注解,表示它是主要的bean定义。

然后,我们定义了一个GreetingController类,用于处理请求并使用GreetingService来进行问候。在构造函数中,我们使用了@Autowired注解来自动注入GreetingService。由于secondaryGreetingService被标记为主要的bean定义,因此它将被注入到GreetingController中。

接下来,我们运行应用程序并发送GET请求到“/greet”路径。应用程序将返回“Hello from secondary greeting service!”作为响应,这是由主要的bean定义提供的。

使用@Bean注解的覆盖

除了使用@Primary注解,我们还可以使用@Bean注解的覆盖来实现bean的覆盖。当我们有多个相同类型的bean定义时,我们可以使用@Bean注解的覆盖来指定要注入的bean。

下面是一个示例代码,演示了如何使用@Bean注解的覆盖:

java

@Configuration

public class AppConfig {

@Bean

public GreetingService primaryGreetingService() {

return new PrimaryGreetingService();

}

@Bean

public GreetingService secondaryGreetingService() {

return new SecondaryGreetingService();

}

@Bean

public GreetingService overriddenGreetingService() {

return new OverriddenGreetingService();

}

}

public class OverriddenGreetingService implements GreetingService {

@Override

public String greet() {

return "Hello from overridden greeting service!";

}

}

在上面的示例中,我们定义了一个名为overriddenGreetingService的新的GreetingService实例,并使用@Bean注解将其添加到应用程序的bean定义中。

当Spring容器进行依赖注入时,它将优先选择overriddenGreetingService作为注入的候选对象,而不是primaryGreetingService或secondaryGreetingService。

这样,我们就可以通过@Primary注解和@Bean注解的覆盖来实现bean的覆盖和指定主要的bean定义。这在解决依赖注入中的歧义性和选择特定的bean定义时非常有用。

- Spring Boot是一个用于开发和构建独立的、基于Spring的应用程序的Java框架。

- 在Spring Boot中,bean是应用程序的核心组件,可以通过注解来配置和管理。

- 使用@Primary注解可以指定一个bean定义为主要的,解决依赖注入中的歧义性。

- 使用@Bean注解的覆盖可以实现bean的覆盖和指定注入的bean。

文章结束。感谢阅读!