springboot注解配置扫描路径?

Spring Boot 最核心的 25 个注解,都是干货!

Spring Boot 最核心的 25 个注解

1、@SpringBootApplication

这是 Spring Boot 最最最核心的注解,用在 Spring Boot 主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。

其实这个注解就是 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 这三个注解的组合,也可以用这三个注解来代替 @SpringBootApplication 注解。

2、@EnableAutoConfiguration

允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置 Spring Bean。

如:当前类路径下有 Mybatis 这个 JAR 包,MybatisAutoConfiguration 注解就能根据相关参数来配置 Mybatis 的各个 Spring Bean。

3、@Configuration

这是 Spring 3.0 添加的一个注解,用来代替 applicationContext.xml 配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在类来进行注册。

4、@SpringBootConfiguration

这个注解就是 @Configuration 注解的变体,只是用来修饰是 Spring Boot 配置而已,或者可利于 Spring Boot 后续的扩展。

5、@ComponentScan

这是 Spring 3.1 添加的一个注解,用来代替配置文件中的 component-scan 配置,开启组件扫描,即自动扫描包路径下的 @Component 注解进行注册 bean 实例到 context 中。

前面 5 个注解可以在这篇文章《Spring Boot 最核心的 3 个注解详解》中了解更多细节的。

6、@Conditional

这是 Spring 4.0 添加的新注解,用来标识一个 Spring Bean 或者 Configuration 配置文件,当满足指定的条件才开启配置。

7、@ConditionalOnBean

组合 @Conditional 注解,当容器中有指定的 Bean 才开启配置。

8、@ConditionalOnMissingBean

组合 @Conditional 注解,和 @ConditionalOnBean 注解相反,当容器中没有指定的 Bean 才开启配置。

9、@ConditionalOnClass

组合 @Conditional 注解,当容器中有指定的 Class 才开启配置。

10、@ConditionalOnMissingClass

组合 @Conditional 注解,和 @ConditionalOnMissingClass 注解相反,当容器中没有指定的 Class 才开启配置。

11、@ConditionalOnWebApplication

组合 @Conditional 注解,当前项目类型是 WEB 项目才开启配置。

当前项目有以下 3 种类型。

enum Type {

}

12、@ConditionalOnNotWebApplication

组合 @Conditional 注解,和 @ConditionalOnWebApplication 注解相反,当前项目类型不是 WEB 项目才开启配置。

13、@ConditionalOnProperty

组合 @Conditional 注解,当指定的属性有指定的值时才开启配置。

14、@ConditionalOnExpression

组合 @Conditional 注解,当 SpEL 表达式为 true 时才开启配置。

15、@ConditionalOnJava

组合 @Conditional 注解,当运行的 Java JVM 在指定的版本范围时才开启配置。

16、@ConditionalOnResource

组合 @Conditional 注解,当类路径下有指定的资源才开启配置。

17、@ConditionalOnJndi

组合 @Conditional 注解,当指定的 JNDI 存在时才开启配置。

18、@ConditionalOnCloudPlatform

组合 @Conditional 注解,当指定的云平台激活时才开启配置。

19、@ConditionalOnSingleCandidate

组合 @Conditional 注解,当指定的 class 在容器中只有一个 Bean,或者同时有多个但为首选时才开启配置。

20、@ConfigurationProperties

用来加载额外的配置(如 .properties 文件),可用在 @Configuration 注解类,或者 @Bean 注解方法上面。

21、@EnableConfigurationProperties

一般要配合 @ConfigurationProperties 注解使用,用来开启对 @ConfigurationProperties 注解配置 Bean 的支持。

22、@AutoConfigureAfter

用在自动配置类上面,表示该自动配置类需要在另外指定的自动配置类配置完之后。

如 Mybatis 的自动配置类,需要在数据源自动配置类之后。

23、@AutoConfigureBefore

这个和 @AutoConfigureAfter 注解使用相反,表示该自动配置类需要在另外指定的自动配置类配置之前。

24、@Import

这是 Spring 3.0 添加的新注解,用来导入一个或者多个 @Configuration 注解修饰的类,这在 Spring Boot 里面应用很多。

25、@ImportResource

这是 Spring 3.0 添加的新注解,用来导入一个或者多个 Spring 配置文件,这对 Spring Boot 兼容老项目非常有用,因为有些配置无法通过 Java Config 的形式来配置就只能用这个注解来导入。

欢迎Java工程师朋友们加入Java高并发: 957734884 ,群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

SpringBoot注解介绍

1、@ComponentScan:

新建SpringBoot项目时 会自动生成一个入口类 命名规则是项目名+Application 该类上面有个@SpringBootApplication 项目启动时系统会自动扫描这个类的同级以及下级目录 将需要的对象注入到IOC容器 在需要时通过DI(依赖注入)注入到需要的对象中 那么问题来了 程序是怎么确定需要扫描哪些包呢 这是因为在@SpringBootApplication中有个注解 如图:

通过该注解上的配置 才能准确定位需要扫描哪些包 。

