diff --git a/dubbo-common/src/main/java/com/alibaba/dubbo/common/extension/DisableInject.java b/dubbo-common/src/main/java/com/alibaba/dubbo/common/extension/DisableInject.java new file mode 100644 index 00000000000..3f83834ca7f --- /dev/null +++ b/dubbo-common/src/main/java/com/alibaba/dubbo/common/extension/DisableInject.java @@ -0,0 +1,29 @@ +/* + * 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 com.alibaba.dubbo.common.extension; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +public @interface DisableInject { +} diff --git a/dubbo-common/src/main/java/com/alibaba/dubbo/common/extension/ExtensionLoader.java b/dubbo-common/src/main/java/com/alibaba/dubbo/common/extension/ExtensionLoader.java index 7509a3d56db..94c59bb7f05 100644 --- a/dubbo-common/src/main/java/com/alibaba/dubbo/common/extension/ExtensionLoader.java +++ b/dubbo-common/src/main/java/com/alibaba/dubbo/common/extension/ExtensionLoader.java @@ -515,6 +515,12 @@ private T injectExtension(T instance) { if (method.getName().startsWith("set") && method.getParameterTypes().length == 1 && Modifier.isPublic(method.getModifiers())) { + /** + * Check {@link DisableInject} to see if we need auto injection for this property + */ + if (method.getAnnotation(DisableInject.class) != null) { + continue; + } Class pt = method.getParameterTypes()[0]; try { String property = method.getName().length() > 3 ? method.getName().substring(3, 4).toLowerCase() + method.getName().substring(4) : ""; diff --git a/dubbo-common/src/test/java/com/alibaba/dubbo/common/extensionloader/ExtensionLoaderTest.java b/dubbo-common/src/test/java/com/alibaba/dubbo/common/extensionloader/ExtensionLoaderTest.java index 3f7900c38b6..e6ef0281b7f 100644 --- a/dubbo-common/src/test/java/com/alibaba/dubbo/common/extensionloader/ExtensionLoaderTest.java +++ b/dubbo-common/src/test/java/com/alibaba/dubbo/common/extensionloader/ExtensionLoaderTest.java @@ -46,6 +46,8 @@ import com.alibaba.dubbo.common.extensionloader.ext8_add.impl.AddExt4_ManualAdaptive; import com.alibaba.dubbo.common.extensionloader.ext9_empty.Ext9Empty; import com.alibaba.dubbo.common.extensionloader.ext9_empty.impl.Ext9EmptyImpl; +import com.alibaba.dubbo.common.extensionloader.injection.InjectExt; +import com.alibaba.dubbo.common.extensionloader.injection.impl.InjectExtImpl; import junit.framework.Assert; import org.junit.Test; @@ -416,4 +418,14 @@ public void testLoadDefaultActivateExtension() throws Exception { Assert.assertTrue(list.get(1).getClass() == OrderActivateExtImpl1.class); } + @Test + public void testInjectExtension() { + // test default + InjectExt injectExt = ExtensionLoader.getExtensionLoader(InjectExt.class).getExtension("injection"); + InjectExtImpl injectExtImpl = (InjectExtImpl) injectExt; + org.junit.Assert.assertNotNull(injectExtImpl.getSimpleExt()); + org.junit.Assert.assertNull(injectExtImpl.getSimpleExt1()); + org.junit.Assert.assertNull(injectExtImpl.getGenericType()); + } + } \ No newline at end of file diff --git a/dubbo-common/src/test/java/com/alibaba/dubbo/common/extensionloader/injection/InjectExt.java b/dubbo-common/src/test/java/com/alibaba/dubbo/common/extensionloader/injection/InjectExt.java new file mode 100644 index 00000000000..a9d48dd6e59 --- /dev/null +++ b/dubbo-common/src/test/java/com/alibaba/dubbo/common/extensionloader/injection/InjectExt.java @@ -0,0 +1,27 @@ +/* + * 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 com.alibaba.dubbo.common.extensionloader.injection; + +import com.alibaba.dubbo.common.extension.SPI; + +/** + * + */ +@SPI("injection") +public interface InjectExt { + String echo(String msg); +} diff --git a/dubbo-common/src/test/java/com/alibaba/dubbo/common/extensionloader/injection/impl/InjectExtImpl.java b/dubbo-common/src/test/java/com/alibaba/dubbo/common/extensionloader/injection/impl/InjectExtImpl.java new file mode 100644 index 00000000000..c2965931345 --- /dev/null +++ b/dubbo-common/src/test/java/com/alibaba/dubbo/common/extensionloader/injection/impl/InjectExtImpl.java @@ -0,0 +1,61 @@ +/* + * 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 com.alibaba.dubbo.common.extensionloader.injection.impl; + + +import com.alibaba.dubbo.common.extension.DisableInject; +import com.alibaba.dubbo.common.extensionloader.ext1.SimpleExt; +import com.alibaba.dubbo.common.extensionloader.injection.InjectExt; + +public class InjectExtImpl implements InjectExt { + + private SimpleExt simpleExt; + + private SimpleExt simpleExt1; + + private Object genericType; + + public void setSimpleExt(SimpleExt simpleExt) { + this.simpleExt = simpleExt; + } + + @DisableInject + public void setSimpleExt1(SimpleExt simpleExt1) { + this.simpleExt1 = simpleExt1; + } + + public void setGenericType(Object genericType) { + this.genericType = genericType; + } + + @Override + public String echo(String msg) { + return null; + } + + public SimpleExt getSimpleExt() { + return simpleExt; + } + + public SimpleExt getSimpleExt1() { + return simpleExt1; + } + + public Object getGenericType() { + return genericType; + } +} diff --git a/dubbo-common/src/test/resources/META-INF/dubbo/internal/com.alibaba.dubbo.common.extensionloader.injection.InjectExt b/dubbo-common/src/test/resources/META-INF/dubbo/internal/com.alibaba.dubbo.common.extensionloader.injection.InjectExt new file mode 100644 index 00000000000..687d18d5380 --- /dev/null +++ b/dubbo-common/src/test/resources/META-INF/dubbo/internal/com.alibaba.dubbo.common.extensionloader.injection.InjectExt @@ -0,0 +1 @@ +injection=com.alibaba.dubbo.common.extensionloader.injection.impl.InjectExtImpl \ No newline at end of file diff --git a/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/extension/SpringExtensionFactory.java b/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/extension/SpringExtensionFactory.java index 389515d1f1d..8673b3925fd 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/extension/SpringExtensionFactory.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/com/alibaba/dubbo/config/spring/extension/SpringExtensionFactory.java @@ -60,13 +60,17 @@ public T getExtension(Class type, String name) { } } - logger.warn("No spring extension(bean) named:" + name + ", try to find an extension(bean) of type " + type.getName()); + logger.warn("No spring extension (bean) named:" + name + ", try to find an extension (bean) of type " + type.getName()); + + if (Object.class == type) { + return null; + } for (ApplicationContext context : contexts) { try { return context.getBean(type); } catch (NoUniqueBeanDefinitionException multiBeanExe) { - throw multiBeanExe; + logger.warn("Find more than 1 spring extensions (beans) of type " + type.getName() + ", will stop auto injection. Please make sure you have specified the concrete parameter type and there's only one extension of that type."); } catch (NoSuchBeanDefinitionException noBeanExe) { if (logger.isDebugEnabled()) { logger.debug("Error when get spring extension(bean) for type:" + type.getName(), noBeanExe); @@ -74,7 +78,7 @@ public T getExtension(Class type, String name) { } } - logger.warn("No spring extension(bean) named:" + name + ", type:" + type.getName() + " found, stop get bean."); + logger.warn("No spring extension (bean) named:" + name + ", type:" + type.getName() + " found, stop get bean."); return null; }