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

SpringBoot改变访问端口

配置文件application.properties中能够配置的所有内容,在官网的,官方文档Application Properties中都有列明


Application Properties	
Common application properties that you can use to configure your application.

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

原理初探

pom.xml里面存放了核心依赖在父工程中。
点击版本号能够进入一个新的页面,
在这里插入图片描述
而点击这里同样有父工程。再次点击版本号。
在这里插入图片描述
这里面就有很多引入的依赖。在这里插入图片描述
我们在写或者引入一些SpringBoot依赖的时候,不需要指定版本,就因为有这些版本仓库
比如此时要引入mysql,只需要在pom文件中新增注释即可。但是此时所使用版本,是父工程中默认的版本。

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>

如果又需要自定义使用的版本,则需要加上标签,此标签要求标签名要求和父工程中的标签名一致,就会就近使用自定义的版本号,就近原则

    <properties>
        <mysql.version>5.6.0</mysql.version>
    </properties>

启动器

starter是一组依赖的集合描述,一般引入starter,完整的开发场景就会引入

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

启动器说白了就是SpringBoot的启动场景,当我们需要各种场景时,只需要导入启动依赖即可,比如spring-boot-starter-web,它会帮我们自动导入web环境所有的依赖。
springboot会将所有的功能场景,都变成一个个启动器。这些场景的依赖都已经预封装好。
*就表明某种场景,以这种形式命名的都是springboot官方提供的启动依赖

spring-boot-starter-*

而*-spring-boot-starter:这种一般是第三方提供的简化开发的场景启动器
所有场景启动器依赖,最底层的依赖spring-boot-starter

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

在这里插入图片描述
要使用什么场景,只需要找到对应的启动器‘starter’。什么场景对应什么starter以及对应的版本都在官网中能够查到。

在这里插入图片描述

主程序

SpringBootApplication中有很多属性,比如scanBasePackages,默认springboot的代码必须和启动类在同一个目录,或者子目录才能被扫描到,通过配置scanBasePackages,就能够自定义扫描目录,或者使用@ComponentScan指定扫描路径

@SpringBootApplication(scanBasePackages = "com")
public class DemoApplication {

    public static void main(String[] args) {
        //1.返回IOC容器,包含应用的所有组件
        ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);
        //2.获取所有组件的名字
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        for (String s : beanDefinitionNames){
            System.out.println(s);
        }
    }
}

springboot的所有自动配置功能都在spring-boot-autoconfigure里面。
表面意思:

//@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.有了自动配置类,就免去了手动编写配置注入功能组件等的工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值