继承ApplicationContextAware获取ApplicationContext:
package com.xxxx.xxxx.bean;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static Object getBean(String name) throws BeansException{
return applicationContext.getBean(name);
}
}
这样创造一个工具类即可获取Spring Boot管理的各种Bean。
比如下面这个Service接口:
实现如下:
Controller如下:
这里获取了tableName后,解析tableName的字符串,然后通过反射直接调用service。
EntityAnalys.java如下:
package com.xxxx.xxxx.utils;
import com.xxxx.xxxx.bean.SpringContextUtil;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class EntityAnalyse {
public static Object getAllObject(String tableName, String methodName) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
String tName = tableName + "ServiceImpl";
Class cls = SpringContextUtil.getBean(tName).getClass();
Method m = cls.getDeclaredMethod(methodName);
Object invoke = m.invoke(SpringContextUtil.getBean(tName));
return invoke;
}
public static Object getOneObjectByID(String tableName, String methodName, String id) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
String tName = tableName + "ServiceImpl";
Class cls = SpringContextUtil.getBean(tName).getClass();
Method m = cls.getDeclaredMethod(methodName, String.class);
Object invoke = m.invoke(SpringContextUtil.getBean(tName), id);
return invoke;
}
}