8-8 三方集成自动配置

三方集成自动配置

配置方式

application.properties

application.yml

application.yaml

配置优先级(执行优先级与之相反,执行低的会把之前的覆盖)

  • application.yaml

  • application.yml

  • application.properties

  • Java系统属性(-Dxxxx=xxxx)

  • 命令行参数(--xxxx=xxxx)

Bean管理

第三方Bean无法直接使用 @Component 及衍生注解来声明 bean 对象的,就需要用到 @Bean注解

如果要管理的第三方 bean 比较多,建议对这些bean进行集中分类配置,可以通过 @Configuration 注解声明一个配置类。

​
@Configuration //声明为配置类
public class CommonConfig {
    @Bean //第三方Bean 管理
    public BASE64Encoder base64Encoder(){ //写一个方法返回
        return new BASE64Encoder();
    }
    
    @Bean
    public BASE64Decoder base64Decoder(){
        return new BASE64Decoder();
    }
}

注意事项:通过 @Bean 注解的name属性 或 value 属性可以声明 bean 的名称,如果不指定,默认bean的名称就是方法名。

获取bean

Spring 容器启动时,会把其中的 bean 都创建准备好,如果想要主动获取这些 bean,可以使用如下方法:

  • 根据类型获取 bean : <T> T getBean(Class<T> requiredType)

    • 可以传递父类型,返回子类型对象

    • 可以传递接口类型,返回实现类型对象

  • 根据 指定bean名称获取 bean :Object getBean(String name)

  • 根据 指定bean名称和bean类型获取(带类型转换) : <T> T getBean(String name, Class<T> requiredType)

注意事项:

  • 上述所说的 "Spring容器启动时,会把其中的bean都创建好",还会受到作用域 scope 及延迟初始化 lazy 影响,这里主要针对于 默认的单例非延迟加载的bean而言。

@SpringBootTest
class SpringbootThirdbeanApplicationTests {
    
    @Autowired
    private ApplicationContext context;
    
    @Test
    public void testGetBean(){
        DeptController deptController = applicationContext.getBean(DeptController.class);
         System.out.println(deptController);
        
            
         Object object = applicationContext.getBean("deptController");
         System.out.println(object);
        
         DeptController deptController2 = applicationContext.getBean("deptController", DeptController.class);
         System.out.println(deptController2);
    }
    
}

bean的作用域

作用域说明
singleton容器内同 id 的 bean 只有一个实例(单例)(默认)
prototype每次使用该 bean 时会创建新的实例(非单例)
request每个请求范围内会创建新的实例(web环境中,了解)
session每个会话范围内会创建新的实例(web环境中,了解)
application每个应用范围内会创建新的实例(web环境中,了解)
@Scope("prototype")
@RestController
@RequestMapping("/depts")
public class DeptController {
    //....
}
​
singleton  启动就会生成容器,调用容器类的Bean,容器内同 id 的 bean 只有一个
prototype  调用Bean时才会创建容器

自动配置原理

Springboot项目快速建立的原因主要有两点:

  • 起步依赖(起步依赖基于依赖传递)

  • 自动配置

SpringBoot的自动配置就是当spring容器启动后,一些配置类就自动装配的IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置等操作。

SpringBoot 自动配置原理,先需要明白两个前置知识 @Conditional 条件注解 和 @Import 导入配置

@Conditional

@Conditional 条件注解:按照一定的条件进行判断,需要声明的Bean,在满足给定条件后才会注册到Spring IOC容器中。

@Conditional 本身还是一个父注解,派生出大量的子注解:

  • @ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器。

  • @ConditionalOnMissingBean:判断环境中没有对应的bean ,才注册bean到IOC容器。

  • @ConditionalOnProperty:判断配置文件中是否有对应属性和值,才注册bean到IOC容器。

@Import

不能直接加载第三方Bean,启动类上加入 @Import注解

@Import注解主要可以导入形式有以下几种:

  1. Bean

  2. 配置类

  3. ImportSelector接口子类

@Import({TokenParser.class,HeaderConfig.class})//注入bean类
@SpringBootApplication
public class SpringbootThirdbeanApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootThirdbeanApplication.class, args);
    }
}

自动配置原理

当SpringBoot 程序启动时,引导类上 @SpringBootApplication 注解生效,该注解由三个注解组成

  • @SpringBootConfiguration:引导类也是一个配置类

  • @ComponentScan:包扫描

  • @EnableAutoConfiguration:自动配置。底层为:@Import(AutoConfigurationImportSelector.class),通过@Import导入配置类

SpringBoot程序在启动时会自动加载 META-INF/spring.factories 文件 和 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,并导入其中定义的所有配置类。

由于这些配置类上都加了Condition条件注解,所有不会将所有Bean 加载到IOC容器中,只有满足条件的Bean才会加载。

自定义starter

  1. 创建starter模块(可以删除src目录

  2. 创建autoconfigure模块(src目录不能删除,写执行代码)

  3. autoconfigure模块内加入需要的依赖

  4. starter模块引入 autoconfigure模块坐标(pom.xml)

  5. autoconfigure模块中 编写核心逻辑

  6. autoconfigure模块中定义自动配置类

  7. autoconfigure模块中resources目录下定义 META-INF/spring.factories,SpringBoot程序启动后会自动读取该文件加载键为: org.springframework.boot.autoconfigure.EnableAutoConfiguration的值 ,值要设定为配置类的全限定类名。

  8. 在需要使用的项目中中引入starter依赖即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值