Spring指定bean在哪个应用加载

1.背景

某项目,spring架构,有2个不同的WebAppApplication入口,大部分service类共用,小部分类有区别,只需要在一个应用中加载,不需要在另一个应用中加载.

2.实现代码

自定义限制注解

java 复制代码
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)
@Conditional(SpringLoadBeanCondition.class)
public @interface LimitBeanLoad {
    String value() default "webSmartApplication";
}

新建SpringLoadBeanCondition 类,实现Spring的Condition接口,作用:配合spring的@Conditional使用,配置在对应@component/service/controller等注解上,只有当matches方法返回true时,bean才会被加载初始化

java 复制代码
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;
    }

}

使用自定义注解LimitBeanLoad,限定XiaoCaoConfig这个类只有在webSmartApplication这个应用下加载初始化;webSmartApplication这个名称是sping启动类的首字母小写.

相关推荐
Mandy的名字被占用了14 小时前
晨风AI+知识付费系统|学练考全闭环,重构教育变现新模式
人工智能·后端
why技术14 小时前
分享一套我一直在使用的 AICoding 组合拳,小而美的典范。
前端·后端·ai编程
架构源启14 小时前
文档接入与智能解析:基于 Spring AI 1.1.x 的多格式解析、版面理解与结构化抽取
java·人工智能·spring
GetcharZp15 小时前
SRS实战:一个开源流媒体服务,支持6大协议,80ms低延迟,轻松搭建自己的直播平台
后端
Csvn16 小时前
📊 SQL 入门 Day 7:子查询 — 查询中的查询
后端·sql
大模型码小白18 小时前
JAVA 集合框架进阶:List 与 Set 的深度解析与实战
java·开发语言·人工智能·windows·语言模型·list·ai编程
IT_陈寒18 小时前
为什么我的JavaScript异步代码总是不按顺序执行?
前端·人工智能·后端
星栈19 小时前
Node 框架怎么选?Express、Koa、Egg、NestJS 场景化选型指南
后端·node.js
名字还没想好☜19 小时前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
锋行天下19 小时前
打造企业内部知识库系统RAG全栈项目
前端·后端·架构