初识SpringBoot
1、SpringBoot特点
1.1、依赖管理
-
父项目做依赖管理
依赖管理 <parent> <artifactId>spring-boot-starter-parent</artifactId> <groupId>org.springframework.boot</groupId> <version>2.5.5</version> </parent> 他的父项目: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.5.5</version> </parent> 几乎声明了所有开发中常用的依赖的版本号
-
开发导入starter场景启动器
spring-boot-starter-web 1、spring-boot-starter :springBoot场景启动器;帮我们导入了web模块正常运行所依赖的组件; 2、SpringBoot将所有的功能场景都抽取出来,做成一个个的starters(启动器) ,只需要在项目里面引入这些starters相关场景的所有依赖都会导入进来。要用什么就导入什么场景的启动器。 3、所有的场景启动器模块最底层的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.5.5</version> <scope>compile</scope> </dependency>
4、SpringBoot所有支持的场景:
-
无需关注版本号,自动版本仲裁
- 引入的非本仲裁的jar,要写版本号
-
可以修改版本号
1、查看spring-boot-dependencies里面规定当前依赖的版本用的key
2、在当前项目里面重写配置
<!-- 修改默认的版本号,改成自己想要的-->
<properties>
<mysql.version>5.1.43</mysql.version>
</properties>
1.2、自动配置
-
自动配置好Tomcat
- 引入Tomcat依赖
- 配置Tomcat
-
自动配置好SpringMVC
- 引入SpringMVC的全套组件
- 自动配置好SpringMVC常用组件
-
自动配置好Web常见的功能,如:字符编码问题
- SpringBoot帮我们配置好了所有web开发的场景场景
-
默认的包结构
-
主程序所在的包及其所有子包里面的组件都会被默认扫描进来
-
无需以前的包扫描配置
-
想要改变扫描路径:@SpringBootApplication(scanBasePackages = “com”)
-
或者 @ComponentScan指定扫描路径
一个@SpringBootApplication 等同于 @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan("com")
-
-
各种配置拥有默认值
-
按需要加载所有自动配置项
- 虽然场景的所有自动配置启动的时候默认会全部
- 按照条件装配规则,最终会按需配置
环境准备
1、MAVEN设置
2、DEA设置
Springboot: HelloWorld
1、创建maven项目
2、添加SpringBoot相关的依赖
//继承父类依赖
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.5.5</version>
</parent>
//导入web模块依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3、创建主程序:启动Spring boot应用
@SpringBootApplication //标注这是一个主程序,说明这是一个springboot应用
public class HelloWorldApplication {
public static void main(String[] args) {
//Spring应用启动起来
SpringApplication.run(HelloWorldApplication.class,args);
}
}
4、编写相关的Controller、Service
@Controller
public class HelloController {
@ResponseBody
@RequestMapping("/hello")
public String hello(){
return "helloWorld";
}
}
5、运行主程序测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jeIX72tU-1635054821089)(C:\Users\XiaoQiang\AppData\Roaming\Typora\typora-user-images\1634627459631.png)]
6、简化部署
<!-- 这个插件,可以将应用打包成一个可执行文件的jar包-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
将这个应用打包成jar包,直接使用java -jar的命令进行执行;
Hello World探究
### 1.POM文件
#### 1、父项目
我们引入的父项目
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.5.5</version>
</parent>
他的父项目是:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.5</version>
</parent>
他是真正管理Spring Boot应用里面的所有依赖版本号:
Spring Boot的版本仲裁中心:
以后我们导入依赖默认是不需要写版本号的:
注意:(没有在dependencies里面管理的依赖还是需要声明版本号的)
2、导入的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter-web它的里面还是引用了:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.5</version>
<scope>compile</scope>
</dependency>
spring-boot-starter-web
spring-boot-starter :springBoot场景启动器;帮我们导入了web模块正常运行所依赖的组件;
SpringBoot将所有的功能场景都抽取出来,做成一个个的starters(启动器) ,只需要在项目里面引入这些starters相关场景的所有依赖都会导入进来。要用什么就导入什么场景的启动器。
3、底层注解
1、如何给容器里面添加组件
1.1@Configuration
告诉SpringBoot这是一个 配置类 == 配置文件
但是配置类本身也是组件
注意:但是在配置类,我们不能写标签了,要写方法
@Configuration 将类标记为适合 Spring 驱动的配置类似于我们的bean文件
public class MyClass {
//@Bean给容器中添加组件,以方法名作为主键的id,返回类型就是组件类型,返回的值,就是组件在容器中的实例
@Bean
public Pet pet(){
return new Pet();
}
@Bean("tow") //指定id名
public Pet pet01(){
return new Pet("张三",50);
}
}
-
@Bean相当于是我们以前的Spring配置文件一样注册使用
<bean id="pet" class="com.yang.controller.Pet"> <property name="name" value=""></property> <property name="age" value=""></property> </bean>
操作容器组件
//接收所有组件的容器 ConfigurableApplicationContext run1 = SpringApplication.run(HelloWorldApplication.class, args); //通过这个容器获取bean组件,和spring的xml文件操作一样 run1.getBean("pet01");
-
配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
Pet pet1 = (Pet) run.getBean("pet01"); Pet pet2 = (Pet) run.getBean("pet01"); System.out.println(pet1 == pet2); System.out.println(pet1.hashCode()); System.out.println(pet2.hashCode()); 结果: true 1301987508 1301987508
不生成代理对象
@Configuration(proxyBeanMethods = false)
1.2 @Import({})
给容器中自动创建出这个类型的组件,默认组件的名称就是全类名
@Import(User.class) 1标记
//获取所有Pet类型的bean
String[] beanNamesForType = run.getBeanNamesForType(Pet.class);
for (String s : beanNamesForType) {
System.out.println(s);
}
User bean = run.getBean(User.class); 1标记
System.out.println(bean);
结果:pet01
namePet02
com.yang.controller.User@517566b
2、注解-条件装配
1、@Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
3、注解-原生配置文件引入
@ImportResource
@ImportResource("classpath:beans.xml")
4、配置绑定
1、@ConfigurationProperties
方式一:@Component + @ConfigurationProperties
@Component //只有在容器中的组件,才会拥有SpringBoot提供的强大功能
@ConfigurationProperties(prefix = "mycar")
public class Car {
}
方式二:@Component + @EnableConfigurationProperties
// 1.开启Car 配置绑定功能
// 2.把这个Car这个组件自动注入到容器中
@EnableConfigurationProperties(Car.class)
2、主程序类,主入口类
@SpringBootApplication //标注这是一个主程序,说明这是一个springboot应用
public class HelloWorldApplication {
public static void main(String[] args) {
//Spring应用启动起来
SpringApplication.run(HelloWorldApplication.class,args);
}
}
@SpringBootApplication : springboot应用,标注在某个类上,说明这个类就是Springboot主配置类,
那springboot就应该运行这个类的main方法来启动Springboot应用;
@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}
)}
)
@SpringBootConfiguration:Springboot的配置类
标注在某个类上,表示这是一个SpringBoot的配置类
@Configuration: 配置类上来标注这个注解;
配置类 — 配置文件 ;配置类也是容器中的一个组件;@Component
@EnableAutoConfiguration: 开启自动配置功能
以前我们需要配置的东西,SpringBoot帮我们自动装配;@EnableAutoConfiguration告诉Springboot开启自动装配功能,这样自动配置才能生效;
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage:自动配置包
@Import({Registrar.class})
Spring的底层注解@Import,给容器中导入一个组件;导入的组件由Registrar.class来导入
@Import({AutoConfigurationImportSelector.class}):给容器中导入组件
AutoConfigurationImportSelector
将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中;
自动配置原理
//标注这是一个主程序,说明这是一个springboot应用
@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}
1、@SpringBootConfiguration
@Configuration。代表当前是个配置类
2、@ComponentScan
指定来定义要扫描的特定包,如果没有定义特定的包,将从声明该注解的类的包开始扫描。
3、@EnableAutoConfiguration
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
1、@AutoConfigurationPackage
自动配置包?,指定了默认的包规则
@Import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件
public @interface AutoConfigurationPackage {}
//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来。HelloWorldApplication所在的包下。
2、@Import(AutoConfigurationImportSelector.class)
最终就是到这个文件,给容器中加载所有的配置类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0XErD1cf-1635054821090)(C:\Users\XiaoQiang\AppData\Roaming\Typora\typora-user-images\1635048457660.png)]
ava
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
**1、@AutoConfigurationPackage**
自动配置包?,指定了默认的包规则
```java
@Import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件
public @interface AutoConfigurationPackage {}
//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来。HelloWorldApplication所在的包下。
2、@Import(AutoConfigurationImportSelector.class)
最终就是到这个文件,给容器中加载所有的配置类
[外链图片转存中…(img-0XErD1cf-1635054821090)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-isvMDoco-1635054821091)(C:\Users\XiaoQiang\AppData\Roaming\Typora\typora-user-images\1635048467594.png)]