在我的 Spring Boot 应用程序中。我创建了一个类名 Book 并使用 @Component 注释对该类进行注释。然后我创建了一个带有 @Configration 注释的 AppConfig 类,并在该类中创建了一个方法名称 getBook() ,并用 @Bean 注释进行了注释,该方法返回 Book 对象。
所以我接受了一个错误:需要一个bean,但是发现了2个当我使用@Autowird注释来注入它时,它没有给我任何错误并创建了两个bean。所以我观察到,如果我使用下面的代码来注入它:
@Autowired
Book book;
它没有给我任何错误,因为这里的实例名称是 book。
但是如果我将其注入为:
@Autowired
Book obj;
它给了我错误:需要一个bean,但找到了2个
谁能告诉我为什么会这样。
@Component
public class Book {
void readBook() {
System.out.println("reading book");
}
}
@Configuration
public class AppConfig {
@Bean
Book getBook() {
return new Book();
}
}
@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 {
}
}
@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 {
}
}
Spring 的主要目的之一是控制反转或依赖注入。简而言之,您不必手动创建对象的实例,但 spring 将为您提供一个实现。对于现代的 Spring,它可以通过注释来实现。当您使用代码扫描注释(例如
@Service
或 @Component
或 @Configuration
或任何其他触发代码扫描的复合注释来注释类时,Spring 将尝试在运行时创建该对象的实例。现在,有时我们不会(或者在第三方代码的情况下不能)将这些注释添加到类中。在这种情况下,您可以提供 @Bean
注释以及如何构造对象的实现。当您@Autowire
一个类时,这些机制中的任何一个都会尝试创建要注入的类的实例。
长话短说,有多种方法可以触发 Spring 的类实例创建,上面只是我提到的两种简单方法。根据您的用例(看起来您可以控制代码,因此如果您不需要对书籍实例执行任何特殊操作),那么我建议删除
@Bean
和 getBook
和清理代码。现在,spring 将只找到一种创建实例的方法,您将不会再收到错误。
再次强调,这只是 Spring 核心内容的皮毛,但应该可以让您朝着一个方向前进。祝你好运!