1. 程式人生 > 其它 >應用例項_資料庫+反射結合應用例項

應用例項_資料庫+反射結合應用例項

技術標籤:應用例項

場景

不同型別的單據通過審批操作變為不同的狀態,不同狀態的單據同意/駁回呼叫的方法不同。在資料庫內配置不同單據在不同狀態呼叫不同名稱的方法,結合反射達到靈活配置的目的。

資料庫設計

1c8c5cadd9cfa7061e4fd80aba27d16a.png

應用

  • spring容器獲取相應service
@Component("springContextUtil")
public class SpringContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext applicationContext) {
        SpringContextUtil.applicationContext = applicationContext;
    }

    /**
     * 獲取應用上下文
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 根據bean名稱獲取例項-------類名首字母小寫
    
     */
    public static <T> T getBean(String name) {
        return (T) applicationContext.getBean(name);
    }

    /**
     * 根據class獲取例項
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz) {
        return (T) applicationContext.getBean(clazz);
    }

    /**
     * 根據class獲取例項map
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> Map<String, T> getBeansOfType(Class<T> clazz) {
        return applicationContext.getBeansOfType(clazz);
    }

}
  • 反射呼叫
private Map<String, Object> invokMethod(Object serviceClass, String methodName, String serviceName, Map<String, Object> paramsMap,
      String tipMsg)
{
   Class clazz = serviceClass.getClass();
   try
   {
      Method method = clazz.getMethod(methodName, HashMap.class);
      logger.info("呼叫配置的處理類"+serviceName+"的方法"+methodName);
      if(method != null)
      {
         //進入相應的方法
         return (Map<String, Object>) method.invoke(serviceClass, paramsMap);
      }
      else
      {
         throw new Exception("配置的處理類"+serviceName+"的方法"+methodName+"找不到!");
      }
   }