Spring,Spring Boot和组件扫描

Spring,Spring Boot和Component Scan

 

本指南将帮助您了解Spring中最重要的概念 - 组件扫描。Spring Boot在组件扫描方面做了一些魔术。让我们理解这篇文章。

你将学习

  • 什么是组件扫描?
  • 为什么组件扫描很重要?
  • Spring Boot会自动执行组件扫描的哪些软件包?
  • 如何使用Spring Boot定义组件扫描?
  • 如何解决涉及组件扫描的问题?

 

@ComponentScan

如果你了解组件扫描,你就会理解Spring。

Spring是一个依赖注入框架。它完全是关于依赖的bean和布线。

定义Spring Beans的第一步是添加正确的注释 - @Component或@Service或@Repository。

但是,Spring不知道bean,除非它知道在哪里搜索它。

这部分“告诉Spring在哪里搜索”称为组件扫描。

您定义了必须扫描的包。

为包定义组件扫描后,Spring将搜索包及其所有子包以获取组件/ bean。

定义组件扫描

  • 如果您使用的是Spring Boot,请检查方法1中的配置。
  • 如果您在不使用Spring Boot的情况下使用方法2来执行JSP / Servlet或Spring MVC应用程序。

方法1:Spring Boot项目中的组件扫描

执行摘要

  • 如果您的其他包层次结构位于使用@SpringBootApplication批注的主应用程序下方,则隐式组件扫描将涵盖您。
  • 如果其他包中的bean /组件不是主包的子包,则应手动将它们添加为@ComponentScan

#######详细示例

考虑下面的课程:

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

在这种情况下,您需要将新包添加到组件扫描中。

两个选项

  • 定义@ComponentScan(“com.in28minutes.springboot”)
    • 这将扫描com.in28minutes.springboot的整个父树。
  • 或者使用数组定义两个特定的组件扫描。
    • @ComponentScan({“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 {

方法2:非Spring Boot项目

在非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应用程序上下文


或特定的多个包


网址无效

服务器启动正常但是

  • 我的网址无效
  • 我的登录网址无效
  • 我的todo url不工作```警告:在DispatcherServlet中找不到带有URI [/ spring-mvc / login]的HTTP请求的映射,名称为'dispatcher'警告:在DispatcherServlet中找不到带有URI [/ login]的HTTP请求的映射使用名称'dispatcher'警告:在DispatcherServlet中找不到名为'dispatcher'的带有URI [/ list-todos]的HTTP请求的映射

#### 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用于不同目的。

  • @Component表示一个类可能是创建bean的候选者。就像举手一样。
  • @ComponentScan正在搜索组件包。试图找出谁都举起手来。

原作:Binh Thanh Nguyen

出处:http://www.springboottutorial.com/spring-boot-and-component-scan

你可能感兴趣的:(Spring)