1,依赖父工程起步
进入spring-boot-starter-parent中
可以看见并没有jar包的依赖,进入此工程的父工程
可以看见这个工程中有大量的依赖,所以可以得出结论:
起步依赖的作用就是进行依赖的传递。
2,web起步包
并不是所有的jar包都依赖,所以要创建web工程需要自己写依赖。进入spring-boot-starter-web中
可以看出spring-boot-starter-web已经提前依赖了关于web工程所需要的jar包了。
3,自动配置原理解析
通过applicationContext.getBeanDefinitionNames();方法返回所有容器中的对象。
进入MySpringBootApplication上的注解@SpringBootApplication中
@SpringBootApplication
public class application {
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(application.class, args);
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String name:beanDefinitionNames){
System.out.println(name);
}
}
}
注解@SpringBootApplication的源码
@SpringBootApplication封装spring注解的复合注解,包含@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default {};
@AliasFor(annotation = EnableAutoConfiguration.class)
String[] excludeName() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};
}
3.1 @ComponentScan注解,等同于我们在ssm框架中配置在xml文件的
<context:component-scan base-package="xxx.xxx.xxx"></context:component-scan>
componentScan 扫描当前包及其子包下被 @Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理,所以这个注解会自动注入所有在主程序所在包下的组件。默认把当前启动类所在的包作为扫描包的起点。
3.2 @SpringBootConfiguration : 表示当前类具有配置类的作用.
3.3 @EnableAutoConfiguration:自动配置:根据当前引入的依赖包,猜测需要创建的工程类型,以及工程中有可能创建的对象,根据猜测自动创建工程所需的相关实例bean
程序启动,会自动加载扫描所有 classpath:/META-INF/spring.factories文件 ,并且创建对应实例
spring.factories中有大量的很多以configuration结尾的类名称:例如加载DispatchServlet
结论:上面配置文件存在大量的以 Configuration 为结尾的类名称,这些类就是存有自动配置信息的类,而SpringApplication 在获取这些类名后再加载。