SpringBoot中的自动装配 @SpringBootApplication

目录

1. 简述

2. 读@SpringBootApplication

2.1 @ComponentScan

2.2 @SpringBootConfiguration

2.3 @EnableAutoConfiguration

2.3.1 @AutoConfigurationPackage

2.3.2  AutoConfigurationImportSelector.class

2.3.3 spring.factories .xml

3. 流程概述

4. 自我理解


1. 简述

        SpringBoot的自动装配我的理解就是SpringBoot会帮我们配置一些配置,替代我们在ssm中在Spring配置文件中以及在web.xml中配的一些配置,例如DispatcherServlet,连接池,mybatis.....


2. 读@SpringBootApplication

        说到自动配置就需要看SpringBoot主启动类,该类在我们创建好项目之后就会自动生成。

        下面我们来分析启动类的注解@SpringBootApplication。


@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}
)}
)

        @SpringBootApplication:表示该类是SpringBoot的主配置类,运行项目也应该从该位置的main方法开始运行。

        SpringBootApplication其中的三个主要注解:

        @ComponentScan @SpringBootConfiguration @EnableAutoConfiguration

2.1 @ComponentScan

        @ComponentScan:自动扫描符合条件的组件或者bean,并将这些bean加载到Spring容器中。

2.2 @SpringBootConfiguration


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

        @SpringBootConfiguration:SpringBoot配置注解,表明该类是Spring的配置类

        其内部除了jdk的几个注解外,主要就是@Configuration注解。

        @Configuration:该注解表明该类是一个配置类,类似于xml配置文件,在改注解内就只有一个@Component。

        @Component:表明该类是一个能被Spring扫描的组件。这个都很熟悉了ssm中也经常会用到。

        分析:所以整的来看@SpringBootConfiguration主要就是说明该类是一个配置类,其中有一个组件。所以SpringBoot启动类本身就是一个组件。

2.3 @EnableAutoConfiguration


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

         @EnableAutoConfiguration:开启自动配置功能的注解,该注解就是自动装配的核心。

        @EnableAutoConfiguration中主要分析其中的:@AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class})

        @Import:给Spring中导入组件的注解。

2.3.1 @AutoConfigurationPackage

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};
}

        @AutoConfigurationPackage:自动配置包。

        @Import(Registrar.class)的作用是将主类所在的包以及包的子包都导入容器中。

2.3.2  AutoConfigurationImportSelector.class

AutoConfigurationImportSelector:自动配置导入选择类,该类能将选择你添加进项目依赖的包,然后根据你选择的包帮你导入配置。在该类的getCandidateConfigurations方法在经过SpringFactoriesLoader的方法loadSpringFactories找到META-INF/spring.factories文件,该文件中存储的就是SpringBoot帮你配置好的配置文件。

2.3.3 spring.factories .xml

@AutoConfigureOrder(-2147483648)
@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@ConditionalOnClass({DispatcherServlet.class})
@AutoConfigureAfter({ServletWebServerFactoryAutoConfiguration.class})
public class DispatcherServletAutoConfiguration {
    public static final String DEFAULT_DISPATCHER_SERVLET_BEAN_NAME = "dispatcherServlet";
    public static final String DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME = "dispatcherServletRegistration";

    public DispatcherServletAutoConfiguration() {
    }

    @Order(2147483637)
    private static class DispatcherServletRegistrationCondition extends SpringBootCondition {
        private DispatcherServletRegistrationCondition() {
        }

        public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
            ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
            ConditionOutcome outcome = this.checkDefaultDispatcherName(beanFactory);
            return !outcome.isMatch() ? outcome : this.checkServletRegistration(beanFactory);
        }

        private ConditionOutcome checkDefaultDispatcherName(ConfigurableListableBeanFactory beanFactory) {
            boolean containsDispatcherBean = beanFactory.containsBean("dispatcherServlet");
            if (!containsDispatcherBean) {
                return ConditionOutcome.match();
            } else {
                List<String> servlets = Arrays.asList(beanFactory.getBeanNamesForType(DispatcherServlet.class, false, false));
                return !servlets.contains("dispatcherServlet") ? ConditionOutcome.noMatch(this.startMessage().found("non dispatcher servlet").items(new Object[]{"dispatcherServlet"})) : ConditionOutcome.match();
            }
        }

该文件的位置在spring-boot-autoconfigure下的META-INF内,我们可以点击去一个我们熟悉的

DispatcherServlet的自动配置。我们查看其中的源代码,发现就是在帮我们配置DispatcherServlet

并且它是通过反射获取该类,如果说你在构建项目的时候选择的javaweb依赖,那SpringBoot就会帮你将需要的jar包都导进来,只要导进该项目这个地方就能识别出你需要该配置,所以你自己不用配置就能使用。这也是我们根本什么就没配置就可以直接运行处一个简单的hello的原因。

说明:所有的jar包都是创建的SpringBoot项目的父项目spring-boot-starter-parent的父项目spring-boot-dependencies管理其中有很多已经配置好版本的jar包,这些可以在pom文件中查看的到。

3. 流程概述

  1. SpringBoot在启动之前自动扫描META-INF/spring.factories其中的所有配置,如果创建的项目中有相关的依赖jar包,就能将用反射加载该jar包的配置加载到容器中。
  2. 在正常运行的时候容器就有该配置,所以就能正常使用。

4. 自我理解

        什么自动装配,不过是别人提前将这些都配置好放在一个地方也就是这里的META-INF/spring.factories,然后就是判断你需要哪些配置,那么多配置不能都加在到容器中吧,肯定使用哪个加入哪个,如何判断使用哪个呢,就需要配利用反射来查找class,我们创建项目的时候选择了要哪些依赖,根据依赖SpringBoot就能将所需要的jar包都自动导入,根据这些自动导入的包,SpringBoot就直到我要加载什么配置。

        @SpringBootApplication这个注解主要@ComponentScan 扫描组件或者bean @SpringBootConfiguration 主类也是个配置类 @EnableAutoConfiguration 开启自动配置,这样从整体到局部的一点点看还是能记住的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值