业务场景:做一个统一的Healcheck通用包,做一个通用的jar包,需要提供一个接口给依赖项目拓展,如果对依赖项目没有实现此接口,就使用Healthcheck默认的接口,如果对方有实现此接口,则实例化依赖项目的实现。
HealthCheck接口
public interface HealthCheck {
Message doCheck();
}
实现方式一:
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
@Slf4j
public class BeanCondtion implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
try {
HealthCheck bean = conditionContext.getBeanFactory().getBean(HealthCheck.class);
}catch (BeansException e){
log.error(e.getLocalizedMessage());
return true;
}
return false;
}
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyAutoConfiguration {
@Conditional(BeanCondtion.class)
@Bean
public HealthCheck healthCheck(){
return new HealthCheck() {
@Override
public Message doCheck() {
return new Message("kk");
}
};
}
}
解释:在项目启动的时候如果BeanCondition返回的是true,则会执行MyAutoConfiguration下面的healthCheck()方法。换句话说,如果在项目启动的时候如果没有HealthCheck的实现类则使用提供的默认实现。
实现方式二:
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyAutoConfiguration {
@Bean
@ConditionalOnMissingBean(HealthCheck.class)
public HealthCheck healthCheck(){
return new HealthCheck() {
@Override
public Message doCheck() {
return new Message("kk");
}
};
}
}
解释:如果没有HealthCheck的实现类则会调用 healCheck方法。注入到ioc容器中.