SpringBoot(⼀)SpringBootApplication注解详解
@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和启动类的⽗级⽬录,下⾯启动项⽬并发送请求看下结果
springboot结构(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所以有很多写的可能不太完善或者存在错误,⼊过存在错误的话还请指正
在很长的⼀段时间我变的颓废混⽇⼦,甚⾄忘了当初选择这个⾏业的初衷,总是喜欢抱怨种种得不公,我希望以后的⽇⼦我能回那个努⼒的⾃⼰,没有⼈愿意平平淡淡,碌碌⽆为过⼀⽣,不求⽆愧于他⼈,但求⽆愧于⾃⼰,也希望每个在这个⾏业⾥为之坚持的伙伴我们都能⽆愧于⾃⼰,成为那个
想象中的⾃⼰。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论