Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

allow @Service and @Reference to merge attributes form annotations in lower levels of the annotation hierachy. #4078

Merged
merged 7 commits into from
Jun 27, 2019
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@

import static org.springframework.core.BridgeMethodResolver.findBridgedMethod;
import static org.springframework.core.BridgeMethodResolver.isVisibilityBridgeMethodPair;
import static org.springframework.core.annotation.AnnotationUtils.findAnnotation;
import static org.springframework.core.annotation.AnnotationUtils.getAnnotation;
import static org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation;
import static org.springframework.core.annotation.AnnotatedElementUtils.getMergedAnnotation;

/**
* {@link org.springframework.beans.factory.config.BeanPostProcessor} implementation
Expand Down Expand Up @@ -116,7 +116,7 @@ private List<ReferenceFieldElement> findFieldReferenceMetadata(final Class<?> be
@Override
public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {

Reference reference = getAnnotation(field, Reference.class);
Reference reference = getMergedAnnotation(field, Reference.class);

if (reference != null) {

Expand Down Expand Up @@ -157,7 +157,7 @@ public void doWith(Method method) throws IllegalArgumentException, IllegalAccess
return;
}

Reference reference = findAnnotation(bridgedMethod, Reference.class);
Reference reference = findMergedAnnotation(bridgedMethod, Reference.class);

if (reference != null && method.equals(ClassUtils.getMostSpecificMethod(method, beanClass))) {
if (Modifier.isStatic(method.getModifiers())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
import static org.apache.dubbo.config.spring.util.ObjectUtils.of;
import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition;
import static org.springframework.context.annotation.AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR;
import static org.springframework.core.annotation.AnnotationUtils.findAnnotation;
import static org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation;
import static org.springframework.util.ClassUtils.resolveClassName;

/**
Expand Down Expand Up @@ -251,7 +251,7 @@ private void registerServiceBean(BeanDefinitionHolder beanDefinitionHolder, Bean

Class<?> beanClass = resolveClass(beanDefinitionHolder);

Service service = findAnnotation(beanClass, Service.class);
Service service = findMergedAnnotation(beanClass, Service.class);

Class<?> interfaceClass = resolveServiceInterfaceClass(beanClass, service);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@
import static org.apache.dubbo.config.spring.util.ClassUtils.resolveGenericType;
import static org.springframework.core.BridgeMethodResolver.findBridgedMethod;
import static org.springframework.core.BridgeMethodResolver.isVisibilityBridgeMethodPair;
import static org.springframework.core.annotation.AnnotationUtils.findAnnotation;
import static org.springframework.core.annotation.AnnotationUtils.getAnnotation;
import static org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation;
import static org.springframework.core.annotation.AnnotatedElementUtils.getMergedAnnotation;

/**
* Abstract generic {@link BeanPostProcessor} implementation for customized annotation that annotated injected-object.
Expand Down Expand Up @@ -150,7 +150,7 @@ private List<AnnotationInjectedBeanPostProcessor.AnnotatedFieldElement> findFiel

ReflectionUtils.doWithFields(beanClass, field -> {

A annotation = getAnnotation(field, getAnnotationType());
A annotation = getMergedAnnotation(field, getAnnotationType());

if (annotation != null) {

Expand Down Expand Up @@ -188,7 +188,7 @@ private List<AnnotationInjectedBeanPostProcessor.AnnotatedMethodElement> findAnn
return;
}

A annotation = findAnnotation(bridgedMethod, getAnnotationType());
A annotation = findMergedAnnotation(bridgedMethod, getAnnotationType());

if (annotation != null && method.equals(ClassUtils.getMostSpecificMethod(method, beanClass))) {
if (Modifier.isStatic(method.getModifiers())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
import static org.apache.dubbo.config.spring.util.ObjectUtils.of;
import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition;
import static org.springframework.context.annotation.AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR;
import static org.springframework.core.annotation.AnnotationUtils.findAnnotation;
import static org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation;
import static org.springframework.util.ClassUtils.resolveClassName;

/**
Expand Down Expand Up @@ -250,7 +250,7 @@ private void registerServiceBean(BeanDefinitionHolder beanDefinitionHolder, Bean

Class<?> beanClass = resolveClass(beanDefinitionHolder);

Service service = findAnnotation(beanClass, Service.class);
Service service = findMergedAnnotation(beanClass, Service.class);

Class<?> interfaceClass = resolveServiceInterfaceClass(beanClass, service);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.config.spring.annotation.merged;


import org.apache.dubbo.config.annotation.Reference;
import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Reference
public @interface MergedReference {

@AliasFor(annotation = Reference.class, attribute = "group")
String group() default "dubbo";

@AliasFor(annotation = Reference.class, attribute = "version")
String version() default "1.0.0";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.config.spring.annotation.merged;


import org.apache.dubbo.config.annotation.Service;
import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Service
public @interface MergedService {

@AliasFor(annotation = Service.class, attribute = "group")
String group() default "dubbo";

@AliasFor(annotation = Service.class, attribute = "version")
String version() default "1.0.0";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.config.spring.beans.factory.annotation;

import org.apache.dubbo.config.annotation.Reference;
import org.apache.dubbo.config.annotation.Service;
import org.apache.dubbo.config.spring.annotation.merged.MergedReference;
import org.apache.dubbo.config.spring.annotation.merged.MergedService;
import org.apache.dubbo.config.spring.api.DemoService;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Field;

public class MergedAnnotationTest {

@Test
public void testMergedReference() {
Field field = ReflectionUtils.findField(MergedAnnotationTest.TestBean1.class, "demoService");
Reference reference = AnnotatedElementUtils.getMergedAnnotation(field, Reference.class);
Assert.assertEquals("dubbo", reference.group());
Assert.assertEquals("1.0.0", reference.version());

Field field2 = ReflectionUtils.findField(MergedAnnotationTest.TestBean2.class, "demoService");
Reference reference2 = AnnotatedElementUtils.getMergedAnnotation(field2, Reference.class);
Assert.assertEquals("group", reference2.group());
Assert.assertEquals("2.0", reference2.version());
}

@Test
public void testMergedService() {
Service service1 = AnnotatedElementUtils.getMergedAnnotation(MergedAnnotationTest.DemoServiceImpl1.class, Service.class);
Assert.assertEquals("dubbo", service1.group());
Assert.assertEquals("1.0.0", service1.version());

Service service2 = AnnotatedElementUtils.getMergedAnnotation(MergedAnnotationTest.DemoServiceImpl2.class, Service.class);
Assert.assertEquals("group", service2.group());
Assert.assertEquals("2.0", service2.version());
}

@MergedService
public static class DemoServiceImpl1 {
}

@MergedService(group = "group", version = "2.0")
public static class DemoServiceImpl2 {
}

private static class TestBean1 {
@MergedReference
private DemoService demoService;
}

private static class TestBean2 {
@MergedReference(group = "group", version = "2.0")
private DemoService demoService;
}

}