由此我们可以进行延伸 如果我们需要臊面的资源不再该类的同级或者下级 我们只需要在项目入口类上配置上@ComponentScan("资源路径")

就可以将我们需要的外部(其他路径)资源加载到IOC容器中了

2、@Qualifier("byname") 通过name名 注入

3、@Primary 对于同一个类型下有多个实现 该注解可以标明哪个实现类是优先被注入的 如图:

此时会优先注入带有@Primary注解的bean 如下图:

4、@ConditionalOnProperty 该注解可以读取配置文件 根据配置文件的值来决定是否将bean注入到容器中

    该注解中的三个参数:value 值为配置文件中配置项的名字 havingValue为值  matchIfMissing 的值为true和false 时针对没有配置项的情况下时是否注入

5、

@Getter lombok为实体类自动生成getter方法

@Setter lombok为实体类自动生成setter方法

@AllArgsConstructor  lombok为实体类自动生成全参数构造方法

@NoArgsConstructor  lombok为实体类自动生成无参数构造方法

@RequiredArgsConstructor lombok为实体类自动生成成员变量非空的参数构造方法

@NonNull lombok为实体类指定参数非空

实体类.builder().name("muse").age(18).build()可以替换之前的setter方法赋值 不过需要在实体类上增加@Builder注解

但是一旦使用@Builder 就无法通过构造方法去实例化bean 因为@Builder会生成一个私有的构造方法 如果想使用构造方法实例化 可以配合使用NoArgsConstructor  或者手动新增一个无参构造

springbootrun方法什么时候扫描的配置类

SpringBootRun方法会在应用启动时扫描配置类。SpringBootRun方法是一个静态方法,它可以接受一个参数,该参数是一个字符串数组,其中包含要传递给应用程序的参数。SpringBootRun方法会调用SpringApplication类的run方法,该方法会接受一个参数,该参数是一个配置类,它包含了应用程序所需的所有配置信息。在调用run方法之后,SpringBootRun方法会扫描该配置类,以确定应用程序需要加载哪些组件。一旦所有组件都被加载,应用程序就可以正常运行了。

springboot注解配置扫描路径?  第1张

Spring Boot是如何扫描和加载bean的

从SpringApplication#refreshContext方法开始追踪,找到

AbstractApplicationContext#invokeBeanFactoryPostProcessors方法,继续深入找到ConfigurationClassParser#doProcessConfigurationClass方法,就是从这里开始,根据ComponentScan配置的路径去加载需要spring管理的类。下面详细讲讲加载过程:

第一步,根据ComponentScan配置的路径去查找所有class文件,具体的方法在PathMatchingResourcePatternResolver#doRetrieveMatchingFiles,目的是扫描路径下每一个目录里的class文件。

第二步,过滤出使用了@Component注解的类,具体的方法在ClassPathScanningCandidateComponentProvider#scanCandidateComponents。

第三步,将第二步筛选出来的注册到bean工厂的注册表缓存中,具体的方法在ClassPathBeanDefinitionScanner#doScan

第四步,加载类里面的@Bean注解信息,并存放在配置缓存configurationClasses中,具体的方法在ConfigurationClassParser#processConfigurationClass

第五步,将第四步加载的@Bean信息注册到bean工厂的注册表缓存里,具体方法在

ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForBeanMethod

第六步,在refreshContext方法里有个finishBeanFactoryInitialization方法,在里面找到DefaultListableBeanFactory#preInstantiateSingletons方法,这里bean工厂将所有注册的bean都生成了实例。

bean工厂生成bean实例的步骤可以参考下面的文章

Spring Bean的生命周期:

SpringBoot 获取扫描包路径

其中 AnnotationMetadata metadata 是最初的 @SpringBootApplication 标签,故 new PackageImport(metadata).getPackageName() 就可获得 @SpringBootApplication 标签所在的包路径。

总结 :SpringBoot会将 当前启动类所在包 下面的所有组件扫描到容器中。

springboot配置文件注解

springboot使用一个全局配置文件,配置文件的名字是固定的:

application.properties或application.yml

@ConfigurationProperties: 将 全局配置文件 的属性值,映射到SpringBoot 组件 上

@Value: 从 全局配置文件 中读取属性,映射到组件上

@PropertySource: 加载指定的配置文件。可以配合 @Value 和 @ConfigurationProperties 使用。默认只能加载XML文件,若需要加载yml文件需要实现 DefaultPropertySourceFactory 的 createPropertySource() 方法,并在注解中声明。spring boot 中 yml 、yaml 对应的加载类为 YamlPropertySourceLoader .

@ImportResource: 加载自定义的Spring XML 配置文件

SpringBoot不推荐使用这种方式,推荐使用全注解(JavaConfig)的方式。

SpringBoot会扫描当前包和所有子包的注解配置到容器中。

以上内容为新媒号(sinv.com.cn)为大家提供!新媒号,坚持更新大家所需的互联网后端知识。希望您喜欢!

版权申明:新媒号所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请发送邮件至 k2#88.com(替换@) 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023-09-23 13:57
下一篇 2023-09-23 13:57

相关推荐

发表回复

登录后才能评论