SpringBoot------原理初探以及改变端口号(三)

SpringBoot改变访问端口

改变端口号的配置比较简单,只需要在application.properties文件中添加server.port=8081即可,在访问时就能够通过8081端口进行访问。
在这里插入图片描述

原理初探

pom.xml里面存放了核心依赖在父工程中。
点击版本号能够进入一个新的页面,
在这里插入图片描述
而点击这里同样有父工程。再次点击版本号。
在这里插入图片描述
这里面就有很多引入的依赖。在这里插入图片描述
我们在写或者引入一些SpringBoot依赖的时候,不需要指定版本,就因为有这些版本仓库

启动器

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.4.3</version>
      </dependency>

启动器说白了就是SpringBoot的启动场景,当我们需要各种场景时,只需要导入启动依赖即可,比如spring-boot-starter-web,它会帮我们自动导入web环境所有的依赖。
springboot会将所有的功能场景,都变成一个个启动器。这些场景的依赖都已经预封装好。在这里插入图片描述
要使用什么场景,只需要找到对应的启动器‘starter’。什么场景对应什么starter以及对应的版本都在官网中能够查到。

在这里插入图片描述

主程序

表面意思:

//@SpringBootApplication->@SpringBootConfiguration->@Configuration->@Component
//由此可以看出DemoApplication本身就是spring的一个组件,
//@SpringBootApplication标注这个类是一个SpringBoot的应用
//程序的主入口
@SpringBootApplication
public class DemoApplication {
    
    

	public static void main(String[] args) {
    
    
		//run静态方法,将springBoot应用启动
		SpringApplication.run(DemoApplication.class, args);
	}

}

深层拆解:
注解:
SpringBootApplication上面存在许多注解,其中 ComponentScan扫描一些包,过滤一些特定的东西。

@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 {
    
    };

@SpringBootConfiguration:springboot的配置,在SpringBootConfiguration上同样存在一个注解@Configuration代表spring配置类。

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

而Configuration上同样存在多个注解,其中@Component代表这是一个spring的组件。

@Target({
    
    ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    
    
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";

    boolean proxyBeanMethods() default true;
}

@EnableAutoConfiguration:自动导入配置。

在EnableAutoConfiguration上也存在一个@AutoConfigurationPackage注解,意思为自动配置包。
@Import({AutoConfigurationImportSelector.class})::自动导入配置选择。

@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 {
    
    };
}

而AutoConfigurationPackage,导入了一个选择器
@Import({Registrar.class})

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

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

@Import({Registrar.class}):自动配置‘包注册’

获取候选包配置

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    
    
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }
//首先加载了这个包EnableAutoConfiguration
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
    
    
        return EnableAutoConfiguration.class;
    }
//相当于当前类的加载器
 protected ClassLoader getBeanClassLoader() {
    
    
        return this.beanClassLoader;
    }

META-INF/spring.factories自动配置的核心文件。
在这里插入图片描述
有初始化配置、监听配置、自动配置导入监听器、自动配置导入过滤器、自动配置,如果文件中没有的配置,但是自己需要则需要手写。
在这里插入图片描述
将资源加载到配置类中。
在这里插入图片描述

结论:SpringBoot自动配置都在启动类中被扫描,被加载,在这个文件中“spring.factories”,所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入对应的start,就有对应的启动器了,有了启动器,我们的自动装配就会生效,然后就配置成功。【不一定正确】。

步骤:
1.springboot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值,
2.讲这些自动配置类导入容器,自动配置类,帮我们进行自动配置。
3.以前需要配置的东西,现在SpringBoot帮我们做
4.整合JAVAEE,解决方法呢和自动配置的东西都在spring-boot-autoconfigure-2.4.3.jar包下
5.它会把所有需要导入的组件以类名的方式返回,这些组件就会被添加到容器
6.容器中也会存在非常多的xxxxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有类,并自动配置、
7.有了自动配置类,就免去了手动编写配置注入功能组件等的工作。

Guess you like

Origin blog.csdn.net/cz_chen_zhuo/article/details/114641611