Search in sources :

Example 1 with Reference

use of com.alibaba.dubbo.config.annotation.Reference in project dubbo by alibaba.

the class AnnotationBean method postProcessBeforeInitialization.

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    if (!isMatchPackage(bean)) {
        return bean;
    }
    Method[] methods = bean.getClass().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[] { value });
                    }
                }
            } 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 = field.getAnnotation(Reference.class);
            if (reference != null) {
                Object value = refer(reference, field.getType());
                if (value != null) {
                    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;
}
Also used : Field(java.lang.reflect.Field) Reference(com.alibaba.dubbo.config.annotation.Reference) Method(java.lang.reflect.Method)

Example 2 with Reference

use of com.alibaba.dubbo.config.annotation.Reference in project incubator-dubbo-spring-boot-project by apache.

the class DubboMvcEndpoint method resolveReferenceBean.

private ReferenceBean<?> resolveReferenceBean(InjectionMetadata.InjectedElement injectedElement, ConcurrentMap<String, ReferenceBean<?>> referenceBeansCache) {
    // Member is Field or Method annotated @Reference
    Member member = injectedElement.getMember();
    Class<?> beanClass = null;
    Reference reference = getFieldValue(injectedElement, "reference", Reference.class);
    if (member instanceof Field) {
        Field field = (Field) member;
        beanClass = field.getType();
    } else if (member instanceof Method) {
        Method method = (Method) member;
        beanClass = ((Method) member).getReturnType();
    } else {
        if (logger.isWarnEnabled()) {
            logger.warn("What's wrong with Member? Member should not be Field or Method");
        }
        throw new IllegalStateException("What's wrong with Member? Member should not be Field or Method");
    }
    String referenceBeanCacheKey = generateReferenceBeanCacheKey(reference, beanClass);
    return referenceBeansCache.get(referenceBeanCacheKey);
}
Also used : Field(java.lang.reflect.Field) Reference(com.alibaba.dubbo.config.annotation.Reference) Method(java.lang.reflect.Method) RequestMethod(org.springframework.web.bind.annotation.RequestMethod) Member(java.lang.reflect.Member)

Aggregations

Reference (com.alibaba.dubbo.config.annotation.Reference)2 Field (java.lang.reflect.Field)2 Method (java.lang.reflect.Method)2 Member (java.lang.reflect.Member)1 RequestMethod (org.springframework.web.bind.annotation.RequestMethod)1