@ConditionalOnProperty 注解使用和理解
conditional 注解value值 必须都得实现 Condition 接口的match 方法
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {
/**
* Alias for {@link #name()}.
* @return the names
*/
String[] value() default {};
/**
* A prefix that should be applied to each property. The prefix automatically ends
* with a dot if not specified. A valid prefix is defined by one or more words
* separated with dots (e.g. {@code "acme.system.feature"}).
* @return the prefix
*/
String prefix() default "";
/**
* The name of the properties to test. If a prefix has been defined, it is applied to
* compute the full key of each property. For instance if the prefix is
* {@code app.config} and one value is {@code my-value}, the full key would be
* {@code app.config.my-value}
* <p>
* Use the dashed notation to specify each property, that is all lower case with a "-"
* to separate words (e.g. {@code my-long-property}).
* @return the names
*/
String[] name() default {};
/**
* The string representation of the expected value for the properties. If not
* specified, the property must <strong>not</strong> be equal to {@code false}.
* @return the expected value
*/
String havingValue() default "";
/**
* Specify if the condition should match if the property is not set. Defaults to
* {@code false}.
* @return if should match if the property is missing
*/
boolean matchIfMissing() default false;
}
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
// conditional 注解value值 必须都得实现 Condition 接口的match 方法
/**
* All {@link Condition} classes that must {@linkplain Condition#matches match}
* in order for the component to be registered.
*/
Class<? extends Condition>[] value();
}
根据这个规则字典定义一个condition 类型的注解
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes("com.example.demo.condi.MyConditionAnnotation");
String[] value = (String[])annotationAttributes.get("value");
for(String property:value){
if(StringUtils.isEmpty(context.getEnvironment().getProperty(property))){
return false;
}
}
return true;
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(MyCondition.class)
public @interface MyConditionAnnotation {
String[] value() default {};
}
springboot starter 的使用和理解,主要依赖 EnableAutoConfiguration
自定义 starter
package com.example.demo.service;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "life")
public class LifeSource {
private String length;
private String weight;
public String getLength() {
return length;
}
public void setLength(String length) {
this.length = length;
}
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
}
}
package com.example.demo.service;
public class LifeService {
private final LifeSource lifeSource;
public LifeService(LifeSource lifeSource) {
this.lifeSource = lifeSource;
}
public String getWeight(){
return lifeSource.getWeight();
}
}
package com.example.demo.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(LifeSource.class)
@ConditionalOnProperty(name = "life.enable",havingValue = "enable")
public class LifeAutoConfiguration {
@Autowired
private LifeSource lifeSource;
@Bean
@ConditionalOnMissingBean(LifeService.class)
public LifeService lifeService(){
return new LifeService(lifeSource);
}
}
spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.demo.service.LifeAutoConfiguration