根据不同的条件,调用不同的 bean 对象,执行对象中的方法
SpringUtils 工具类
package com.vipsoft.web.utils; import cn.hutool.core.util.ArrayUtil; import org.springframework.aop.framework.AopContext; import org.springframework.beans.BeansException; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * Spring工具类 方便在非 Spring 管理环境中获取bean * */ @Component public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware { /** * Spring 应用上下文环境 */ private static ConfigurableListableBeanFactory beanFactory; private static ApplicationContext applicationContext; @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { SpringUtils.beanFactory = beanFactory; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringUtils.applicationContext = applicationContext; } /** * 获取对象 * * @param name * @return Object 一个以所给名字注册的bean的实例 * @throws BeansException */ @SuppressWarnings("unchecked") public static <T> T getBean(String name) throws BeansException { return (T) beanFactory.getBean(name); } /** * 获取类型为requiredType的对象 * * @param clz * @return * @throws BeansException */ public static <T> T getBean(Class<T> clz) throws BeansException { T result = (T) beanFactory.getBean(clz); return result; } /** * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true * * @param name * @return boolean */ public static boolean containsBean(String name) { return beanFactory.containsBean(name); } /** * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) * * @param name * @return boolean * @throws NoSuchBeanDefinitionException */ public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { return beanFactory.isSingleton(name); } /** * @param name * @return Class 注册对象的类型 * @throws NoSuchBeanDefinitionException */ public static Class<?> getType(String name) throws NoSuchBeanDefinitionException { return beanFactory.getType(name); } /** * 如果给定的bean名字在bean定义中有别名,则返回这些别名 * * @param name * @return * @throws NoSuchBeanDefinitionException */ public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { return beanFactory.getAliases(name); } /** * 获取aop代理对象 * * @param invoker * @return */ @SuppressWarnings("unchecked") public static <T> T getAopProxy(T invoker) { return (T) AopContext.currentProxy(); } /** * 获取当前的环境配置,无配置返回null * * @return 当前的环境配置 */ public static String[] getActiveProfiles() { return applicationContext.getEnvironment().getActiveProfiles(); } /** * 获取当前的环境配置,当有多个环境配置时,只获取第一个 * * @return 当前的环境配置 */ public static String getActiveProfile() { final String[] activeProfiles = getActiveProfiles(); return ArrayUtil.isNotEmpty(activeProfiles) ? activeProfiles[0] : null; } }
执行类
package com.vipsoft.web.task; import cn.hutool.core.date.DateUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component("scheduletask") public class ScheduleTask { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); public void execute(String param) { logger.info("执行 Schedule Task,当前时间:{},任务参数:{}", DateUtil.now(), param); } }
测试类
package com.vipsoft.web; import cn.hutool.core.util.StrUtil; import com.vipsoft.web.utils.SpringUtils; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.lang.reflect.Method; @SpringBootTest public class SpringUtilTest { @Test void invokeTest() throws Exception { //点前面的做为 bean 名称,后面是方法名,(中是参数==参数可以放JSON) String invokeTarget = "scheduletask.execute('VipSoft Quartz')"; invokeMethod(invokeTarget); } void invokeMethod(String invokeTarget) throws Exception { String beanName = StrUtil.subBefore(invokeTarget, ".", true); String methodName = StrUtil.subBetween(invokeTarget, ".", "("); String param = StrUtil.subBetween(invokeTarget, "(", ")"); Object bean; if (StrUtil.count(beanName, ".") == 0) { bean = SpringUtils.getBean(beanName); } else { //Package 的形式得到 Bean,如: beanName="com.vipsoft.web.task.ScheduleTask" bean = Class.forName(beanName).newInstance(); } if (bean != null) { if (StrUtil.isNotEmpty(param)) { Method method = bean.getClass().getDeclaredMethod(methodName, String.class); method.invoke(bean, param); } else { Method method = bean.getClass().getDeclaredMethod(methodName); method.invoke(bean); } } } }