采访阿里p7(当时我只知道第一个):
@conditional做什么?
@条件条件之间的逻辑关系是什么?
有条件的判决什么时候执行?
配置条件和条件之间有什么区别?何时使用配置条件?
执行多个条件的顺序是什么?你能配置优先级吗?
你能介绍一下@conditional的一些常见用法吗?
@条件注释@条件注释来自spring4.0,可用于任何类型或方法。一些条件判断可以通过@条件注释来配置。当所有条件都满足时,由@conditional标记的目标将由spring容器处理。
例如,@conditional可用于控制是否需要注册一个bean,并且需要解析由@configuration标记的配置类。
效果类似于这段代码,相当于在spring容器解析目标前面添加了一个条件判断:
如果(是否所有条件都配置为如果(@条件匹配){
//spring继续处理由@条件注释标记的对象
{}
@条件源代码:
@target({elementtype。类型,元素类型。方法})
@retention(保留策略。runtime)
@已记录
公共@接口条件{
类别<。?扩展条件。[]值();
{}
此注释只有一个值参数,即条件类型的数组。条件是表示条件判断的接口。里面有一个返回真或假的方法。当所有条件都为真时,@conditional的结果为真。
让我们看看条件界面。
条件界面用于表示条件判断的界面。源代码如下:
@functionalinterface
公共接口条件{
/**
*判断条件是否匹配
*语境:条件判断语境
*/
布尔匹配(条件上下文上下文,注释类型元数据元数据);
{}
是一个函数接口,内部只有一个matches方法,用于判断条件是否成立,还有两个参数:
上下文:接口类型为条件上下文的条件上下文可用于获取容器中的个人信息
元数据:用于获取由@conditional标记的对象的所有注释信息
这个接口提供了一些常用的方法,可以用来获取spring容器中的各种信息。看看源代码:
公共接口条件上下文{
/**
*返回bean定义注册器,通过它可以获得bean定义的各种配置信息。
*/
bean definition registry getregistry();
/**
*返回一个类型为configureblelistablebean factory的bean工厂,它相当于一个ioc容器对象
*/
@可空
可配置的工厂getbeanfactory();
/**
*返回当前spring容器的环境配置信息对象
*/
环境getenvironment();
/**
*返回资源加载器
*/
资源加载器getresourceloader();
/**
*返回到类加载器
*/
@可空
类加载器getclassloader();
{}
关键问题:何时执行有条件的判决?spring对配置类的处理主要分为两个阶段:
在配置类解析阶段将获得一批配置类信息和一些需要注册的bean
在bean注册阶段,在配置类分析阶段获得的配置类和要注册的bean在spring容器中注册
看看什么是配置类。具有以下任何注释的类都属于配置类:
该类上有@compontent注释
该类上有一个@configuration注释
类上有@ componentscan注释
类上有一个@import注释
该类上有一个@importresource注释
类中有@bean注释的方法
要判断一个类是否是配置类,是否是下面的方法,如果你感兴趣,可以看一看:
org . spring framework . context . annotation . configuration class utils # is configuration
在春季,这两个过程在一个循环中被处理,直到所有的配置类都被解析并且所有的bean都被注册。
配置类的spring处理过程的源代码位置:
org . spring framework . context . annotation . configuration class后处理器#processconfigbeandefinitions
整个过程大致如下:
通常,我们通过new annotationconfigapplicationcontext()传递多个配置类来启动spring容器
spring解析多个传入的配置类
配置类解析阶段:这个过程就是处理上面6个配置类的注释的过程,在这个过程中会发现很多新的配置类。例如,由@import导入的一批新类恰好符合配置类,而由@ componentscan扫描的一些类恰好是配置类;此时,这些新生成的配置类将在相同的过程中进行分析
bean注册阶段:在对配置类进行分析之后,将获得一批配置类和一批要注册最好看的穿越小说的bean。此时,spring容器会将这些配置类注册为spring容器的bean,并且还会将这些bean注册到spring容器。
在上述第三阶段之后,许多新的bean将被注册到spring容器中,并且在这些新的bean中可能会有许多新的配置类
spring从容器中取出所有bean,遍历它,并过滤掉一批未处理的新配置类,这些类被移交给步骤3进行处理
从第3步到第6步,这个过程将经历许多次,直到所有配置类都被解析并且bean被注册
从上述过程中可以了解到:
您可以向配置类添加@conditional注释,以控制是否需要解析配置类。如果没有解析配置类,将跳过对配置上方六个注释的解析
您可以向已注册的bean添加@conditional注释,以控制该bean是否需要在spring容器中注册。
如果配置类不会在容器中注册,则所有新的配置类和由此配置类解析生成的所有新bean都不会在容器中注册
配置类由spring分两个阶段处理:配置类解析阶段和bean注册阶段(配置类在spring容器中注册为bean)。
如果条件接口的实现类在配置类上被视为@conditional,那么这个条件对两个阶段都有效,此时,某个阶段不能被条件精细地控制。例如,如果你想控制某个阶段,你可以让他解析它,但是你不能让他注册它,那么你需要另一个接口:配置条件。
配置条件接口查看此接口的源代码:
公共接口配置条件扩展了条件
/**
*条件判断阶段,无论是解析配置类时过滤还是创建bean时过滤。
*/
配置阶段获取配置阶段();
/**
*指示阶段的枚举:2个值
*/
枚举配置阶段{
/**
*配置类解析阶段,如果条件为假,配置类将不会被解析
*/
parse_configuration,
/**
* bean注册阶段,如果为false,bean将不会被注册。
*/
register_bean
{}
{}
与条件接口相比,配置条件接口有一个额外的getconfigurationphase方法,用于指定条件判断的阶段,即在解析配置类或创建bean时进行过滤。
@conditional使用的3个步骤
自定义类,实现条件或配置条件接口,并实现匹配方法
在目标对象上使用@条件注释,并指定该值引用自定义条件类型
启动spring容器来加载资源,然后@conditional将工作
文章来自网络,请联系删除侵权
请添加微信获取更多资源:学姐077
文章来源:www.atolchina.com