官方文档中介绍了激活自动装配的方法,那就是在类上添加注解@EnableAutoConfiguration或者@SpringBootApplication
SpringBootApplication
// <version>2.3.4.RELEASE</version>
@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 {};
@AliasFor(annotation = ComponentScan.class, attribute = "nameGenerator")
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
@AliasFor(annotation = Configuration.class)
boolean proxyBeanMethods() default true;
}
@SpringBootApplication 被用于激活三个注解:
@SpringBootConfiguration // 标注配置类
@EnableAutoConfiguration //自动装配
@ComponentScan //激活Component扫描
ComponentScan并非添加了默认值,而是添加了排除的FilterType实现: TypeExcludeFilter //查找beanfactory中已注册的TypeExcludeFilter Bean,作为代理执行对象 AutoConfigurationExcludeFilter //用于排除其他同时标注@Configuration和@EnableAutoConfiguration的类 我们一般通过如下方式使用 @SpringBootApplication
@SpringBootApplication
public class RealApplication {
public static void main(String[] args) {
SpringApplication.run(RealApplication.class, args);
}
}
当我们用以上三个注解替换@SpringBootApplication时,
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class RealApplication {
public static void main(String[] args) {
SpringApplication.run(RealApplication.class, args);
}
}
效果没有变化,可以成功启动Application
再者,当我们用@SpringBootApplication标注非引导类时:
@SpringBootApplication
public class RealApplication {
}
public class TestApplication{
public static void main(String[] args) {
SpringApplication.run(RealApplication.class, args);
}
}
也可以正常启动 另外值得注意的是: 1,@Configuration,@SpringBootConfiguration,@Service,@Controller等都是Component注解派生出来的,所以可以被@ComponentScan扫描 2,@SpringBootApplication源代码中的方法都加了别名,这是用于桥接其他注解的属性
自动装配
自动配置类一般放在org.springframework.boot.autoconfigure包下,同时这些类军配置在META-INF/spring.factories下
当我们需要自定义自动配置类时只要在maven项目下resources文件夹下新建META-INF/spring.factories,并把标注@Configuration的配置类放进去即可,如