首页 > 其他分享 >自动配置

自动配置

时间:2023-02-24 20:11:45浏览次数:30  
标签:容器 依赖 自定义 配置 导入 自动 组件

SpringBoot特点

依赖管理

  • 父项目做依赖管理:父项目中声明了非常多的依赖,只要子项目继承了父项目,那么子项目写依赖就不需要版本号了
  • 开发导入starter场景启动器
    1.当需要用到web场景时,不需要引入过多的包,只需要引入springboot-starter-web即可,其他场景也是,引入springboot-starter-*即可,常规需要的依赖都会自动引入
    2.所有场景启动器都有一个最底层依赖,也是springboot的核心依赖
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter</artifactId>
 <version>2.3.4.RELEASE</version>
 <scope>compile</scope>
</dependency>
  • 无需关注版本号,自动版本仲裁
    1.引入依赖默认可以不写版本
    2.引入非版本仲裁的jar,就必须写版本号
  • 可以修改版本号
    1.在spring-boot-dependencies里面规定当前以来的版本用的key(<mysql.version>)
    2.在当前项目的pom文件中重新设置配置:如果需要自定义修改mysql或其他依赖的版本那就需要在pom文件中用标签声明mysql的版本

自动配置

  • 自动配好Tomcat
    • 引入Tomcat依赖
    • 配置Tomcat
  • 自动配置MVC
    • 引入全套组件
    • 自动配好常用功能
  • 自动配好web常见功能
    • 配置了所有web开发的场景
  • 默认的包结构
    • 主程序所在包及其下面的所有把里面的组件都会被默认扫描进来
    • 只有当把方法类放到和主程序同一个包下,才能利用主程序将这个方法类中的方法运行(类中的请求顺利完成)
    • 而当包不在同意路径时,可以在“@SpringBootApplication”后面加上(scanBasePackages="包名(扫描路径)")即可
    • 无需以前的包扫描
  • 各种配置都有默认值
    • 默认配置都是映射到某一个类上的
    • 配置文件的值最终hi绑定到某个类中,这个类会在容器中创建对象
  • 按需加载所有自动配置项
    • 有很多的starter,但我们只引入了web的starter,那么就会只启动web中的配置
    • 引入那些场景就会启动那些场景

容器功能

组件添加

比如需要添加用户和宠物这两个组件,在之前对组件进行添加就需要先创建一个.xml文件


现在,springboot添加组件的方式为:

  • 1.@Configuration
    首先创建一个类
    再用注解表标明
    这个类就等同原来的配置文件.xml
    @Bean
    使用方法来为容器添加组件,用@Bean注解声明所添加的组件

    这个注解用来表明,下面的方法就是给容器添加组件,方法名就作为组件的id;返回类型就是组件类型;返回的值就是组件在容器中保存的值(实例)
    添加之后这两个组件就会存在在容器当中,下面就从容其中回去这个两个组件。(注意:此时,主程序可以返回容器,我们可以直接在主程序当中获取)
    方法名不是数据名,是组件id(默认),如果想要另外自定义组件id(组件名),可以通过在@Bean后添加字符串类定义如,@Bean("自定义名")
    注册的组件默认是单实例,也就是说,无论获取几次,获取到的都是同一个实例

    注意,在开头创建的配置类,也是一个组件

proxyBeanMethods:代理bean的方法
这是@Configuration的属性,也是springboot2区别于1的地方,它的默认值是"true"(trued代理,false不代理)

同样的,外部无论对配置类中的这个注册方法调用多少次,获取的都是注册到示例中的单实例对象,是同一个对象,原因就是@Configuration(proxyBeanMethods = true)
@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中,如果在,就直接调用,如果不在就新创建,以此来保证组建单实例性。每次被调用,都会在容器中找组件
@Configuration(proxyBeanMethods = false),那么就不是代理对象调用方法。多次获取后,得到的就不是同一个对象每一次调用,都会创建一个新对象
在底层,springboot对@Configuration的配置分为Full(proxyBeanMethods = true)全配置、Lite(proxyBeanMethods = false)轻量级配置
使用场景:解决组建依赖
全配置:这个user想要养一个相同bean下的宠物,那么我们可以在user这个方法中调用Pet这个方法,那么此时所养的宠物就是从相同bean中获取的宠物。user想要养一个相同bean下的宠物,这就是一种依赖行为。当用户需要这种依赖关系时,我们就用全配置(每次调用需要检查内部有没有这个方法)
轻配置:这个user想要养一个相同bean下的宠物,那么我们可以在user这个方法中调用Pet这个方法,但由于是轻配置,user直接调用Pet时,Pet重新创建了一个Pet对象(尽管对象名相同,但却不是同一个对象)。不需要养相同bean下的宠物,这就是一种不依赖关系,就用轻配置(每次调用跳过检查方法是否存在,快)

当有依赖关系时就用全配置;没有依赖关系就用轻配置(快)

  • 2.添加组件另一种方法
    @Component(在类上标注,标明这个类是一个组件) @Controller(标明是一个控制器) @Service(标明是业务逻辑组件) @Repository(标明是一个数据库层组件),只要卸载主程序类里面的包就行
  • 3.@Import
    使用位置:任意一个配置类、组件中都可以
    作用:这是一个class数组,可以通过这个注解导入很多的组件;导入自定义的组件、导入第三方组件
    格式:@Import({User.class, DBHelper.class}),然后就可以将指定的组件放到容器中,可以通过run.getBean()方法查找是否存在。
    导入后,创建的组件名默认是全类名。
  • 4.@Conditional
    条件装配:满足Conditional指定的条件,则进行组件注入

    逻辑是:当满足或不满足某种条件、有或没有某些东西时(前半句),就注入某些组件(括号内)


    逻辑就是,当容器中存在组件名为tom的组件时,我们就注册user01这个组件;如果没有就不注册;通过上面测试,我们知道tom不存在,所来来检验一下,user01是否被注册。预计结果:user01不存在

    显然,没有了。
    由此,当@Conditional使用在配置类的类名前时,那就将下面所有的行为当作满足条件后才可执行的行为。

