SpringBoot和普通java程序一样,需要一个类似于main方法的入口,在main方法内使用SpringApplication.run()方法启动整个springboot
该方法需要通过@SpringBootApplication方法存在而使用
@SpringBootApplication注解本质是一个整合体,实际上有关SpringBoot的注解只有三个,@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan
@SpringBootConfiguration
该注解等同于@Configuration,因为带有spring的标志,属于spring的一个配置类
SpringBoot也是Spring的一个分支应用,那么也会需要加载某个IoC容器的配置,而SpringBoot社区推荐使用的是基于JavaConfig的配置方式,所以这里的启动类注解了@SpringBootConfiguration以后,本身也就成为了一个IoC容器配置了
启动类其实可以拆解为以下情况
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Configuration{
@Bean
public Controller controller(){
return new Controller();
}
}
public class Application{
public static void main(String[] args){
SrpingApplication.run(Configuration.class,args);
}
}
@EnableAutoConfiguration
在Spring中,@Enable前缀的注解基本逻辑其实都是一脉相传,简单明了的解释就是,通过@Import的支持,收集注册相关的Bean定义,而该注解的作用则是通过@Import实现将所有满足自动配置条件的bean定义加载到容器内。
@ComponentScan
使用过Spring原生框架的其实都知道,@ComponentScan的功能是通过自动扫描并且加载符合定义的组件和bean定义,最后将他们加载到容器中。
这咋一看没什么问题,但是仔细一想好像和@EnableAutoConfiguration作用重复了
两者其实存在不少区别
1.两者的扫描范围是不同的,@ComponentScan的扫描范围默认是该注解所在的包以及子包中所有持有注解的对象,@EnableAutoConfiguration的扫描范围则只有所在类
2.如同在@EnableAutoConfiguration区所描述的,@EnableAutoConfiguration需要依赖于@Import的支持来收集与注册bean定义
在Springboot中注入的bean有两种方式组成
一部分是在代码上写了注解@Controller,@Service,@Respority等注解的业务用bean,该部分通过@ComponentScan扫描来加入到IoC容器中
另一部分则可以看做是SpringBoot自带的bean,也就是所谓的工具类Bean,而这一部分则是通过@EnableAutoConfiguration负责加入容器中
所以通过第二点就可以看出来,这两个注解并非是重复功能