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和启动类的父级目录,下面启动项目并发送请求看下结果

(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所以有很多写的可能不太完善或者存在错误,入过存在错误的话还请指正

    在很长的一段时间我变的颓废混日子,甚至忘了当初选择这个行业的初衷,总是喜欢抱怨种种得不公,我希望以后的日子我能找回那个努力的自己,没有人愿意平平淡淡,碌碌无为过一生,不求无愧于他人,但求无愧于自己,也希望每个在这个行业里为之坚持的伙伴我们都能无愧于自己,成为那个想象中的自己。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM