@SpringBootApplication
SpringBootApplication注解我们肯定不会陌生,在配置SpringBoot的启动类时就会用到这个注解,下面就说一下SpringBootApplication注解的详细作用
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
打开SpringBootApplication注解我们可以看到在注解下包含以上三个注解,那么简单说明下以上三个注解的具体作用
1.@Configuration: 用于定义一个配置类
2.@EnableAutoConfiguration :Spring Boot会自动根据你jar包的依赖来自动配置项目。
3.@ComponentScan: 告诉Spring 哪个packages 的用注解标识的类 会被spring自动扫描并且装入bean容器。
在我们初学SpringBoot的时候我们可能都会遇到一个问题,就是定义了一个请求,但是SpringBoot并没有装配成功,导致请求失败
代码如下
(1) 启动类代码:
@SpringBootApplication @ComponentScan public class HelloWorldMainApplication { public static void main(String[] args) { SpringApplication.run(HelloWorldMainApplication.class, args); } }
(2)请求1代码
@Controller public class HelloController { @ResponseBody @RequestMapping("/hello") public String Hello(){ return "Hello World"; } }
(2)请求2代码
@Controller public class TestController { @ResponseBody @RequestMapping("/test") public String Test(){ return "Hello Test"; } }
(3)目录结构
从上图的目录结构我们可以看到请求1HelloController所在的目录是跟HelloWorldMainApplication启动类属于同级目录,而请求2TestController所在目录是com包下也就是请求1和启动类的父级目录,下面启动项目并发送请求看下结果
(4)控制台
(5)请求1
(6)请求2
其实从控制台我们就可以看到hello请求是被Spring扫描到而test请求并没有被扫描到,所以test请求肯定会出现404请求失败这种结果,那么SpringBoot为什么只能扫描同级目录和子集目录呢?如果我们想扫描指定目录下的文件该怎么做,看下图
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { register(registry, new PackageImport(metadata).getPackageName()); }
这段代码就是SpringBoot在启动类中默认扫描包路径的配置,所在路径(点击@SpringBootApplication注解---点击@EnableAutoConfiguration注解---点击@AutoConfigurationPackage---点击@Import(AutoConfigurationPackages.Registrar.class)),其实看到这个方法名我们应该不会感到陌生,因为Spring载入IOC容器的方法不就是BeanDefinition么,SpringBoot是基于Spring的所以这点就不难理解了
从上图我们可以看到所得到的值是com.main也就可以说明为什么@SpringBootApplication默认扫描同级以及子级目录,而test请求在父级目录所以扫描不到请求自然会出现404的错误,那么如何扫描指定目录的包呢?看下面代码
@ComponentScan(basePackages = {"com"})
@SpringBootApplication(scanBasePackages = {"com"})
这俩种方式都可以扫描指定目录下的包,多个包用逗号分隔即可。其实只是一个简单的请求例子我们就可以看到SpringBoot相比于Spring为我们简化了很多配置,比如我们之前配置多个bean我们需要在xml中配置<beans> <bean id="xxx" class="xxx"/> </beans> 扫描包<compenent-scan>等等,其实SpringBootApplication注解就相当于spring配置文件中的上下文对象<beans>
由于博主也是刚刚才自学SpringBoot所以有很多写的可能不太完善或者存在错误,入过存在错误的话还请指正
在很长的一段时间我变的颓废混日子,甚至忘了当初选择这个行业的初衷,总是喜欢抱怨种种得不公,我希望以后的日子我能找回那个努力的自己,没有人愿意平平淡淡,碌碌无为过一生,不求无愧于他人,但求无愧于自己,也希望每个在这个行业里为之坚持的伙伴我们都能无愧于自己,成为那个想象中的自己。