1. 作用

创建一个配置类,在配置类JavaConfig形式上添加 @ComponentScan 注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>

参见 《JavaConfig、@Configuration、@ComponentScan入门例子》

2. @ComponentScan源码

@ComponentScan 的作用就是根据定义的扫描路径,把符合扫描规则的类装配到spring容器中,注解定义如下:

package org.springframework.context.annotation;
@Retention(RetentionPolicy.RUNTIME)
//表示只可以声明在类上
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
    @AliasFor("basePackages")
    String[] value() default {};
    @AliasFor("value") //表示和value等价
    String[] basePackages() default {};
    Class<?>[] basePackageClasses() default {};
    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
  • @Target({ElementType.TYPE}) 表示只可以声明在类上

  • value 表示用法如 @ComponentScan(value="")
    也可以简写为 @ComponentScan("") ,省略value=

  • basePackages,表示用法如@ComponentScan(basePackages=""),由于和value等价(@AliasFor("value")),也可简写为@ComponentScan("")

  • nameGenerator: bean的名称的生成器

  • useDefaultFilters: 是否开启对@Component,@Repository,@Service,@Controller的类进行检测

  • includeFilters: 包含的过滤条件

    • FilterType.ANNOTATION:按照注解过滤

    • FilterType.ASSIGNABLE_TYPE:按照给定的类型

    • FilterType.ASPECTJ:使用ASPECTJ表达式

    • FilterType.REGEX:正则

    • FilterType.CUSTOM:自定义规则

  • excludeFilters: 排除的过滤条件,用法和includeFilters一样

一个稍完整的示例:

// com.jiaobuchong.business 和 com.jiaobuchong.user.servic 下的类都不会被扫描
@ComponentScan(basePackages = {"com.jiaobuchong.order.service"},
        excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX,
                pattern = "com.jiaobuchong.business\\..*"),
                @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.jiaobuchong.user.service\\..*")})

3. SpringBootApplicatioscan中的scanBasePackages属性

本质上,SpringBootApplicatioscan中的scanBasePackages属性底层原理正是复用了@ComponentScan,因此语法和意义基本一致

...
public @interface SpringBootApplication {
   //复用了@ComponentScan
    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    String[] scanBasePackages() default {};

@AliasFor标签表示别名的意义,可以理解为等价于

因此,下面2种用法相同:

@SpringBootApplication (scanBasePackages="com.test")
public class MyClass {
package com.test;
@ComponentScan("com.test")
@SpringBootApplication
public class MyClass {

4. 注意事项

4.1 Spring Boot项目

当使用Spring Boot项目时,可以不指定加载路径,即不使用@ComponentScan或@SpringBootApplication (scanBasePackages="com.test"),默认会加载MyClass所在的包

举个例子,看下面定义的类:

package com.test;
@SpringBootApplication
public class MyClass {

MyClass 的package为com.test,这个类使用了@SpringBootApplication注解,该注解定义了Spring将自动扫描包com.test及其子包下的bean。

如果你项目中所有的类都定义在com.demo.springboot包及其子包下,那你不需要做任何事。

但假如你一个类定义在包com.test2下,则你需要将这个新包也纳入扫描的范围,有两个方案可以达到这个目的:

  • 方案1, 定义@CoponentScan(“com”)

    这么做扫描的范围扩大到整个父包com

