写在前面的话:

        项目需求中,涉及到在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
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