@SpringBootApplication中有以下注解:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
其中前四个为源注解,修饰注解的注解,不用看
其中@EnableAutoConfiguration底层封装了@Imporrt注解
其中指定的是ImportSelector的实现类,这个实现类当中就实现了ImportSelector中的一个方法
返回值为String类型的数组,这个数组封装的就是我要导入SpringIOC容器中的类的全类名,
在这个方法加载了两个文件,如下:
到Spring3.X版本之后,spring.factoies这个文件就会被彻底的移除掉,所以我们要导入的配置类直接定义在第一个文件中,这个文件定义配置类的全类名,就可以通过@Bean注解来声明一个一个的Bean对象,最终,SpringBoot项目在启动时,就会加载这个配置文件中的配置类,将这些配置类的信息封装到String类型的数组中,最终通过Import这个注解,将这些配置类全部加载到Spring的IOC容器当中,并不是全部注册为IOC容器中的Bean,而会根据@Conditional注解条件装配
在自动配置类中,在声明Bean时:
方法上加了Bean注解以外,还加了Conditional开头的这类注解,就是条件装配的注解
@Bean //@ConditionalOnClass(name = "io.jsonwebtoken.Jwts")//环境中指定存在这个类,才会将该Bean加入IOC容器中 //@ConditionalOnMissingBean//不存在HeaderParser类型的Bean,才会将该Bean加入IOC容器中--指定类型(value)或者名称(name属性) @ConditionalOnProperty(name = "name",havingValue = "itheima")//配置文件中存在指定的属性与值,才会将该Bean加入到IOC容器中 public HeaderParser headerParser(){ return new HeaderParser(); }