建公司网站要多少钱,郑州 网站建设有限公司,永久免费google搜索引擎,南京专业做网站公司什么是自动装配#xff1f;
Spring提供了向Bean中自动注入依赖的这个功能#xff0c;这个过程就是自动装配。 SpringBoot的自动装配原理基于大量的条件注解ConditionalOnXXX#xff0c;因此要先来了解一下条件注解相关的源码。 以ConditionalOnClass为例 首先来查看Conditi…什么是自动装配
Spring提供了向Bean中自动注入依赖的这个功能这个过程就是自动装配。 SpringBoot的自动装配原理基于大量的条件注解ConditionalOnXXX因此要先来了解一下条件注解相关的源码。 以ConditionalOnClass为例 首先来查看ConditionalOnClass的源码 Target({ ElementType.TYPE, ElementType.METHOD })
Retention(RetentionPolicy.RUNTIME)
Documented
Conditional(OnClassCondition.class)
public interface ConditionalOnClass {Class?[] value() default {};String[] name() default {};}
可以看到ConditaionalOnClass注解上面又存在一个Conditaional(OnClassCondition.class)注解。对于这种关系我们把ConditionalOnClass注解叫做Conditonal注解的派生注解。
自动装配原理建立在这些大量的派生注解ConditionalOnXXX之上而这些条件注解的原理又和Condition接口有关。
具体我们可以去看OnClassCondition.class类的继承实现关系发现的确实现了Condition接口。可以多看其他类的继承实现关系图来证明。 这里我就不多粘贴了那么我们去看Condition接口的源码
FunctionalInterface
public interface Condition {boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}
该接口只有一个方法这个方法决定了是否要注册相应的bean对象这个方法中存在两个参数他们分别用来获取一些环境信息和注解元数据从而用在matches方法中判断是否符合条件。
最后我们自定义一个条件注解方便我们更好理解这些东西 创建条件判断类去实现Condition接口 class OnLinuxCondition implements Condition{Overridepublic final boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) {//根据metadata获取对应注解上的信息ListAnnotationAttributes allAnnotationAttributes //返回值是一个类似Map的数据结构但这里用List接收实际上不能这么些metadata.getAllAnnotationAttributes(ConditionalOnLinux.class.getName());//获得注解上的信息后遍历得到我想要得到的数据for(AnnotationAttributes annotationAttributes:allAnnotationAttributes){String environment annotationAttributes.getString(environment);if(linux.equals(environment)){return true;}}return false;}
} 创建条件注解 Target({ElementType.TYPE,ElementType.METHOD
})
Retention(RetentionPolicy.RUNTIME)
Documented
Conditional(OnLinuxCondition.class)
class interface ConditionalOnLinux(){String environment() default ;
} 测试 Configuration
class LinuxConfig{BeanConditionalOnLinux(environment linux)public Environment environment(){return new LinuxEnvironment();}
}
以上代码的意思是如果想要注册environment的bean那么它的环境属性一定是linux时才会注册到容器当中。