本指南将帮助您了解Spring中最重要的概念 - 组件扫描。Spring Boot在组件扫描方面做了一些魔术。让我们理解这篇文章。
如果你了解组件扫描,你就会理解Spring。
Spring是一个依赖注入框架。它完全是关于依赖的bean和布线。
定义Spring Beans的第一步是添加正确的注释 - @Component或@Service或@Repository。
但是,Spring不知道bean,除非它知道在哪里搜索它。
这部分“告诉Spring在哪里搜索”称为组件扫描。
您定义了必须扫描的包。
为包定义组件扫描后,Spring将搜索包及其所有子包以获取组件/ bean。
定义组件扫描
执行摘要
#######详细示例
考虑下面的课程:
package com.in28minutes.springboot.basics.springbootin10steps;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class SpringbootIn10StepsApplication {
public static void main(String[] args) {
ApplicationContext applicationContext =
SpringApplication.run(SpringbootIn10StepsApplication.class, args);
for (String name : applicationContext.getBeanDefinitionNames()) {
System.out.println(name);
}
}
}
@SpringBootApplication
定义在SpringbootIn10StepsApplication class
哪个包上com.in28minutes.springboot.basics.springbootin10steps.
@SpringBootApplication
定义包上的自动组件扫描com.in28minutes.springboot.basics.springbootin10steps
。
如果所有组件都在上述包或其子包中定义,则可以。
但是,假设其中一个组件是在包中定义的 com.in28minutes.springboot.somethingelse
在这种情况下,您需要将新包添加到组件扫描中。
两个选项
选项1
@ComponentScan(“com.in28minutes.springboot”)
@SpringBootApplication
public class SpringbootIn10StepsApplication {
选项2
@ComponentScan({"com.in28minutes.springboot.basics.springbootin10steps","com.in28minutes.springboot.somethingelse"})
@SpringBootApplication
public class SpringbootIn10StepsApplication {
在非Spring Boot项目中,我们通常会在XML应用程序上下文或Java应用程序上下文中显式定义组件扫描。
####### Java应用程序上下文
选项1
@ComponentScan(“com.in28minutes)
@Configuration
public class SpringConfiguration {
选项2
@ComponentScan({"com.in28minutes.package1","com.in28minutes.package2"})
@Configuration
public class SpringConfiguration {
####### XML应用程序上下文
或特定的多个包
网址无效
服务器启动正常但是
#### No qualifying bean of type found
找不到[com.in28minutes.springboot.jpa.UserRepository]类型的限定bean,用于依赖[com.in28minutes.springboot.jpa.UserRepository]:预期至少有1个bean可以作为此依赖项的autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}
```
上述两个问题的根本原因相同 - 组件未被拾取。
你需要看三个可能的事情。您尚未添加正确的注释 - @ Controller,@ Repository或@Controller b。您尚未添加组件扫描。C。组件包中未定义组件包。
您有两个选项:1)添加注释或组件扫描2)将组件移动到已在组件扫描下的包中
@Component和@ComponentScan有什么区别?
@Component和@ComponentScan用于不同目的。
原作:Binh Thanh Nguyen
出处:http://www.springboottutorial.com/spring-boot-and-component-scan