目录
每个SpringBoot项目的pom.xml中都有这样的参数:
- <parent>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-parentartifactId>
- <version>2.3.4.RELEASEversion>
- parent>
它的父项目是:
- <parent>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-dependenciesartifactId>
- <version>2.3.4.RELEASEversion>
- parent>
这个依赖中几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制。
starter场景启动器的格式:
<artifactId>spring-boot-starter-XXXartifactId>
例如下面这个依赖就为我们导入了web相关的各种依赖。我们不需要手动设置版本号,因为父依赖会自动版本仲裁。如果引入了非版本仲裁的jar,则要写版本号。
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
如果要指定依赖的版本,要在当前项目的pom.xml中写配置参数,例如:
- <properties>
- <mysql.version>5.1.43mysql.version>
- properties>
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 包里面
我们可以手动添加组件:
-配置类里面使用@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指定的条件才进行组件注入。
若加在类上,则满足条件时这个类下面的组件才会创建;若加在方法(组件)上,则满足条件时这个组件才会创建。
@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 {}
其实就是把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(使用配置文件中的值)
依赖:
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- 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;
- }
@slf4j注解
- @Slf4j
- @RestController
- public class HelloController {
- @RequestMapping("/hello")
- public String handle01(){
-
- log.info("请求进来了....");//代替sout的功能,在控制台显示
-
- return "Hello, Spring Boot 2!";
- }
- }