动态执行器

一、对象执行器

对象执行器只需要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. 执行


 

猜你喜欢

转载自blog.csdn.net/maoyeqiu/article/details/118959873