SpringBoot-HelloWorld
SpringBoot的创建
创建一个Mavan工程,添加父项目:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
如果想开发Web,需要在<dependencies>中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
SpringBoot的开发
1. 主程序类,添加@SpringBootApplication,告诉SpringBoot这是一个SpringBoot应用。
2. 添加配置文件:application.properties,可以通过server.port修改服务器的端口号,默认8080。
配置文件的值最终会绑定到某个类上,这个类会在容器中创建对象。
Maven 编译遇到 Process terminated 问题
原因:配置文件 settings.xml 出错
解决方案:格式化编辑好之后再复制粘贴。
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
父项目
用来做依赖管理,子项目无需定义依赖版本号。
修改版本号:
1、查看spring-boot-dependencies里面规定当前依赖的版本用的key。
2、在当前项目里面重写配置,例如:
<properties>
<mysql.version>5.1.43</mysql.version>
</properties>
starter场景启动器
1、spring-boot-starter-* : *表示某种场景,只要引入starter,这个场景的所有常规需要依赖都可以自动引入;
2、*-spring-boot-starter: 第三方提供的简化开发的场景启动器。
自动配好Web常见功能
SpringBoot帮我们自动配置了所有Web开发的常见场景,例如:前端控制器、视图解析器、文件上传解析器、字符编码过滤器等。
包扫描路径
默认包扫描路径:主程序所在包及其下面的所有子包,例如:"com.xxx.boot"。
修改包扫描路径:
1. @SpringBootApplication(scanBasePackages="com.xxx")
2. 如图所示:
//@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.xxx")
@Configuration
1. @Configuration:告诉SpringBoot这是一个配置类 == Spring中的XML配置文件。
如果@Configuration(proxyBeanMethods = true),使用代理对象调用方法,SpringBoot会检查这个组件在容器中是否已经存在,存在则不创建,不存在才创建,可以解决组件的依赖问题。
如果@Configuration(proxyBeanMethods = false),SpringBoot不会检查这个组件在容器中是否已经存在,每次都是新创建的,可以提高SpringBoot的运行速度。
2. @Bean:标注在方法上,给容器中添加组件,方法名作为组件id,返回类型是组件类型,返回值是组件在容器中的实例。@Bean("xxx"):自定义组件id为xxx,不再以方法名作为组件id。
@Import
@Import({User.class, DBHelper.class}):给容器中自动创建这两个类型的组件,组件的名字(id)默认就是全类名。
@Conditional
条件装配:满足Conditional指定的条件,才能进行组件注入。
@ImportResource
@ImportResource("classpath: xxx.xml"):导入Spring的XML配置文件。
配置绑定
方式1. @Component + @ConfigurationProperties:不可用于第三方提供的类。
@Component //只有在容器中的组件,才拥有SpringBoot提供的功能
@ConfigurationProperties(prefix = "car")
public class Car {
...
}
方式2. @EnableConfigurationProperties + @ConfigurationProperties:可用于第三方提供的类。
@ConfigurationProperties(prefix = "car")
public class Car {
...
}
@EnableConfigurationProperties(Car.class)
//1、开启配置绑定功能
//2、把这个组件自动注册到容器中
@Configuration
public class MyConfig {
...
}
自动配置注解
@SpringBootApplicat
@SpringBootConfiguration
@Configuration:代表当前类是一个配置类
@EnableAutoConfiguration
@AutoConfigurationPackage
@Import(AutoConfigurationPackages.Registrar.class):
利用Registrar给容器导入一系列组件,即主启动类所在包下的所有组件
@Import(AutoConfigurationImportSelector.class)
利用getAutoConfigurationEntry(annotationMetadata);方法,
给容器批量导入一些组件:所有自动配置在启动时默认全部加载,
最终按照条件装配规则(@Conditional),按需配置。
@ComponentScan:包扫描注解
修改默认配置
总结:
1. SpringBoot先加载所有的自动配置类:xxxAutoConfiguration;
2. 每个自动配置类按照条件(@Conditional)进行生效,默认都会绑定配置文件指定的值。值从xxxProperties.class里面拿,xxxProperties.class和配置文件(application.properties)进行了绑定;
3. 生效的配置类会给容器中装配很多组件;
4. 容器中有了这些组件,就相当于有了这些功能;
5. 如何定制化配置:
a. 用户在配置类中使用@Bean替换底层的组件;
b. 用户修改这个组件在配置文件(application.properties)中的值。
步骤:xxxAutoConfiguration ---> 组件生效 ---> 从xxxProperties.class里面拿值 ----> application.properties