此外还有:
@ConditionalOnMissingBean(name = "tom"),当容器中没有tom组件的时候,就进行下面的行为。

原生配置文件引入(进行注册组件)

  • @ImportResource(导入资源)
    使用位置:配置类当中
    目前的springboot2是不识别自定义的.xml文件的,也就是说利用开头所讲的老式注册组件的方法,是不能够在容器中注册成功的,无法找到插件。
    可以通过@ImportResource("classpath:自定义.xml")注解的方法,将指定的资源导入(作用就是将.xml文件解析,然后把里面的组件注册到容器中)
    先来验证haha和hehe

    而后我们通过@ImportResource("classpath:自定义.xml")导入资源

配置绑定

如何使用java读取到properties文件里的内容,并把它封装到JavaBean中,以供随时使用;
配置绑定就是,将类中的属性以及属性值,绑定到配置文件中的关键字上,这样找起来比较方便。

1.@Component+@ConfigurationProperties(prefix = "自定义关键字")方式

  • 1.将目标类放到容器中(通过@Component注释)

  • 2.将目标类与配置文件中的自定义关键字进行绑定(通过@ConfigurationProperties(prefix = "自定义关键字"))

  • 3.在配置文件中设置属性值

  • 4.虽然目标类已经在容器当中了,但我们依然需要将这个组件(类)注册到peispringboot当中(通过@Autowired)

查看返回结果

2.@EnableConfigurationProperties(prefix = "自定义关键字")+@ConfigurationProperties(类名.class)方式

这种方式必须在配置类当中写

  • 在配置类中开启目标类的配置绑定功能(通过@EnableConfigurationProperties(类名.class))

    并且可以将目标类自动注册到容器当中

自动配置原理

引导加载自动配置类@EnableAutoConfiguration

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)

@SpringBootApplication是这些注解的合成

  • @SpringBootConfiguration
    内部就是@Configuration,代表当前是一个配置类(主程序是一个核心配置类)
  • @ComponentScan
    就是一个包扫描,指定扫描那些
  • @EnableAutoConfiguration
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})

@EnableAutoConfiguration是这些注解的合成

  • 1.@AutoConfigurationPackage自动配置包
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
    String[] basePackages() default {};
    Class<?>[] basePackageClasses() default {};
}

@Import就是给容器导入组件
利用Registrar给容器中导入一些列组件,批量导入

getAutoConfigurationEntry(annotionMetadata);给容器中批量导入一些组件

按需开启

虽然127个场景的所有自动配置启动的时候全部默认加载。但最终会进行按需配置

标签:容器,依赖,自定义,配置,导入,自动,组件
From: https://www.cnblogs.com/hezhipeng/p/16972632.html

相关文章

  • 树莓派源码内核配置(二)
    再多嘴一句:树莓派LINUX源码配置,是为了驱动代码的编写,驱动代码编译需要一个提前编译好的内核,编译内核就必须配置,配置的最终目标是形成.config文件,该文件知道makefile去把有......
  • Eureka高可用集群服务端和客户端配置
    微服务应用中,生产环境一般都需要保障服务注册中心的高可用!高可用也分好几个等级,例如:同数据中心或区(Zone)高可用——》同地区(Region)跨数据中心或区(Zone)高可用——......
  • 利用 fastline 进行自动化打包
    前期准备-工具安装安装fastline工具#安装fastline$sudogeminstall-n/usr/local/binfastlane#查看fastline版本$fastlane--version再fastline......
  • mysql主从自动搭建
    1.主服务器​​master.sh​​#!/bin/bash#====================================================#Author:Mr.Song#CreateDate:2019-02-21#Description:autoconfig......
  • springboot+logback日志配置
    <?xmlversion="1.0"encoding="UTF-8"?><!--scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。scanPeriod:设置监测配置文件是否......
  • QQ幻想开心辞典答题器,自动答题器《FO回忆》
    (省流版,请直接拉到文末)沉年老游戏了。也算是当年第一批端游,只不过后来被无点卡的qq自由幻想取代。再之后就一路没落下去了。这游戏实际上直到现在,还一直有一批80、90后是......
  • (3). Vscode 配置模板输出
    1.点击设置,选择配置用户代码片段2.选择vue.json3.配置快捷模板......
  • Python+Appium实现APP自动化测试
    一、环境准备1.脚本语言:Python3.xIDE:安装Pycharm2.安装JavaJDK、AndroidSDK3.adb环境,path添加E:\Software\Android_SDK\platform-tools4.安装Appiumforwindows,官......
  • Javaweb----Maven环境配置
    Maven环境配置maven的作用:写javaweb项目时,自动导入相应的java包。maven的环境变量配置2.1进入maven的官网下载maven:链接地址https://maven.apache.org/download.c......
  • 关于github的自动化检测
    github中的Somecheckswerenotsuccessful什么意思呢? 在GitHub上,当您向存储库提交拉取请求时,如果存在自动化的检查(例如CI/CD)或在pullrequest页面中的某个......