@SpringBootApplication中的注解

329 阅读3分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

对@SpringBootApplication中的注解的认识

@SpringBootApplication:指示一个配置类,该类声明一个或多个@Bean方法,并触发自动配置和组件扫描,相当于声明@Configuration、@EnableAutoConfiguration和@ComponentScan

SpringbootApplication注解有如下,做一一的分析: image.png

  • @Target(ElementType.TYPE):指示适用注释类型的上下文(即注解的作用目标)这里是接口、类、枚举、注解

  • @Retention(RetentionPolicy.RUNTIME):指示具有注释类型的注释要保留多长时间,这里注解是将被JVM保 留,所以在运行时被JVM或其他使用反射机制的代码所读取和使用

  • @Documented 指示默认情况下,带有类型的注释将由javadoc和类似工具记录

  • @Inherited 指示自动继承注释类型(即子类可以继承父类)

接下来的三个注解是@SpringBootApplication的核心

  • @SpringBootConfiguration

官方解释:指示一个类提供Spring Boot应用程序@Configuration。可以用作Spring的标准@Configuration注释的替代,以便可以自动找到配置(例如在测试中)。

应用程序应该只包含一个@SpringBootConfiguration,大多数惯用的SpringBoot应用程序将从 @SpringBootApplication继承它。(简单理解:@SpringBootConfiguration他其实就是标识一个配置类,在spring中@Configuration来标识一个注释类,而在springboot中就用@SpringBootConfiguration作为了替代 点进它的源码发现 它有@Configuration注解,可以理解就是继承了@Configuration)

  • @EnableAutoConfiguration: 自动配置,尝试猜测和配置您可能需要的bean

image.png @import 导入的一个或多个@Configuration类,允许导入@Configuration类,ImportSelector和importbeandefinitionregistry实现,以及常规组件类,类似于AnnotationConfigApplicationContext.register,应该使用@Autowired注入来访问在导入的@Configuration类中声明的@Bean定义 (通俗理解就是把符合条件的类加载到IOC容器中)

  • @ComponentScan

image.png 可以指定basepackagclasses或basePackages来定义要扫描的特定类或者包,假设不指定,从声明该注释的类的包中进行扫描()

一般我们的启动类都是放在和服务层,控制层同一层级(即同一个包下),只要在启动类加了@SpringBootApplication注解,其中的@ComponentScan注解默认会扫描该注释的类同一个包下的所有,如图:则会扫描resume包下的所有

image.png

进一步?若存在多模块的调用,比如为了减少代码的冗余,我新建一个模块是放一些公共使用的类,例如统一拦截处理controller层的抛出的异常,对controller层返回的数据做统一处理,若每写一个模块就要写一次这个代码 就会重复,那单独成一个公共模块 应该怎么实现呢? @SpringBootApplication注解中的@ComponentScan只扫描他所在包的所有,那就需要把@ComponentScan单独的进行注解,此时外面的注解就会覆盖@SpringBootApplication注解中的@ComponentScan 把@ComponentScan单独出来 就会灵活许多

如下图:wxresume模块向使用publicapi模块的UnifiedAdivice统一处理controller层返回的数据,则是就需要在启动wxresume模块时 把publicapi模块中的Response包下的类扫描进去

image.png

如何扫描进去?在wxresume模块的启动类中加@ComponentScan注解 如图下:

@EnableEurekaClient
@MapperScan("com.flscode.resume.mapper")
@ComponentScan({"com.flscode.publicapi.Response","com.flscode.resume"})
@SpringBootApplication
public class WxresumeApplication {
    public static void main(String[] args) {
        SpringApplication.run(WxresumeApplication.class,args);
    }
}

这里要注意,在使用@ComponentScan注解时 一定要扫描自己所在的com.flscode.resume这个包,因为这个注解会覆盖springbootApplication中的componentScan 这样 就可以将一些公用的数据放进公共模块 若那一个模块需要使用 则需要将其扫描进去即可,这样减少了代码的冗余 提高开发效率