• 创建自己的标签 + 通过创建的标签来验证 + invoke进行夸程序调用


    //主逻辑-------------------------------------------------------------

    public void createHtml() {

    if (this.jobLockService.getRunPrivilege(JobLockEntity.JOB_jobId_createHtml)) {
    // 定义佳兆业生成协议业务调用
    //描述:proActiveAware.achieved()
    //1.应用上下文中是否有当前class的 Bean
    //2.校验当前传参的类型 是否有 @SingleProActive的标签
    if (this.proActiveAware.achieved(ProductAgreement.class)) {
    //proActiveAware.invoke()方法
    //描述: 1.extract() 获取到 唯一的 ProductAgreement类
    //2.内部类Result装配当前类的相关信息
    //3.将当前装配类返回
    this.proActiveAware.invoke(new Execution<ProductAgreement, Void>() {
    @Override
    public Void execute(ProductAgreement arg0) {
    //成功调用ext版本的方法()
    return arg0.createHtmlLog();
    }
    }, ProductAgreement.class);


    } else {
    //验证失败 调用基线 的 方法
    this.createHtmlLog();
    }
    }
    }

    //主逻辑-------------------------------------------------------------

    //----------------------------------------------ProActiveAware  -------------------------------------

    package com.guohuai.basic.component.proactive;

    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.TreeMap;

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationContext;
    import org.springframework.stereotype.Service;

    @Service
    public class ProActiveAware {

    @Autowired
    private ApplicationContext context;

    public <T extends ProActive> boolean achieved(Class<T> clazz) {
    final Map<String, T> map = this.context.getBeansOfType(clazz);
    if (map.size() <= 0) {
    return false;
    }
    if (clazz.isAnnotationPresent(SingleProActive.class)) {
    if (map.size() > 1) {
    Class<?>[] impls = new Class<?>[map.size()];
    int i = 0;
    for (Map.Entry<String, T> entry : map.entrySet()) {
    impls[i] = entry.getValue().getClass();
    i++;
    }
    throw new MultiImplProActiveException(clazz, impls);
    }
    }
    return true;

    }

    public <T extends ProActive> Map<String, T> extract(Class<T> clazz) {

    final Map<String, T> map = this.context.getBeansOfType(clazz);

    if (clazz.isAnnotationPresent(SingleProActive.class)) {
    if (map.size() > 1) {
    Class<?>[] impls = new Class<?>[map.size()];
    int i = 0;
    for (Map.Entry<String, T> entry : map.entrySet()) {
    impls[i] = entry.getValue().getClass();
    i++;
    }
    throw new MultiImplProActiveException(clazz, impls);
    } else {
    return map;
    }
    }

    TreeMap<String, T> tmap = new TreeMap<String, T>(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
    T o1t = map.get(o1);
    T o2t = map.get(o2);
    int x = o1t.priority().compareTo(o2t.priority());
    return x == 0 ? o1.compareTo(o2) : x;
    }
    });
    if (null != map && map.size() > 0) {
    for (Map.Entry<String, T> entry : map.entrySet()) {
    tmap.put(entry.getKey(), entry.getValue());
    }
    }
    return tmap;
    }

    public <T extends ProActive, R extends Object> List<ProActive.Result<R>> invoke(ProActive.Execution<T, R> execution, Class<T> clazz) {

    Map<String, T> proactives = this.extract(clazz);

    List<ProActive.Result<R>> result = new ArrayList<ProActive.Result<R>>();

    if (null != proactives && proactives.size() > 0) {
    for (Entry<String, T> entry : proactives.entrySet()) {
    ProActive.Result<R> er = new ProActive.Result<R>();
    er.setName(entry.getKey());
    er.setClazz(entry.getValue().getClass());
    R r = execution.execute(entry.getValue());
    er.setResult(r);
    result.add(er);
    }
    }

    return result;
    }

    }

    //-----------------------------------------用于跨系统调用的类-----------------------------------------

    @SingleProActive
    public interface ProductAgreement extends ProActive {
    /**
    * 佳兆业生成html
    * @return
    */
    public Void createHtmlLog();
    }

    //-----------------------------------------用于跨系统调用的类-----------------------------------------

    //+ 标签创建----------------------------------------------------------

    package com.guohuai.basic.component.proactive;

    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;

    @Documented
    @Target({ ElementType.TYPE })
    @Retention(RetentionPolicy.RUNTIME)
    public @interface SingleProActive {

    }

    //+ 标签创建----------------------------------------------------------

    //----------------------------用于继承 逻辑泛型类---------------------

    package com.guohuai.basic.component.proactive;

    import lombok.Data;

    public abstract interface ProActive {

    public abstract Integer priority();

    public static abstract interface Execution<T extends ProActive, R extends Object> {
    public abstract R execute(T t);
    }

    @Data
    public static class Result<R> {
    private String name;
    private Class<?> clazz;
    private R result;
    }

    }

    //-----------------------------------------------------------------------------

  • 相关阅读:
    CSS定位属性position相关介绍
    JavaScript 预解析机制
    使用 python 实现π的计算
    turtle库的学习
    关于使用MVVM模式在WPF的DataGrid控件中实现ComboBox编辑列
    关于wpf窗体中Allowtransparent和WindowsFormsHost的纠纷
    关于WPF中ItemsControl系列控件中Item不能继承父级的DataContext的解决办法
    Python简史
    敏捷开发原则
    线程池
  • 原文地址:https://www.cnblogs.com/lize1215/p/8628996.html
Copyright © 2020-2023  润新知