  • 方案2, 定义分别扫描两个包
    @ComponentScan({“com.test”,”com.test2”})

4.2 非 Spring Boot项目

在非Spring Boot项目中,我们必须显式地使用@ComponentScan注解定义被扫描的包,可以通过XML文件在应用上下文中定义或在Java代码中对应用上下文定义,否则会加载不到预期的bean。

参考:
《@ComponentScan 详解》 列出了具体参数的用法

《Spring注解——使用@ComponentScan自动扫描组件》 包含讲解和例子
《Spring和SpringBoot中的@Component 和@ComponentScan注解用法介绍和注意事项》

文章目录https://www.jianshu.com/p/64aac6461d5bhttps://blog.csdn.net/neulily2005/article/details/83750027
1.1 简述 在Spring Boot中注解@ConfigurationProperties有三种使用场景,而通常情况下我们使用的最多的只是其中的一种场景。本篇文章带大家了解一下三种场景的使用情况。 1.2 场景一 使用@ConfigurationProperties和@Component注解到bean定义类上,这里@Component代指同一类实例化Bean的注解。 1.3 场景二 使用@ConfigurationProperties和@Bean注解在配置类的Bean定义方法上。以数据源配置为例: 使用@ConfigurationProperties注解到普通类,然后再通过@EnableConfigurationPropertiesz注解到启动类中定义为Bean。 这里User对象并没有使用@Component相关注解。 @EnableConfigurationProperties 关于@EnableConfigurationProperties注解的使用: @EnableConfigurationProperties的作用是把springboot配置文件中的值与我们的xxxPr
都是springboot工程,jar包里有有些类带了spring的注解,系统能被加载到spring中。 之前也这样用过,没有发现什么问题,这次发现pom引用了,程序中编译也没有问题,但是springboot启动以后不加载。jar中的bean。 最后找到了问题的根本原因: SpringBootApplication启动时会默认扫描主类当前包及子包,...
对于springboot来说,它会把当前应用程序所在的包装载到ioc容器里,让使用者可以直接Autowired注入它们,一般的项目结果是这样的,这个项目包下有main方法,它将会把nacosdemo这个包里面所有的bean都扫描出来,然后在程序启动时,nacosdemo里的bean就会被自动注册了。 目前我们做一个测试,在nacosdemo包外层再建立一个包common,在里面写个组件,然后在nacosdemo里去使用它,整个项目结构如下 这时,项目启动后,是无法加载到你的bean的,因为它不会被扫描到
最近想把对安全的了解写成一个对单独的spring 项目,提供spring cloud 项目方便引入一下就可以使用 但是在写到spring security browser的测试时无法引用到此包中的代码 研究了几天找了几种方法多不 package com.b2b2c.developer_center; import org.springframewor...
此资源为trustie帮助文档。 Trustie(Trustworthy software tools and integration environment)是一个国家软件资源共享与协同生产环境,支持大规模网络化可信软件生产。 Trustie的综合软件社区服务集软件协同开发、软件资源共享、软件可信评估于一体,其协同开发平台、软件资源库等核心设施及部分工具已经开源,其软件证据积累与评估设施将形成重要软件演化数据。 Trustie环境得到国家863重点项目“高可信软件生产工具及集成环境”支持,旨在研究和突破高可信软件生产的关键性技术,研制软件开发系列工具、平台与集成环境。 Trustie的核心部件包括5个部分,综合软件社区门户、软件开发协同平台、软件资源库与可信证据管理、软件可信生产工具集、软件生产线集成框架及若干生产线系统。
带@SpringBootApplication注解的类即为主程序 @SpringBootApplication public class WebApplication {...} 此注解默认扫描主程序所在的包以及所有子包内的组件。 如果需要改变扫描路径,带上参数scanBasePackages则会扫描指定路径 @SpringBootApplication(scanBasePackages={"com.test"}) public class WebApplication {...}
1.首先来看一下启动类都包含的内容再来一一解释。 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }, scanBasePackages = { "com.hskc.base.*", "com.hskc.tools.*", "com.integration.security.*" })
@SpringBootApplication(scanBasePackages = “???”) 如果扫包错误会提示各种找不到bean的错误,spring无法启动检查方法 每一个类前面要有一个这样的圆圈才是正确装了bean
1.SpringBootApplication启动时会默认扫描主类当前包及子包,如果需要扫描主类当前包外的其他包或不扫描当前包下的特定包或类,可通过下列属性实现:Class<?>[] exclude() default {}; String[] excludeName() default {}; String[] scanBasePackages() default {}; Class<?>[] s
(开发环境:OPENCV3.3+VS2017)快速压缩跟踪算法实现。 目前比较主流的跟踪算法有两种,generative tracking algorithms(生成跟踪算法)和discriminative algorithms(判别跟踪算法)。 生成跟踪算法,顾名思义边生成边跟踪。即对这一帧的样本进行学习,将学习的结果作为下一帧的分类器,达到边学习跟踪,边跟踪边学习的效果。这种跟踪算法的缺点是在视频的前几帧,样本量较少,因此大部分的算法要求视频中目标在视频的前面变化不大。如果目标变化较大,会产生漂移现象。