一、对象执行器
对象执行器只需要3步即可以做到
1. 根据bean名称(可配置)获取对应的实例。
Object beanObject = SpringBeanUtil.getBean(beanName);
2. 获取实例的方法(方法名和类型可配置)
beanMethod = beanObject.getClass().getMethod(methodName, List.class);
3. 方法调用(请求参数可配置)
beanResult = beanMethod.invoke(beanObject, paramList);
其他一些内容可以参考:
public final class SpringBeanUtil implements ApplicationContextAware {
private static ApplicationContext ctx;
public static boolean contains(String beanName) {
if (ctx == null) {
throw new NullPointerException("ApplicationContext is null");
}
return ctx.containsBean(beanName);
}
public static Object getBean(String id) {
if (ctx == null) {
throw new NullPointerException("ApplicationContext is null");
}
return ctx.getBean(id);
}
public static <T> T getBean(Class<T> clazz) {
if (ctx == null) {
throw new NullPointerException("ApplicationContext is null");
}
return ctx.getBean(clazz);
}
/**
* 装配self manager object
*
* @param existingBean 需要被装配的对象
*/
public static void autowireBean(Object existingBean) {
if (ctx == null) {
throw new NullPointerException("ApplicationContext is null");
}
ctx.getAutowireCapableBeanFactory().autowireBean(existingBean);
}
public static <T> Map<String, T> getBeans(Class<T> type) {
if (ctx == null) {
throw new NullPointerException("ApplicationContext is null");
} else {
Map map = null;
try {
map = ctx.getBeansOfType(type);
} catch (BeansException var3) {
}
return map;
}
}
@Override
public void setApplicationContext(ApplicationContext applicationcontext)
throws BeansException {
ctx = applicationcontext;
}
/**
* 查看SpringContext中是否包含bean的定义
*
* @param beanName
*/
public static boolean containsBeanDefinition(String beanName) {
ConfigurableApplicationContext context = (ConfigurableApplicationContext) ctx;
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) context.getBeanFactory();
return beanFactory.containsBeanDefinition(beanName);
}
/**
* 注册SpringBean定义
*
* @param beanName
* @param beanDefinition
*/
public static void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {
ConfigurableApplicationContext context = (ConfigurableApplicationContext) ctx;
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) context.getBeanFactory();
beanFactory.registerBeanDefinition(beanName, beanDefinition);
}
/**
* 移除SpringBean定义
*
* @param beanName
*/
public static void removeBeanDefinition(String beanName) {
ConfigurableApplicationContext context = (ConfigurableApplicationContext) ctx;
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) context.getBeanFactory();
beanFactory.removeBeanDefinition(beanName);
}
}
Method Class.getMethod(String name, Class<?>... parameterTypes)的作用是获得对象所声明的公开方法。
该方法的第一个参数name是要获得方法的名字,第二个参数parameterTypes是按声明顺序标识该方法形参类型。
二、动态sql执行器
1. 获取DataSources的实现类
Map<String, DataSource> dataSourceMap = SpringContextUtil.getBeans(DataSource.class);
2. 组装jdbc(key可以配置)
JdbcTemplate jdbcTemplate = new JdbcTemplate((DataSource) dataSourceMap.get(key));
3. 根据业务组装sql(动态组装)
4. jdbc执行sql
jdbcTemplate.update(sql)
核心代码
@Slf4j
@DependsOn("springContextUtil")
@Component
public class SqlService implements InitializingBean {
private static Map<String, JdbcTemplate> jdbcTemplateMap;
@Override
public void afterPropertiesSet() throws Exception {
getNewConfig();
}
public void getNewConfig() {
Map<String, DataSource> dataSourceMap = SpringContextUtil.getBeans(DataSource.class);
if (MapUtils.isEmpty(dataSourceMap)) {
} else {
jdbcTemplateMap = Maps.newHashMap();
Iterator var2 = dataSourceMap.keySet().iterator();
while (var2.hasNext()) {
String key = (String) var2.next();
JdbcTemplate jdbcTemplate = new JdbcTemplate((DataSource) dataSourceMap.get(key));
jdbcTemplateMap.put(key, jdbcTemplate);
}
}
}
public int doUpsert(String dbSign, String sql) throws SQLException {
if(StringUtils.isEmpty(sql)){
throw new SQLException("sql不能为空!");
}
JdbcTemplate jdbcTemplate = (JdbcTemplate) jdbcTemplateMap.get(dbSign);
if (jdbcTemplate == null) {
getNewConfig();
jdbcTemplate = (JdbcTemplate) jdbcTemplateMap.get(dbSign);
}
int result = jdbcTemplate.update(sql);
return result;
}
}
三、动态redis执行器
1. 获取不同的库
2. 获取key-value(可以配置)
3. 执行