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