目录
一、SpringBoot的特点
1.1 依赖管理
每个SpringBoot项目的pom.xml中都有这样的参数:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
它的父项目是:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
这个依赖中几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制。
starter场景启动器的格式:
<artifactId>spring-boot-starter-XXX</artifactId>
例如下面这个依赖就为我们导入了web相关的各种依赖。我们不需要手动设置版本号,因为父依赖会自动版本仲裁。如果引入了非版本仲裁的jar,则要写版本号。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
如果要指定依赖的版本,要在当前项目的pom.xml中写配置参数,例如:
<properties>
<mysql.version>5.1.43</mysql.version>
</properties>
1.2 自动配置
1.springboot会自动引入Tomcat依赖并配置tomcat服务器,我们自己不用配置。
2.自动配好SpringMVC,配好常用组件。
3.SpringBoot帮我们配置好了所有web开发的常见场景。如字符编码问题、扫包
4.主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来,想要改变扫描路径,在主程序的注解上修改:
@SpringBootApplication(scanBasePackages="com.xxx")
@SpringBootApplication等同于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.boot.xxx")
-每个配置都是有默认值的,最终都映射到各个类上-xxxxProperties
-这些默认值都绑定在各自的类上,类会在容器中创建对象
-按需加载所有自动配置项,因为start太多了,只有引入了某些场景时,这个场景的自动配置才会开启。
-自动配置的功能都在 spring-boot-autoconfigure 包里面
二、容器的功能
2.1 添加组件
我们可以手动添加组件:
-配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的,配置类本身也是组件。
-@Configuration的参数设置:proxyBeanMethods:代理bean的方法
Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
- 配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
- 配置类组件之间有依赖关系,方法会被调用得到之前的单实例组件,用Full模式
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
//给容器中添加组件。以方法名作为组件的id。
@Bean //返回类型就是组件类型。返回的值,就是组件在容器中的实例
public User user01(){
User zhangsan = new User("zhangsan", 18);
//user组件依赖了Pet组件
zhangsan.setPet(tomcatPet());//设置张三的宠物
return zhangsan;
}
@Bean("tom")
public Pet tomcatPet(){
return new Pet("tomcat");//汤姆猫
}
}
另外,也可以使用@import注解,让容器创建出组件。默认组件的名字是全类名。
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
}
@Conditional是条件装配,即满足Conditional指定的条件才进行组件注入。
若加在类上,则满足条件时这个类下面的组件才会创建;若加在方法(组件)上,则满足条件时这个组件才会创建。
2.2原生配置文件引入
@ImportResource可以引入原生配置文件中的Beans。
<bean id="haha" class="com.boot.bean.User">
<property name="name" value="zhangsan"></property>
<property name="age" value="18"></property>
</bean>
<bean id="hehe" class="com.boot.bean.Pet">
<property name="name" value="tomcat"></property>
</bean>
... ...
@ImportResource("classpath:beans.xml")
public class MyConfig {}
2.3 配置绑定
其实就是把properties中的指定属性读取出来,封装到javaBean中,便于随时使用。
第一步:在application.properties配置文件中设置好Bean的属性参数。
mycar.brand=benz
mycar.price=500000
第二步:在javabean类上加注解 @ConfigurationProperties(prefix = "xxx")
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String brand;
private Integer price;
... ...
}
第三步;在配置类上加注解 @EnableConfigurationProperties(xxx.class);或者在javabean类上加@conponent注解,标识为组件
@Configuration(proxyBeanMethods=false)
@EnableConfigurationProperties(Car.class)
public class MyConfig{
... ...
}
这时我们使用@AutoWired注解创建的Car对象就自带上面设置好的属性了。
三、自动配置原理
引导加载自动配置类:
@SpringBootApplication 注解包含以下注解:
@SpringBootConfiguration //代表当前是配置类
@EnableAutoConfiguration
@ComponentScan(excludeFilters = //扫描哪些包
{ @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication{... ...}
**@EnableAutoConfiguration 包含两个注解:
@AutoConfigurationPackage
//利用Registrar给容器中导入一系列组件(用户定义的)
//默认情况下也就是MainApplication 所在包下。
@Import(AutoConfigurationImportSelector.class)
//给容器导入配置类组件
//扫描当前系统所有META-INF/spring.factories位置的文件,
//这些文件中写死了springboot启动时要加载的配置类(xxxxAutoConfiguration),
//虽然所有自动配置启动的时候默认全部加载。但xxxxAutoConfiguration会
//按照条件装配规则(@Conditional)最终按需配置。也就是导进来了但不一定生效
public @interface EnableAutoConfiguration {}
SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了,则以用户的优先:
@Bean
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
}
总结:
- SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。而xxxProperties和配置文件进行了绑定
- 生效的配置类就会给容器中装配很多组件
- 定制化配置
用户直接自己@Bean替换底层的组件
用户去看这个组件是获取的配置文件中的什么值,然后修改。
1. xxxAutoConfiguration --(若满足条件)--> 创建组件 -> xxxxProperties里面拿默认值--
2. --(若用户指定了值)--> application.properties(使用配置文件中的值)
四、Lombok插件
4.1简化JavaBean开发
依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
使用方式:
注解:
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造(所有参数)
@Data // get、set方法
@ToString //重写toString方法
@EqualsAndHashCode //重写equals、hashcode方法
@NoArgsConstructor
@Data
@ToString
@EqualsAndHashCode
public class User {
private String name;
private Integer age;
private Pet pet;
public User(String name,Integer age){
this.name = name;
this.age = age;
}
4.2 简化日志开发
@slf4j注解
@Slf4j
@RestController
public class HelloController {
@RequestMapping("/hello")
public String handle01(){
log.info("请求进来了....");//代替sout的功能,在控制台显示
return "Hello, Spring Boot 2!";
}
}