Skip to content

JPlugin扩展开发

sunlet edited this page May 13, 2022 · 14 revisions

让你的JavaBean能处理RefXXX的引用关系

    PluginEnvirement.getInstance().resolveRefAnnotation(object);
    #注意:在启动阶段,这个调用完毕以后相关Ref不会立即生效,但是会在后续阶段专门对属性赋值。

增加一个@RefXXX支持,或者属性上的标注支持,比如:想在JPlugin管理的Bean当中增加Spring的@AutoWire支持

  • 步骤一:写一个实现类实现IAnnoForAttrHandler 接口,泛型是标注类。比如:下面是RefService的实现:

      public class ServiceAttrAnnoHandler implements IAnnoForAttrHandler<RefService> {
      
      	public static IServiceExtensionResolver serviceExtensionResolver;
      
      	public Class<RefService> getAnnoClass() {
      		return RefService.class;
      	}
      
      	public Class getAttrClass() {
      		return Object.class;
      	}
      
      	/**
      	 * 先查找RuleService,再查找Service
      	 */
      	public Object getValue(Object theObject, Class fieldType, RefService anno) {
      		Object o=null;
      		try {
      			// 发生查找错误,不要抛出异常,后续查找
      			if (serviceExtensionResolver != null) {
      				o = serviceExtensionResolver.resolve(theObject, fieldType, anno);
      			}
      		} catch (RuntimeException e) {
      			o = null;
      		}
      		
      		if (o == null){
      			o = get(fieldType,anno);
      		}
      		return o;
      	}
      
      	private Object get(Class fieldType, RefService anno) {
      
      		if (anno.name().equals(""))
      			return ServiceFactory.getService(fieldType);
      		else
      			return ServiceFactory.getService(anno.name(), fieldType);
      
      	}
      }
    
      补充说明:如果有必要可以实现接口的 另一个defualt方法 default Object  getValue(Object theObject,Class fieldType,Field f, T anno) ,可以获取到的信息更多一些。
    
  • 步骤二:在Plugin的构造函数当中,加入下面一句:

      public Plugin(){
          ...
          ExtensionKernelHelper.addAnnoAttrHandlerExtension(this, AnnoForExtensionsHandler.class);
          ...
      }