springboot自动装配

153 阅读1分钟

官方文档中介绍了激活自动装配的方法,那就是在类上添加注解@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的配置类放进去即可,如 在这里插入图片描述