package com.matrix.core.tools.rr; import com.matrix.core.pojo.AjaxResult; import com.matrix.core.tools.WebUtil; import groovy.lang.GroovyClassLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.annotation.AnnotationUtils; import javax.annotation.Resource; import java.lang.reflect.Field; import java.lang.reflect.Modifier; /** * glue factory, product class/object by name * @author xuxueli 2016-1-2 20:02:27 */ public class GlueFactory { private static Logger logger = LoggerFactory.getLogger(GlueFactory.class); /** * groovy class loader */ private GroovyClassLoader groovyClassLoader = new GroovyClassLoader(); // ----------------------------- spring support ----------------------------- private static GlueFactory glueFactory = new GlueFactory(); public static GlueFactory getInstance(){ return glueFactory; } /** * inject action of spring * @param instance */ private void injectService(Object instance){ if (instance==null) { return; } Field[] fields = instance.getClass().getDeclaredFields(); for (Field field : fields) { if (Modifier.isStatic(field.getModifiers())) { continue; } Object fieldBean = null; // with bean-id, bean could be found by both @Resource and @Autowired, or bean could only be found by @Autowired if (AnnotationUtils.getAnnotation(field, Resource.class) != null) { try { Resource resource = AnnotationUtils.getAnnotation(field, Resource.class); if (resource.name()!=null && resource.name().length()>0){ fieldBean = WebUtil.getApplicationContext().getBean(resource.name()); } else { fieldBean = WebUtil.getApplicationContext().getBean(field.getName()); } } catch (Exception e) { } if (fieldBean==null ) { fieldBean = WebUtil.getApplicationContext().getBean(field.getType()); } } else if (AnnotationUtils.getAnnotation(field, Autowired.class) != null) { Qualifier qualifier = AnnotationUtils.getAnnotation(field, Qualifier.class); if (qualifier!=null && qualifier.value()!=null && qualifier.value().length()>0) { fieldBean = WebUtil.getApplicationContext().getBean(qualifier.value()); } else { fieldBean = WebUtil.getApplicationContext().getBean(field.getType()); } } if (fieldBean!=null) { field.setAccessible(true); try { field.set(instance, fieldBean); } catch (IllegalArgumentException e) { logger.error(e.getMessage(), e); } catch (IllegalAccessException e) { logger.error(e.getMessage(), e); } } } } // ----------------------------- load instance ----------------------------- // load new instance, prototype public AjaxResult loadNewInstance(String codeSource) throws Exception{ if (codeSource!=null && codeSource.trim().length()>0) { Class clazz = groovyClassLoader.parseClass(codeSource); if (clazz != null) { Object instance = clazz.newInstance(); if (instance!=null) { if (instance instanceof GroovyRunable) { this.injectService(instance); return ((GroovyRunable) instance).run(); } else { throw new IllegalArgumentException(">>>>>>>>>>> xxl-glue, loadNewInstance error, " + "cannot convert from instance["+ instance.getClass() +"] to IJobHandler"); } } } } throw new IllegalArgumentException(">>>>>>>>>>> xxl-glue, loadNewInstance error, instance is null"); } /** * 根据字符串获取几个java实例 * @param codeSource * @return * @throws Exception */ public Object loadInstance(String codeSource) throws Exception{ if (codeSource!=null && codeSource.trim().length()>0) { Class clazz = groovyClassLoader.parseClass(codeSource); if (clazz != null) { Object instance = clazz.newInstance(); if (instance!=null) { this.injectService(instance); return instance; } } } throw new IllegalArgumentException(">>>>>>>>>>> xxl-glue, loadNewInstance error, instance is null"); } }