1.4 Spring Boot启动类扫描Bean
Spring Boot默认扫描当前包下级别的包与文件,本节将详细介绍其原因。
1.4.1 @SpringBootApplication注解
@SpringBootApplication注解的目的是整合一个或多个配置类及配置信息,其内部集成的注解如下。
@ComponentScan注解帮助Spring boot扫描当前工程,让其得到相关的@Controller、@Service、@Configuration、@Component注解,并对其进行注册为Java Bean以供系统调用。
@Target注解用于设定注解的适用范围,可设置的取值及范围如表1-4所示。
表1-4 @Target注解的取值及范围
@Retention注解定义了该Annotation被保留的时间,保留时间长短不影响class的执行,因为Annotation与class在使用上是被分离的,@Retention注释的取值及释义如表1-5所示。
表1-5 @Retention注解的取值及释义
@Documented注解的作用是给类添加注释,在生成doc文档时发挥作用。
@Inherited注解表示该注解会被子类继承,但成员属性、方法并不受此注释的影响。对于类来说,子类要继承父类的注解需要该注解被@Inherited标识。对于成员属性和方法来说,非重写的都会保持和父类一样的注解,而被实现的抽象方法、被重写的方法都不会有父类的注解。
@SpringBootConfiguration注解的作用是集成相关配置文件。
@EnableAutoConfiguration注解会根据已添加的Jar依赖,对Spring容器进行默认配置。
@ComponentScan注解给Spring Boot提供扫描功能,详解参见1.4.3小节。
@Filter注解是Spring给Servlet容器中的过滤器(Filter)提供注册与实现能力的Bean。Spring Boot集成Servlet时也经常使用@ComponentScan注解,@Filter将以书写Spring Bean的方式去编写原本存在web.xml的Filter信息。@Filter注解中type取值及释义如表1-6所示。
表1-6 @Filter注解中type的取值及释义
1.4.2 @ComponentScan注解
Spring Boot默认扫描当前包下级别的包与文件,如图1-12所示的工程,因为ApplicationMain.java(启动类的名字是自定义的)启动类在com.zfx包下,而@Controller在com.zfx.controller包下,所以Spring Boot根据默认配置扫描文件并将其内的函数注册为Spring Bean,包括接下来所需的com.zfx.service、com.zfx.service.impl、com.zfx.bean、com.zfx.task等包都不会有任何扫描和注册上的问题。
如果代码在com.zhang.controller包下,因为com.zhang.controller包不在com.zfx包下,所以会报java.lang.NoSuchMethodException等找不到Bean或类名的错误。如果希望工程找到com.zhang.controller包并对其处理,就需要在启动类使用@ComponentScan注解引入com.zhang/com.zhang.controller包。com.zhang是Spring Boot默认的扫描机制与扫描地点。如果启动类在com.zhang包内,就扫描到com.zhang.controller。
为了保证Spring Boot启动类扫描整个工程所有的包,启动类必须在所有包的上一级。下面以Hello World代码为例,代码结构如图1-12所示。
图1-12
Spring Boot启动类在com.zfx包下,Spring Boot控制层在com.zfx.controller包下,所以启动类能够扫描控制层相关的代码。包括控制层在内的所有Spring相关需要扫描并注册为Bean的代码都需要在com.zfx.XXX下,否则会报相关错误。若非该结构,则在代码中进行配置,让Spring Boot去扫描其他相关位置。
1.4.3 Spring Boot扫描其他包下文件
Spring Boot默认扫描当前包下级别的包与文件,若希望Spring Boot启动类可扫描其他包下文件,可利用@ComponentScan注解或@Import注解实现。
1.@ComponentScan注解
为了让Spring Boot启动类扫描其他包下文件,可采用下述代码中@ComponentScan注解的方案。在下述代码中并没有使用@SpringBootApplication注解,但使用了其主要集成的@ComponentScan、@Configuration、@EnableAutoConfiguration三个相关注解,由@Component-Scan注解扫描,相关注册Bean仍生效。
2.@Import注解
为了让Spring Boot启动类扫描其他包下文件,可采用下述代码中@Import注解的方案。在下述代码中使用了@Import注解,用来引入其他未在ApplicationMain类以下层级的包相关可扫描的类。
以图1-13的工程结构为例,Spring Boot的启动类ApplicationMain使用@SpringBoot-Application注解扫描bean、config、controller、dao等包,但是无法扫描com.zfx2.bean和com.zfx2.bean包,所以需要使用其他相关注解扫描。
图1-13