【Java】基于SpringBoot动态调用Service中的方法
项目需求中,涉及到在aop中监听一系列方法,然后动态调用不同的Service中的方法。计划将动态调用Service封装方法提取为共用方法,以传参形式,控制入参实现动态调用,避免业务代码冗余。
·
写在前面的话:
项目需求中,涉及到在aop中监听一系列方法,然后动态调用不同的Service中的方法。计划将动态调用Service封装方法提取为共用方法,以传参形式,控制入参实现动态调用,避免业务代码冗余。
--人,生天地之间,若白驹过隙,忽然而已
目录
一、业务代码示例准备
1、业务代码Service接口
下述示例,分别涵盖了,无参数、单个参数、多个参数的方法情况
/**************************************************** * * 车辆台账 Service接口 * * * @author Francis * @date 2022/10/14 16:30 * @version 1.0 **************************************************/ public interface ICarService { /** * 测试 -- 无参数传入 * * @return list */ String queryCarName(); /** * 测试 --一参数传入 * * @return list */ String queryCarName(String param); /** * 测试 -- 两个参数传入 * * @return list */ String queryCarName(String param1, String param2); }
2、业务代码Service实现类
/**************************************************** * * 车辆台账 Service实现类 * * * @author Francis * @date 2022/10/14 16:31 * @version 1.0 **************************************************/ @Slf4j @Service public class CarServiceImpl implements ICarService { @Override public String queryCarName() { return "无参数传入返回结果"; } @Override public String queryCarName(String param) { return "1个参数传入返回结果1,参数为:" + param; } @Override public String queryCarName(String param1, String param2) { return "2个参数传入返回结果1,参数1为:" + param1 + ",参数2为:" + param2; } }
二、工具类准备
1、获取bean的工具类
package com.zcgk.core.utils; import com.zcgk.core.domain.CodeMsg; import com.zcgk.core.exception.CosyException; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.Objects; /**************************************************** * * Spring Context 相关工具类 * * * @author Francis * @since 2021/3/30 15:03 * @version 1.0 **************************************************/ @Slf4j public class SpringUtils { private static ApplicationContext context = null; public static void setApplicationContext(ApplicationContext context) { SpringUtils.context = context; } public static ApplicationContext getApplicationContext() { return context; } /** * 通过 name 获取bean * * @param name name * @return bean */ public static Object getBean(@NotEmpty String name) { validate(); return getApplicationContext().getBean(name); } /** * 通过 class 获取bean * 例: IUserService userService = SpringUtils.getBean(IUserService.class) * * @param clazz clazz * @param <T> 泛型 * @return bean */ public static <T> T getBean(@NotNull Class<T> clazz) { validate(); return context.getBean(clazz); } /** * 根据 name 和 class 获取bean * * @param name name * @param clazz clazz * @param <T> 泛型 * @return bean */ public static <T> T getBean(@NotEmpty String name, @NonNull Class<T> clazz) { validate(); return getApplicationContext().getBean(name, clazz); } /** * 校验 applicationContext 是否为空 */ private static void validate() { if (Objects.isNull(context)) { throw new CosyException(CodeMsg.APPLICATION_CONTEXT_IS_EMPTY); } } }
2、Application中声明
@EnableScheduling @EnableTransactionManagement @MapperScan("com.francis.modules.*.mapper") @SpringBootApplication(exclude = {DruidDataSourceAutoConfigure.class}) public class Application implements ApplicationListener<ContextRefreshedEvent> { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void onApplicationEvent(ContextRefreshedEvent event) { SpringUtils.setApplicationContext(event.getApplicationContext()); } }
三、调用测试
@Test public void test() { Class<?> clazz = ICarService.class; String beanName = "carServiceImpl"; String methodName = "queryCarName"; // 获取service Object service = SpringUtils.getBean(beanName); // 测试-无参数传入 Method method1 = ReflectionUtils.findMethod(clazz, methodName); Object result1 = ReflectionUtils.invokeMethod(method1, service); // 测试-1个参数传入 String param1 = "我是参数1"; Method method2 = ReflectionUtils.findMethod(clazz, methodName, param1.getClass()); Object result2 = ReflectionUtils.invokeMethod(method2, service, param1); // 测试-2个参数传入 String param2 = "我是参数2"; String param3 = "我是参数3"; Method method3 = ReflectionUtils.findMethod(clazz, methodName, param2.getClass(), param3.getClass()); Object result3 = ReflectionUtils.invokeMethod(method3, service, param2, param3); System.out.println("result1:" + result1); System.out.println("result2:" + result2); System.out.println("result3:" + result3); }
打印结果如下:
result1:无参数传入返回结果 result2:1个参数传入返回结果1,参数为:我是参数1 result3:2个参数传入返回结果1,参数1为:我是参数2,参数2为:我是参数3
更多推荐
已为社区贡献2条内容
所有评论(0)