package tech.powerjob.worker.processor.impl; import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import tech.powerjob.common.enums.ProcessorType; import tech.powerjob.worker.extension.processor.ProcessorFactory; import java.util.Set; @Slf4j public abstract class AbstractBuildInSpringProcessorFactory implements ProcessorFactory { protected final ApplicationContext applicationContext; protected AbstractBuildInSpringProcessorFactory(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } @Override public Set supportTypes() { return Sets.newHashSet(ProcessorType.BUILT_IN.name()); } protected boolean checkCanLoad() { try { ApplicationContext.class.getClassLoader(); return applicationContext != null; } catch (Throwable ignore) { } return false; } @SuppressWarnings("unchecked") protected static T getBean(String className, ApplicationContext ctx) throws Exception { // 0. 尝试直接用 Bean 名称加载 try { final Object bean = ctx.getBean(className); if (bean != null) { return (T) bean; } } catch (Exception ignore) { } // 1. ClassLoader 存在,则直接使用 clz 加载 ClassLoader classLoader = ctx.getClassLoader(); if (classLoader != null) { return (T) ctx.getBean(classLoader.loadClass(className)); } // 2. ClassLoader 不存在(系统类加载器不可见),尝试用类名称小写加载 String[] split = className.split("\\."); String beanName = split[split.length - 1]; // 小写转大写 char[] cs = beanName.toCharArray(); cs[0] += 32; String beanName0 = String.valueOf(cs); log.warn("[SpringUtils] can't get ClassLoader from context[{}], try to load by beanName:{}", ctx, beanName0); return (T) ctx.getBean(beanName0); } }