How to scan multiple paths using the @ComponentScan annotation?

前端 未结 8 965
执笔经年
执笔经年 2020-11-29 17:38

I\'m using Spring 3.1 and bootstrapping an application using the @Configuration and @ComponentScan attributes.

The actual start is done wit

相关标签:
8条回答
  • 2020-11-29 17:41

    You can also use @ComponentScans annotation:

    @ComponentScans(value = { @ComponentScan("com.my.package.first"),
                              @ComponentScan("com.my.package.second") })
    
    0 讨论(0)
  • 2020-11-29 17:56

    You use ComponentScan to scan multiple packages using

    @ComponentScan({"com.my.package.first","com.my.package.second"})

    0 讨论(0)
  • 2020-11-29 18:00

    There is another type-safe alternative to specifying a base-package location as a String. See the API here, but I've also illustrated below:

    @ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})
    

    Using the basePackageClasses specifier with your class references will tell Spring to scan those packages (just like the mentioned alternatives), but this method is both type-safe and adds IDE support for future refactoring -- a huge plus in my book.

    Reading from the API, Spring suggests creating a no-op marker class or interface in each package you wish to scan that serves no other purpose than to be used as a reference for/by this attribute.

    IMO, I don't like the marker-classes (but then again, they are pretty much just like the package-info classes) but the type safety, IDE support, and drastically reducing the number of base packages needed to include for this scan is, with out a doubt, a far better option.

    0 讨论(0)
  • 2020-11-29 18:00

    Provide your package name separately, it requires a String[] for package names.

    Instead of this:

    @ComponentScan("com.my.package.first,com.my.package.second")
    

    Use this:

    @ComponentScan({"com.my.package.first","com.my.package.second"})
    
    0 讨论(0)
  • 2020-11-29 18:01

    Another way of doing this is using the basePackages field; which is a field inside ComponentScan annotation.

    @ComponentScan(basePackages={"com.firstpackage","com.secondpackage"})
    

    If you look into the ComponentScan annotation .class from the jar file you will see a basePackages field that takes in an array of Strings

    public @interface ComponentScan {
    String[] basePackages() default {};
    }
    

    Or you can mention the classes explicitly. Which takes in array of classes

    Class<?>[]  basePackageClasses
    
    0 讨论(0)
  • 2020-11-29 18:02

    @ComponentScan uses string array, like this:

    @ComponentScan({"com.my.package.first","com.my.package.second"})
    

    When you provide multiple package names in only one string, Spring interprets this as one package name, and thus can't find it.

    0 讨论(0)
提交回复
热议问题