Spring Boot:如果我们对同一个类同时使用 @Component 和 @Bean 注解,Spring Boot 如何处理

问题描述 投票:0回答:1

在我的 Spring Boot 应用程序中。我创建了一个类名 Book 并使用 @Component 注释对该类进行注释。然后我创建了一个带有 @Configration 注释的 AppConfig 类,并在该类中创建了一个方法名称 getBook() ,并用 @Bean 注释进行了注释,该方法返回 Book 对象。

所以我接受了一个错误:需要一个bean,但是发现了2个当我使用@Autowird注释来注入它时,它没有给我任何错误并创建了两个bean。所以我观察到,如果我使用下面的代码来注入它:

@Autowired
Book book;

它没有给我任何错误,因为这里的实例名称是 book。

但是如果我将其注入为:

@Autowired
Book obj;

它给了我错误:需要一个bean,但找到了2个

谁能告诉我为什么会这样。

  1. 书籍课程代码:
@Component
public class Book {

    void readBook() {
        System.out.println("reading book");
    }

}
  1. AppConfig类代码:
@Configuration
public class AppConfig {

    @Bean
    Book getBook() {
        return new Book();
    }
}
  1. 我注入它并得到 2 bean found 错误的主类代码:
@SpringBootApplication
public class IntroductionToSpringBootApplication implements CommandLineRunner {

    @Autowired
    Book obj;




    public static void main(String[] args) {

        SpringApplication.run(IntroductionToSpringBootApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {      
    }
}
  1. 我注入它的主类代码并且没有错误:
@SpringBootApplication
public class IntroductionToSpringBootApplication implements CommandLineRunner {

    @Autowired
    Book book;




    public static void main(String[] args) {

        SpringApplication.run(IntroductionToSpringBootApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {      
    }
}
java spring-boot spring-bean
1个回答
0
投票

Spring 的主要目的之一是控制反转或依赖注入。简而言之,您不必手动创建对象的实例,但 spring 将为您提供一个实现。对于现代的 Spring,它可以通过注释来实现。当您使用代码扫描注释(例如

@Service
@Component
@Configuration
或任何其他触发代码扫描的复合注释来注释类时,Spring 将尝试在运行时创建该对象的实例。现在,有时我们不会(或者在第三方代码的情况下不能)将这些注释添加到类中。在这种情况下,您可以提供
@Bean
注释以及如何构造对象的实现。当您
@Autowire
一个类时,这些机制中的任何一个都会尝试创建要注入的类的实例。

长话短说,有多种方法可以触发 Spring 的类实例创建,上面只是我提到的两种简单方法。根据您的用例(看起来您可以控制代码,因此如果您不需要对书籍实例执行任何特殊操作),那么我建议删除

@Bean
getBook
和清理代码。现在,spring 将只找到一种创建实例的方法,您将不会再收到错误。

再次强调,这只是 Spring 核心内容的皮毛,但应该可以让您朝着一个方向前进。祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.