springboot的诞生是为了简化spring应用的初始搭建以及开发功能,该框架使用特定的方式进行配置,从而大大节省了开发人员的配置工作。但是springboot这种免配置的特性是如何实现的?这在面试经常问到,遇到了不少次,挨了不少枪子,所以定下心来撸撸这一块。。。。。开始
一个springBoot项目,大家都知道必须存在一个启动类,这个启动类是所有一切的开始
先看一下@SpringBootApplication这个注解
由上图可知@SpringbootApplication的功能是@Configu'ration,@EnableAutoConfiguration.@ComponentScan三个注解的合体
@Configuration
标注在类上,表明该类作为spring的xml配置文件中的<beans>,配置spring容器上下文ApplicationContext。
@Beab注解标注在方法上,注册对象返回某个实例。相当于xml配置文件中一个个<bean>
1、@Bean注解在返回实例的方法上,如果未通过@Bean指定bean的名称,默认与方法名一致、
2、@Bean注解默认作用域为单例singleton作用于,可以通过@Scope("prototype")设置作用域
3、@Bean的作用是注册对象,那么完全可以使用@Component,@Controller,@Service,@Repository等注解注册bean
@ComponentScan
这个注解在spring中很重要,它的功能其实就是自动扫描并加载符合条件的组件(比如@Component,@Bean)最终将这些bean定义加载到IOC容器中
我们可以通过basePackages等属性来细粒度的定制其扫描范围,如果不制定则默从声明了@ComponentScan所在类的package(包)下进行扫描。所以一般启动类最好放在根目录下
@EnableAutoConfiguration
springboot框架神奇之处便是在于该注解,可以自动载入应用程序所需的所有bean,这依赖于springboot在类路径中查找
@AutoConfigurationPackage:自动配置包
@Import:导入自动配置的组件
@EnableAutoConfiguration自动配置简单的来说是从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中的对应的配置项通过反射实例化为对应的标注@Configuration的形式容器配置类,然后汇总为一个并加载到IOC容器