SpringBoot入口类为什么要放在代码根目录下

SpringBoot入口类为什么要放在代码根目录下

这片文章中会找到你想要的答案。

*看一个SpringBoot入口类

package com.example.multithread;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MultithreadApplication {

	public static void main(String[] args) {
		SpringApplication.run(MultithreadApplication.class, args);
	}

}

*耀眼的@SpringBootApplication注解

在这里插入图片描述

*它继承了哪些注解

(加在它之上的注解)

1-首先是四个元注解

@Target(ElementType.TYPE)

标志该注解可以作用于interface、class、enum。

@Retention(RetentionPolicy.RUNTIME)

注解的保留策略;

这里的策略是:
当前注解会出现在.class字节码文件中,
并且在运行的时候可以通过反射被获得。

@Documented

标志该注解可以被javadoc工具所引用。

@Inherited

标志该注解可以被继承。

2-@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan

@SpringBootApplication相当于是这三个注解的组合,
我们主要说一下这三个。

*@SpringBootConfiguration

在这里插入图片描述
可以看到它继承了@Configuration;
Spring3.0开始增加了@Configuration、@Bean注解,
支持通过Java类(JavaConfig)的形式进行更直观的配置。

例如:

@Bean
public HttpMessageConverters fastjsonHttpMessageConverter(){
	//定义消息转换对象
	FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

	HttpMessageConverter<?> converter = fastConverter;

	return new HttpMessageConverters(converter);
}

*@ComponentScan

@ComponentScan与@Component这一类的注解配合使用,
相当于以前xml配置中开启自动扫描的context:component-scan标签,
可以配置Spring的扫描范围、Bean的ID命名策略等属性;

默认扫描范围为当前目录下的所有class,
这也是SpringBoot入口类要放在代码根目录的原因。

*@EnableAutoConfiguration

需要注意一下这个@Import(AutoConfigurationImportSelector.class)
在这里插入图片描述
@ComponentScan会扫描并装配代码根目录下的,
所有的带@Component注解的class;
但是SpringBoot如何加载代码根目录之外的Bean
比方说classpath下maven依赖中的;
这个时候就需要了解一下META-INF/spring.factories文件的作用了。

1-META-INF/spring.factories

META-INF/spring.factories存在于某些依赖的jar包中
在这里插入图片描述
它里面有一个属性:EnableAutoConfiguration。

2-EnableAutoConfiguration

在这里插入图片描述
它用来记录jar包中需要注册到容器中的Bean的qualified name,
这样可以通过反射获取到对应的class,
然后前边@Import中的AutoConfigurationImportSelector.class就该工作了。

3-AutoConfigurationImportSelector

它里边有一个方法:
getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes),
作用是加载这些定义在spring.factories中的Bean。
在这里插入图片描述

不当之处,还请指正!

参考资料:

小亮89通过META-INF/spring.factories获取对应的class的全限定名称
小丑quan建立META-INF/spring.factories文件的意义何在
SingleShu888java注解-ElementType详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值