IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot-组件配置/自动配置原理/Lombok -> 正文阅读

[Java知识库]SpringBoot-组件配置/自动配置原理/Lombok

目录

一、SpringBoot的特点

1.1 依赖管理

1.2 自动配置

二、容器的功能

2.1 添加组件

2.2原生配置文件引入

2.3 配置绑定

三、自动配置原理

四、Lombok插件

4.1简化JavaBean开发

4.2 简化日志开发


一、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!";
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:29:56  更:2022-08-06 10:31:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:19:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码