1.背景
某项目,spring架构,有2个不同的WebAppApplication入口,大部分service类共用,小部分类有区别,只需要在一个应用中加载,不需要在另一个应用中加载.
2.实现代码
自定义限制注解
package mis.shared.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @description 限制bean在指定application下加载
* webAppApplication
* webSmartApplication
* @date 2023/08/04
*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LimitBeanLoad {
String value() default "webSmartApplication";
}
实现Spring的Condition接口
package mis.shared.annotation;
import com.bestvike.linq.Linq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* @description spring加载bean条件类
* @date 2023/08/04
*/
@Slf4j
public class SpringLoadBeanCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
try {
//获取注解中指定的应用名称
MergedAnnotation<LimitBeanLoad> limitAnnotation = metadata.getAnnotations().get(LimitBeanLoad.class);
String annotationAppName = (String) limitAnnotation.getValue("value").orElse(null);
//判断当前应用是否符合指定
String[] beanDefinitionNames = context.getRegistry().getBeanDefinitionNames();
long limitAppCount = Linq.of(beanDefinitionNames).where(p -> p.equals(annotationAppName)).stream().count();
return limitAppCount > 0;
} catch (Exception e) {
}
return true;
}
}
使用注解