Skip to content

Commit

Permalink
[Dubbo-2678][For Master] Add ability to turn off SPI auto injection, …
Browse files Browse the repository at this point in the history
…special support for Object type. (#2682)

* Add ability to turn off SPI auto injection, special support for generic Object type injection.

* Change Inject to AutoInject since it's main purpose is to turn off auto-injection.

* disable is redundant in DisableInject annotation
  • Loading branch information
chickenlj authored and beiwei30 committed Nov 1, 2018
1 parent c21cc05 commit 3cf801b
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -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 org.apache.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 {
}
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,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) : "";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@
import org.apache.dubbo.common.extension.ext8_add.impl.AddExt4_ManualAdaptive;
import org.apache.dubbo.common.extension.ext9_empty.Ext9Empty;
import org.apache.dubbo.common.extension.ext9_empty.impl.Ext9EmptyImpl;

import org.apache.dubbo.common.extension.injection.InjectExt;
import org.apache.dubbo.common.extension.injection.impl.InjectExtImpl;
import org.junit.Assert;
import org.junit.Test;

Expand Down Expand Up @@ -425,4 +426,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;
Assert.assertNotNull(injectExtImpl.getSimpleExt());
Assert.assertNull(injectExtImpl.getSimpleExt1());
Assert.assertNull(injectExtImpl.getGenericType());
}

}
Original file line number Diff line number Diff line change
@@ -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 org.apache.dubbo.common.extension.injection;

import org.apache.dubbo.common.extension.SPI;

/**
*
*/
@SPI("injection")
public interface InjectExt {
String echo(String msg);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* 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.common.extension.injection.impl;

import org.apache.dubbo.common.extension.DisableInject;
import org.apache.dubbo.common.extension.ext1.SimpleExt;
import org.apache.dubbo.common.extension.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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
injection=org.apache.dubbo.common.extension.injection.impl.InjectExtImpl
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
*/
package org.apache.dubbo.config.spring.extension;

import java.util.Set;
import org.apache.dubbo.common.extension.ExtensionFactory;
import org.apache.dubbo.common.extension.SPI;
import org.apache.dubbo.common.logger.Logger;
Expand All @@ -26,6 +25,8 @@
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
import org.springframework.context.ApplicationContext;

import java.util.Set;

/**
* SpringExtensionFactory
*/
Expand Down Expand Up @@ -69,21 +70,25 @@ public <T> T getExtension(Class<T> 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);
}
}
}

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;
}
Expand Down

0 comments on commit 3cf801b

Please sign in to comment.