servicecomb-java-chassis icon indicating copy to clipboard operation
servicecomb-java-chassis copied to clipboard

@RpcReference注解在某些场景会失效

Open sunshinexp1 opened this issue 2 years ago • 6 comments

针对这个@RpcReference失效的bean进行debug定位,发现初始化,执行到applyBeanPostProcessorsBeforeInitialization时,对应的RpcReferenceProcessor还没有被registerBeanPostProcessors注册上,能否提高一点RpcReferenceProcessor注册的优先级,比如实现PriorityOrdered接口,确保RpcReferenceProcessor更早一点注册,避免时序问题导致部分@RpcReference失效。

sunshinexp1 avatar Mar 22 '22 07:03 sunshinexp1

能提供下具体的写法代码吗?

liubao68 avatar Mar 22 '22 12:03 liubao68

我提供一个Demo吧,三个类: 接口类:

public interface DemoInterface {
    void test();
}

接口实现类:

@Service
public class DemoInterfaceImpl implements DemoInterface {
    @RpcReference(microserviceName = "DemoService", schemaId = "demo-api")
    private IDemoService demoService;
    
    @Override
    public void test() {
        System.out.println("test");
    }
}

DemoBean类实现FactoryBean,并且通过构造函数注入上述的DemoInterfaceImpl

@Service
public class DemoBean implements FactoryBean<String> {
    @Setter
    private DemoInterface demoInterface;
    
    @Autowired
    public DemoBean(DemoInterface demoInterface) {
        this.demoInterface = demoInterface;
    }
    
    @Override
    public String getObject() {
        return "demoBean";
    }

    @Override
    public Class<?> getObjectType() {
        return String.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

最后出现的问题就是接口实现类DemoInterfaceImpl里的@RpcReference注解不生效

sunshinexp1 avatar Mar 23 '22 06:03 sunshinexp1

能提供下具体的写法代码吗?

Demo代码已经提供,可以看看是否有问题。

sunshinexp1 avatar Mar 23 '22 06:03 sunshinexp1

感觉这个不是一个合理的使用场景。 FactoryBean 的加载时机比一般的普通 Bean 早, 你的例子中 DemoBean 依赖了 DemoInterface , 导致了 DemoInterfaceImpl 被提前加载, 而这个时候, Spring 的 BeanPostProcessor 都还未初始化。

印象中 Spring 新版本对这种请都会打印警告的。

liubao68 avatar Nov 09 '23 06:11 liubao68