FeignIndexEarlyCreator.java 2.04 KB
Newer Older
hulei committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
package com.brilliance.isc.event;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeansException;
import org.springframework.cloud.client.discovery.event.InstanceRegisteredEvent;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.event.EventListener;
import org.springframework.core.env.Environment;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;

import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.Objects;

/**
 * @author 766193
 * 2023/11/24 14:39
 */
@Component
public class FeignIndexEarlyCreator implements ApplicationContextAware, EnvironmentAware {

    private final LoadBalancerClientFactory factory;
    private ApplicationContext context;
    private Environment environment;

    public FeignIndexEarlyCreator(LoadBalancerClientFactory factory) {
        this.factory = factory;
    }

    @EventListener(InstanceRegisteredEvent.class)
    public void onInstanceRegisteredEvent() {
        context.getBeansWithAnnotation(FeignClient.class).values().stream()
                .map(Object::getClass)
                .filter(Proxy::isProxyClass)
                .flatMap(it -> Arrays.stream(it.getInterfaces()))
                .map(it -> it.getAnnotation(FeignClient.class))
                .filter(Objects::nonNull)
                .map(it -> StringUtils.defaultIfEmpty(it.name(), it.value()))
                .map(it -> environment.resolvePlaceholders(it))
                .forEach(factory::getInstance);
    }

    @Override
    public void setApplicationContext(@NonNull ApplicationContext context) throws BeansException {
        this.context = context;
    }

    @Override
    public void setEnvironment(@NonNull Environment environment) {
        this.environment = environment;
    }
}