dubbo-@Refrence

@Reference(check = false/*,url = "dubbo://localhost:20880"*/,group = "helloA"/*,version = "*"*/)
private IHelloService helloServiceA;

使用这个注解后,在spring的容器中找不到这个Bean,那他是怎么注入的呢,
dubbo中AnnotationBean

@Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        if (!isMatchPackage(bean)) {//判断是否dubbo指定扫描的包
            return bean;
        }

        Class<?> clazz = bean.getClass();
        if (AopUtils.isAopProxy(bean)) {
            clazz = AopUtils.getTargetClass(bean);
        }
        //如果获取值还是代理,则需要进一步解析
        if (clazz.getSimpleName().contains("$$")) {
            clazz = clazz.getSuperclass();
        }

        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            String name = method.getName();
            if (name.length() > 3 && name.startsWith("set")
                    && method.getParameterTypes().length == 1
                    && Modifier.isPublic(method.getModifiers())
                    && !Modifier.isStatic(method.getModifiers())) {
                try {
                    
                    Reference reference = method.getAnnotation(Reference.class);
                    if (reference != null) {
                        Object value = refer(reference, method.getParameterTypes()[0]);
                        if (value != null) {
                            method.invoke(bean, new Object[]{});
                        }
                    }
                } catch (Throwable e) {
                    logger.error("Failed to init remote service reference at method " + name + " in class " + bean.getClass().getName() + ", cause: " + e.getMessage(), e);
                }
            }
        }
        Field[] fields = bean.getClass().getDeclaredFields();
        for (Field field : fields) {
            try {
                if (!field.isAccessible()) {
                    field.setAccessible(true);
                }
                //判断使用指定了@Reference注解
                Reference reference = field.getAnnotation(Reference.class);
                if (reference != null) {
                    //创建代理对象
                    Object value = refer(reference, field.getType());
                    if (value != null) {
                        //给接口赋值,如例IHelloService helloServiceA
                        field.set(bean, value);
                    }
                }
            } catch (Throwable e) {
                logger.error("Failed to init remote service reference at filed " + field.getName() + " in class " + bean.getClass().getName() + ", cause: " + e.getMessage(), e);
            }
        }
        return bean;
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,095评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,149评论 6 342
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan阅读 9,776评论 2 7
  • 五年是一个什么样的概念, 八年是一个什么样的概念? 距离第一次喜欢他,八年了; 距离第一次爱上他和她,五年了; 我...
    CVerant阅读 1,423评论 0 1
  • 大家都希望自己的职业生涯顺风顺水,职务不断提升,位置越来越重要,成就感越来越强。比如说:参加PMP考试;学习行业法...
    甲坤阅读 3,590评论 0 0

友情链接更多精彩内容