package github.javaguide.spring; import github.javaguide.annotation.RpcService; import github.javaguide.entity.RpcServiceProperties; import github.javaguide.factory.SingletonFactory; import github.javaguide.provider.ServiceProvider; import github.javaguide.provider.ServiceProviderImpl; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.stereotype.Component; /** * call this method before creating the bean to see if the class is annotated * * @author shuang.kou * @createTime 2020年07月14日 16:42:00 */ @Slf4j @Component public class SpringBeanPostProcessor implements BeanPostProcessor { private final ServiceProvider serviceProvider; public SpringBeanPostProcessor() { serviceProvider = SingletonFactory.getInstance(ServiceProviderImpl.class); } @SneakyThrows @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (bean.getClass().isAnnotationPresent(RpcService.class)) { log.info("[{}] is annotated with [{}]", bean.getClass().getName(), RpcService.class.getCanonicalName()); // get RpcService annotation RpcService rpcService = bean.getClass().getAnnotation(RpcService.class); // build RpcServiceProperties RpcServiceProperties rpcServiceProperties = RpcServiceProperties.builder() .group(rpcService.group()).version(rpcService.version()).build(); serviceProvider.publishService(bean, rpcServiceProperties); } return bean; } }