Skip to content

Commit

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

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

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

* disable() is redundant in DisableInject annotation.
  • Loading branch information
chickenlj authored and beiwei30 committed Nov 1, 2018
1 parent bcb1899 commit 0b0e8b5
Show file tree
Hide file tree
Showing 7 changed files with 143 additions and 3 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 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 {
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) : "";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
}

}
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 com.alibaba.dubbo.common.extensionloader.injection;

import com.alibaba.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,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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
injection=com.alibaba.dubbo.common.extensionloader.injection.impl.InjectExtImpl
Original file line number Diff line number Diff line change
Expand Up @@ -60,21 +60,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 0b0e8b5

Please sign in to comment.