spring框架根据配置 动态 根据类名、方法名执行方法
·
一. 调用service类
- 工具类
package com.gracechain.orientaleagle.domain.notification.util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Map;
/****************************************************
*
* Spring Context 相关工具类
*
*
* @author lrd
* @version 1.0
**************************************************/
@Component
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringUtils.applicationContext = applicationContext;
}
public static <T> T getBean(String beanName) {
if(applicationContext.containsBean(beanName)){
return (T) applicationContext.getBean(beanName);
}else{
return null;
}
}
public static <T> Map<String, T> getBeansOfType(Class<T> baseType){
return applicationContext.getBeansOfType(baseType);
}
//测试类 可删除
public String test(String str){
System.out.println(">>>>>>>>>>>>>");
return str;
}
}
- 配置属性 这里只配置了类名 方法名同样

- 调用的service

- 调用
package com.gracechain.orientaleagle.domain.notification.util;
import com.gracechain.orientaleagle.domain.notification.constant.SmsTemplate;
import com.gracechain.orientaleagle.domain.system.entity.LocalUserEntity;
import io.lettuce.core.dynamic.support.ReflectionUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/**
* 根据配置文件 动态获取短信接口service
* 执行发送方法
*/
@Slf4j
@Component
public class SendSmsNotification {
//根据配置文件获取短信接口service
@Value("${sendsms.serviceName}")
public String serviceName;
//方法名
private String methodName = "sendSmsNotification";
//方法的参数类型
private Class param1 = com.gracechain.orientaleagle.domain.system.entity.LocalUserEntity.class;
private Class param2 = com.gracechain.orientaleagle.domain.notification.constant.SmsTemplate.class;
private Class param3 = java.lang.Object.class;
/**
* 获取service 并执行发送方法
*/
public Object sendSms(LocalUserEntity localUser, SmsTemplate templateCode, Object templateParam){
Object result = null;
try {
// 获取service
Object service = SpringUtils.getBean(serviceName);
//查看内部方法 可删除
Method[] methods = service.getClass().getDeclaredMethods();
for (Method m : methods) {
System.out.println(m);
}
System.out.println("----------------------");
// 传递需要执行的方法
Method method = ReflectionUtils.findMethod(service.getClass(), methodName, param1, param2, param3);
// 调用的方法有多个参数 Method method = classzz.getMethod("class1method",long.class,String.class,String.class);
// 如果调用的方法有参数 invoke(o,param1,param2,param3,...)
result = ReflectionUtils.invokeMethod(method, service, localUser, templateCode, templateParam);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
//具体调用 注入后直接调用即可
@Autowired
private SendSmsNotification sendSmsNotification;
sendSmsNotification.sendSms(user, SmsTemplate.ALTER, null);

普通类
直接获取class后执行即可
Object result = null;
try {
// 包名+类名 (工具类中的测试方法)
Class classzz = Class.forName("com.gracechain.orientaleagle.domain.notification.util.SpringUtils");
Method method = ReflectionUtils.findMethod(classzz,"test", java.lang.String.class);
result = ReflectionUtils.invokeMethod(method, classzz.newInstance(), "22222");
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
return result;
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)