美文网首页
说一说反射机制在zuul的类ZuulFilterInitiali

说一说反射机制在zuul的类ZuulFilterInitiali

作者: 天草二十六_简村人 | 来源:发表于2022-05-21 13:50 被阅读0次
    • spring的工具类ReflectionUtils
    • 先查找到目标域
    • 然后修改为可访问状态
    • 最后得到对象,执行对象的方法。
     private final ConcurrentHashMap<String, List<ZuulFilter>> hashFiltersByType = new ConcurrentHashMap();
    
        import org.springframework.util.ReflectionUtils;
    
        private void clearLoaderCache() {
            Field field = ReflectionUtils.findField(FilterLoader.class, "hashFiltersByType");
            ReflectionUtils.makeAccessible(field);
            Map cache = (Map)ReflectionUtils.getField(field, this.filterLoader);
            cache.clear();
        }
    

    最后贴出类的完整代码:

    • 定义变量及构造函数
     private final Map<String, ZuulFilter> filters;
        private final CounterFactory counterFactory;
        private final TracerFactory tracerFactory;
        private final FilterLoader filterLoader;
        private final FilterRegistry filterRegistry;
    
        public ZuulFilterInitializer(Map<String, ZuulFilter> filters, CounterFactory counterFactory, TracerFactory tracerFactory, FilterLoader filterLoader, FilterRegistry filterRegistry) {
            this.filters = filters;
            this.counterFactory = counterFactory;
            this.tracerFactory = tracerFactory;
            this.filterLoader = filterLoader;
            this.filterRegistry = filterRegistry;
        }
    
    • @PostConstruct 用于在初始化时,要做的动作

    • @PreDestroy 用于容器销毁前,要做的清理工作,这里就涉及到上文的clearLoaderCache()

    package org.springframework.cloud.netflix.zuul;
    
    import com.netflix.zuul.FilterLoader;
    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.filters.FilterRegistry;
    import com.netflix.zuul.monitoring.CounterFactory;
    import com.netflix.zuul.monitoring.TracerFactory;
    import java.lang.reflect.Field;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.util.ReflectionUtils;
    
    public class ZuulFilterInitializer {
        private static final Log log = LogFactory.getLog(ZuulFilterInitializer.class);
        private final Map<String, ZuulFilter> filters;
        private final CounterFactory counterFactory;
        private final TracerFactory tracerFactory;
        private final FilterLoader filterLoader;
        private final FilterRegistry filterRegistry;
    
        public ZuulFilterInitializer(Map<String, ZuulFilter> filters, CounterFactory counterFactory, TracerFactory tracerFactory, FilterLoader filterLoader, FilterRegistry filterRegistry) {
            this.filters = filters;
            this.counterFactory = counterFactory;
            this.tracerFactory = tracerFactory;
            this.filterLoader = filterLoader;
            this.filterRegistry = filterRegistry;
        }
    
        @PostConstruct
        public void contextInitialized() {
            log.info("Starting filter initializer");
            TracerFactory.initialize(this.tracerFactory);
            CounterFactory.initialize(this.counterFactory);
            Iterator var1 = this.filters.entrySet().iterator();
    
            while(var1.hasNext()) {
                Entry<String, ZuulFilter> entry = (Entry)var1.next();
                this.filterRegistry.put((String)entry.getKey(), (ZuulFilter)entry.getValue());
            }
    
        }
    
        @PreDestroy
        public void contextDestroyed() {
            log.info("Stopping filter initializer");
            Iterator var1 = this.filters.entrySet().iterator();
    
            while(var1.hasNext()) {
                Entry<String, ZuulFilter> entry = (Entry)var1.next();
                this.filterRegistry.remove((String)entry.getKey());
            }
    
            this.clearLoaderCache();
            TracerFactory.initialize((TracerFactory)null);
            CounterFactory.initialize((CounterFactory)null);
        }
    
        private void clearLoaderCache() {
            Field field = ReflectionUtils.findField(FilterLoader.class, "hashFiltersByType");
            ReflectionUtils.makeAccessible(field);
            Map cache = (Map)ReflectionUtils.getField(field, this.filterLoader);
            cache.clear();
        }
    }
    
    

    相关文章

      网友评论

          本文标题:说一说反射机制在zuul的类ZuulFilterInitiali

          本文链接:https://www.haomeiwen.com/subject/mnctprtx.html