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