练习项目的注解和代码检查了都没有问题,原因是启动类和配置类不在同一个目录中,以下是项目目录:
查看发现启动类注解添加扫描,就顺利进入:@SpringBootApplication(scanBasePackages = “com”)
接下来详细了解下该:
@SpringBootApplication注解,默认该注解定义了Spring将自动扫描包package com.jia.staffmanagesys及其子包下的bean。
@ComponentScan、@SpringBootApplication中的scanBasePackages属性
一、@ComponentScan
创建一个配置类,在配置类JavaConfig形式上添加 @ComponentScan 注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>
@ComponentScan 的作用就是根据定义的扫描路径,把符合扫描规则的类装配到spring容器中,注解定义如下:
@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 {};
@Target({ElementType.TYPE}) 表示只可以声明在类上
value 表示用法如 @ComponentScan(value="") 也可以简写为 @ComponentScan("") ,省略value=
basePackages,表示用法如@ComponentScan(basePackages=""),由于和value等价(@AliasFor("value")),
也可简写为@ComponentScan("")
二、SpringBootApplicatioscan中的scanBasePackages属性
本质上,SpringBootApplicatioscan中的scanBasePackages属性底层原理正是复用了
@ComponentScan,因此语法和意义基本一致
public @interface SpringBootApplication {
//复用了@ComponentScan
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor标签表示别名的意义,可以理解为等价于。因此,下面2种用法相同:
@SpringBootApplication (scanBasePackages="com.jia")
public class MyClass {}
package com.jia;
@ComponentScan("com.jia")
@SpringBootApplication
public class MyClass {
}
通过上面的注解spring在启动的时候会按照相关的路径进行对@Component元素的加载。