You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2019/05/27 09:54:21 UTC
[camel] branch master updated (1dcf9dc -> 2524e7a)
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git.
from 1dcf9dc Regen
new 703b385 CAMEL-13582: Camel Main - @BindToRegistry are processed earlier and for methods then process them in order where the most basic methods are executed first.
new 2524e7a CAMEL-13583: Camel Injector should have method for creating new instance without bean post processing which is not needed when loading internal Camel factory classes and the likes. This makes Camel startup faster and reduces the overhead of post processing/scanning classes/methods etc.
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../org/apache/camel/cdi/CdiCamelInjector.java | 7 +++-
.../camel/component/jcr/JcrConverterTest.java | 5 +++
.../apache/camel/spring/spi/SpringInjector.java | 12 +++++-
.../main/java/org/apache/camel/spi/Injector.java | 14 ++++++-
.../impl/converter/BaseTypeConverterRegistry.java | 2 +-
.../impl/engine/BeanProcessorFactoryResolver.java | 2 +-
.../impl/engine/BeanProxyFactoryResolver.java | 2 +-
.../impl/engine/DefaultCamelBeanPostProcessor.java | 49 +++++++++++++++++++---
.../impl/engine/DefaultComponentResolver.java | 2 +-
.../impl/engine/DefaultDataFormatResolver.java | 2 +-
.../camel/impl/engine/DefaultFactoryFinder.java | 2 +-
.../apache/camel/impl/engine/DefaultInjector.java | 9 +++-
.../camel/impl/engine/DefaultLanguageResolver.java | 4 +-
.../impl/engine/HeadersMapFactoryResolver.java | 2 +-
.../impl/engine/RestRegistryFactoryResolver.java | 2 +-
.../camel/processor/SendDynamicAwareResolver.java | 2 +-
.../impl/cloud/ServiceCallProcessorFactory.java | 2 +-
.../org/apache/camel/core/osgi/impl/Activator.java | 4 +-
.../xml/AbstractCamelContextFactoryBeanTest.java | 6 +++
.../java/org/apache/camel/model/ModelHelper.java | 2 +-
.../cloud/ServiceCallExpressionConfiguration.java | 2 +-
.../ServiceCallServiceChooserConfiguration.java | 2 +-
.../ServiceCallServiceDiscoveryConfiguration.java | 2 +-
.../ServiceCallServiceFilterConfiguration.java | 2 +-
...erviceCallServiceLoadBalancerConfiguration.java | 2 +-
.../reifier/loadbalancer/LoadBalancerReifier.java | 2 +-
.../transformer/CustomTransformeReifier.java | 2 +-
.../reifier/validator/CustomValidatorReifier.java | 2 +-
.../impl/engine/DefaultFactoryFinderTest.java | 4 +-
.../org/apache/camel/util/ReflectionInjector.java | 9 +++-
30 files changed, 124 insertions(+), 37 deletions(-)
[camel] 02/02: CAMEL-13583: Camel Injector should have method for
creating new instance without bean post processing which is not needed when
loading internal Camel factory classes and the likes. This makes Camel
startup faster and reduces the overhead of post processing/scanning
classes/methods etc.
Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 2524e7a044cf9747e9583f3f448c9b0dedfc83a4
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon May 27 11:15:27 2019 +0200
CAMEL-13583: Camel Injector should have method for creating new instance without bean post processing which is not needed when loading internal Camel factory classes and the likes. This makes Camel startup faster and reduces the overhead of post processing/scanning classes/methods etc.
---
.../main/java/org/apache/camel/cdi/CdiCamelInjector.java | 7 ++++++-
.../org/apache/camel/component/jcr/JcrConverterTest.java | 5 +++++
.../java/org/apache/camel/spring/spi/SpringInjector.java | 12 +++++++++++-
.../src/main/java/org/apache/camel/spi/Injector.java | 14 ++++++++++++--
.../camel/impl/converter/BaseTypeConverterRegistry.java | 2 +-
.../camel/impl/engine/BeanProcessorFactoryResolver.java | 2 +-
.../apache/camel/impl/engine/BeanProxyFactoryResolver.java | 2 +-
.../apache/camel/impl/engine/DefaultComponentResolver.java | 2 +-
.../camel/impl/engine/DefaultDataFormatResolver.java | 2 +-
.../org/apache/camel/impl/engine/DefaultFactoryFinder.java | 2 +-
.../java/org/apache/camel/impl/engine/DefaultInjector.java | 9 +++++++--
.../apache/camel/impl/engine/DefaultLanguageResolver.java | 4 ++--
.../camel/impl/engine/HeadersMapFactoryResolver.java | 2 +-
.../camel/impl/engine/RestRegistryFactoryResolver.java | 2 +-
.../apache/camel/processor/SendDynamicAwareResolver.java | 2 +-
.../camel/impl/cloud/ServiceCallProcessorFactory.java | 2 +-
.../java/org/apache/camel/core/osgi/impl/Activator.java | 4 ++--
.../core/xml/AbstractCamelContextFactoryBeanTest.java | 6 ++++++
.../src/main/java/org/apache/camel/model/ModelHelper.java | 2 +-
.../model/cloud/ServiceCallExpressionConfiguration.java | 2 +-
.../cloud/ServiceCallServiceChooserConfiguration.java | 2 +-
.../cloud/ServiceCallServiceDiscoveryConfiguration.java | 2 +-
.../model/cloud/ServiceCallServiceFilterConfiguration.java | 2 +-
.../cloud/ServiceCallServiceLoadBalancerConfiguration.java | 2 +-
.../camel/reifier/loadbalancer/LoadBalancerReifier.java | 2 +-
.../camel/reifier/transformer/CustomTransformeReifier.java | 2 +-
.../camel/reifier/validator/CustomValidatorReifier.java | 2 +-
.../apache/camel/impl/engine/DefaultFactoryFinderTest.java | 4 ++--
.../java/org/apache/camel/util/ReflectionInjector.java | 9 ++++++++-
29 files changed, 80 insertions(+), 32 deletions(-)
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelInjector.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelInjector.java
index a4d8563..582b3ee 100644
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelInjector.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelInjector.java
@@ -35,8 +35,13 @@ final class CdiCamelInjector implements Injector {
@Override
public <T> T newInstance(Class<T> type) {
+ return newInstance(type, true);
+ }
+
+ @Override
+ public <T> T newInstance(Class<T> type, boolean postProcessBean) {
return getReferenceByType(manager, type)
- .orElseGet(() -> injector.newInstance(type));
+ .orElseGet(() -> injector.newInstance(type, postProcessBean));
}
@Override
diff --git a/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrConverterTest.java b/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrConverterTest.java
index 8feee6b..ac1f35f 100644
--- a/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrConverterTest.java
+++ b/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrConverterTest.java
@@ -50,6 +50,11 @@ public class JcrConverterTest extends Assert {
new Injector() {
@Override
public <T> T newInstance(Class<T> type) {
+ return newInstance(type, true);
+ }
+
+ @Override
+ public <T> T newInstance(Class<T> type, boolean postProcessBean) {
return ObjectHelper.newInstance(type);
}
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringInjector.java b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringInjector.java
index d7e4471..7d50435 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringInjector.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringInjector.java
@@ -33,7 +33,17 @@ public class SpringInjector implements Injector {
}
public <T> T newInstance(Class<T> type) {
- Object value = applicationContext.getBeanFactory().createBean(type, autowireMode, dependencyCheck);
+ return newInstance(type, true);
+ }
+
+ @Override
+ public <T> T newInstance(Class<T> type, boolean postProcessBean) {
+ Object value;
+ if (postProcessBean) {
+ value = applicationContext.getBeanFactory().createBean(type, autowireMode, dependencyCheck);
+ } else {
+ value = applicationContext.getBeanFactory().createBean(type, AutowireCapableBeanFactory.AUTOWIRE_NO, false);
+ }
return type.cast(value);
}
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/Injector.java b/core/camel-api/src/main/java/org/apache/camel/spi/Injector.java
index 4e39809..81c7fa1 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/Injector.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/Injector.java
@@ -24,8 +24,8 @@ package org.apache.camel.spi;
public interface Injector {
/**
- * Instantiates a new instance of the given type possibly injecting values
- * into the object in the process
+ * Instantiates a new instance of the given type; possibly injecting values
+ * into the object in the process (bean post processing)
*
* @param type the type of object to create
* @return a newly created instance
@@ -33,6 +33,16 @@ public interface Injector {
<T> T newInstance(Class<T> type);
/**
+ * Instantiates a new instance of the given type; possibly injecting values
+ * into the object in the process (bean post processing if enabled)
+ *
+ * @param type the type of object to create
+ * @param postProcessBean whether to post process the bean
+ * @return a newly created instance
+ */
+ <T> T newInstance(Class<T> type, boolean postProcessBean);
+
+ /**
* Whether the injector supports creating new instances using auto-wiring.
* If this is possible then bean instances is attempt first to be created this way
* and if not, then the bean can only be created if there is a public no-arg constructor.
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
index 622e69c..8f45f4d 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
@@ -536,7 +536,7 @@ public abstract class BaseTypeConverterRegistry extends ServiceSupport implement
.map(cl -> ObjectHelper.loadClass(name, cl))
.filter(Objects::nonNull)
.findAny().orElseThrow(() -> new ClassNotFoundException(name));
- Object obj = getInjector().newInstance(clazz);
+ Object obj = getInjector().newInstance(clazz, false);
if (obj instanceof TypeConverterLoader) {
TypeConverterLoader loader = (TypeConverterLoader) obj;
log.debug("TypeConverterLoader: {} loading converters", name);
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProcessorFactoryResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProcessorFactoryResolver.java
index 2dcca85..cc9f375 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProcessorFactoryResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProcessorFactoryResolver.java
@@ -50,7 +50,7 @@ public class BeanProcessorFactoryResolver {
LOG.debug("Found BeanProxyFactory: {} via: {}{}", type.getName(), factoryFinder.getResourcePath(), "bean-processor-factory");
}
if (BeanProcessorFactory.class.isAssignableFrom(type)) {
- BeanProcessorFactory answer = (BeanProcessorFactory) context.getInjector().newInstance(type);
+ BeanProcessorFactory answer = (BeanProcessorFactory) context.getInjector().newInstance(type, false);
LOG.debug("Detected and using BeanProcessorFactory: {}", answer);
return answer;
} else {
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProxyFactoryResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProxyFactoryResolver.java
index cbe233c..39405f6 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProxyFactoryResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/BeanProxyFactoryResolver.java
@@ -50,7 +50,7 @@ public class BeanProxyFactoryResolver {
LOG.debug("Found BeanProxyFactory: {} via: {}{}", type.getName(), factoryFinder.getResourcePath(), "bean-proxy-factory");
}
if (BeanProxyFactory.class.isAssignableFrom(type)) {
- BeanProxyFactory answer = (BeanProxyFactory) context.getInjector().newInstance(type);
+ BeanProxyFactory answer = (BeanProxyFactory) context.getInjector().newInstance(type, false);
LOG.debug("Detected and using BeanProxyFactory: {}", answer);
return answer;
} else {
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultComponentResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultComponentResolver.java
index a847bd9..0e66b22 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultComponentResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultComponentResolver.java
@@ -69,7 +69,7 @@ public class DefaultComponentResolver implements ComponentResolver {
// create the component
if (Component.class.isAssignableFrom(type)) {
- return (Component) context.getInjector().newInstance(type);
+ return (Component) context.getInjector().newInstance(type, false);
} else {
throw new IllegalArgumentException("Type is not a Component implementation. Found: " + type.getName());
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultDataFormatResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultDataFormatResolver.java
index 378d428..1d7f3a9 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultDataFormatResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultDataFormatResolver.java
@@ -85,7 +85,7 @@ public class DefaultDataFormatResolver implements DataFormatResolver {
if (type != null) {
if (DataFormat.class.isAssignableFrom(type)) {
- dataFormat = (DataFormat) context.getInjector().newInstance(type);
+ dataFormat = (DataFormat) context.getInjector().newInstance(type, false);
} else {
throw new IllegalArgumentException("Resolving dataformat: " + name + " detected type conflict: Not a DataFormat implementation. Found: " + type.getName());
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultFactoryFinder.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultFactoryFinder.java
index 94b72ea..68df342 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultFactoryFinder.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultFactoryFinder.java
@@ -108,7 +108,7 @@ public class DefaultFactoryFinder implements FactoryFinder {
private <T> T newInstance(String key, Injector injector, String propertyPrefix, Class<T> expectedType)
throws IOException, ClassNotFoundException {
Class<?> type = findClass(key, propertyPrefix);
- Object value = injector.newInstance(type);
+ Object value = injector.newInstance(type, false);
if (expectedType.isInstance(value)) {
return expectedType.cast(value);
} else {
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInjector.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInjector.java
index 76f583b..eee18ed 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInjector.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInjector.java
@@ -41,13 +41,18 @@ public class DefaultInjector implements Injector {
@Override
public <T> T newInstance(Class<T> type) {
+ return newInstance(type, true);
+ }
+
+ @Override
+ public <T> T newInstance(Class<T> type, boolean postProcessBean) {
T answer = ObjectHelper.newInstance(type);
- if (answer != null) {
+ if (answer != null && postProcessBean) {
try {
postProcessor.postProcessBeforeInitialization(answer, answer.getClass().getName());
postProcessor.postProcessAfterInitialization(answer, answer.getClass().getName());
} catch (Exception e) {
- throw new RuntimeCamelException("Error during post processing of bean " + answer, e);
+ throw new RuntimeCamelException("Error during post processing of bean: " + answer, e);
}
}
return answer;
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultLanguageResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultLanguageResolver.java
index 511fac9..e8d264a 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultLanguageResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultLanguageResolver.java
@@ -58,7 +58,7 @@ public class DefaultLanguageResolver implements LanguageResolver {
if (type != null) {
if (Language.class.isAssignableFrom(type)) {
- return (Language) context.getInjector().newInstance(type);
+ return (Language) context.getInjector().newInstance(type, false);
} else {
throw new IllegalArgumentException("Resolving language: " + name + " detected type conflict: Not a Language implementation. Found: " + type.getName());
}
@@ -82,7 +82,7 @@ public class DefaultLanguageResolver implements LanguageResolver {
}
if (type != null) {
if (LanguageResolver.class.isAssignableFrom(type)) {
- LanguageResolver resolver = (LanguageResolver) context.getInjector().newInstance(type);
+ LanguageResolver resolver = (LanguageResolver) context.getInjector().newInstance(type, false);
return resolver.resolveLanguage(name, context);
} else {
throw new IllegalArgumentException("Resolving language: " + name + " detected type conflict: Not a LanguageResolver implementation. Found: " + type.getName());
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/HeadersMapFactoryResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/HeadersMapFactoryResolver.java
index daa4825..0a8e72d 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/HeadersMapFactoryResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/HeadersMapFactoryResolver.java
@@ -52,7 +52,7 @@ public class HeadersMapFactoryResolver {
LOG.debug("Found HeadersMapFactory: {} via: {}{}", type.getName(), factoryFinder.getResourcePath(), "headers-map-factory");
}
if (HeadersMapFactory.class.isAssignableFrom(type)) {
- HeadersMapFactory answer = (HeadersMapFactory) context.getInjector().newInstance(type);
+ HeadersMapFactory answer = (HeadersMapFactory) context.getInjector().newInstance(type, false);
LOG.info("Detected and using custom HeadersMapFactory: {}", answer);
return answer;
} else {
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/RestRegistryFactoryResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/RestRegistryFactoryResolver.java
index 130ef9f..a63263b 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/RestRegistryFactoryResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/RestRegistryFactoryResolver.java
@@ -52,7 +52,7 @@ public class RestRegistryFactoryResolver {
LOG.debug("Found RestRegistryFactory: {} via: {}{}", type.getName(), factoryFinder.getResourcePath(), "rest-registry-factory");
}
if (RestRegistryFactory.class.isAssignableFrom(type)) {
- RestRegistryFactory answer = (RestRegistryFactory) context.getInjector().newInstance(type);
+ RestRegistryFactory answer = (RestRegistryFactory) context.getInjector().newInstance(type, false);
LOG.debug("Detected and using RestRegistryFactory: {}", answer);
return answer;
} else {
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/SendDynamicAwareResolver.java b/core/camel-base/src/main/java/org/apache/camel/processor/SendDynamicAwareResolver.java
index 5d3222a..c221bae 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/SendDynamicAwareResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/SendDynamicAwareResolver.java
@@ -49,7 +49,7 @@ public class SendDynamicAwareResolver {
LOG.debug("Found SendDynamicAware: {} via: {}{}", type.getName(), factoryFinder.getResourcePath(), name);
}
if (SendDynamicAware.class.isAssignableFrom(type)) {
- SendDynamicAware answer = (SendDynamicAware) context.getInjector().newInstance(type);
+ SendDynamicAware answer = (SendDynamicAware) context.getInjector().newInstance(type, false);
answer.setScheme(scheme);
return answer;
} else {
diff --git a/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/ServiceCallProcessorFactory.java b/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/ServiceCallProcessorFactory.java
index 5016a03..fb4e5b4 100644
--- a/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/ServiceCallProcessorFactory.java
+++ b/core/camel-cloud/src/main/java/org/apache/camel/impl/cloud/ServiceCallProcessorFactory.java
@@ -390,7 +390,7 @@ public class ServiceCallProcessorFactory extends TypedProcessorFactory<ServiceCa
if (ObjectHelper.isNotEmpty(type)) {
if (ServiceExpressionFactory.class.isAssignableFrom(type)) {
- factory = (ServiceExpressionFactory)camelContext.getInjector().newInstance(type);
+ factory = (ServiceExpressionFactory)camelContext.getInjector().newInstance(type, false);
} else {
throw new IllegalArgumentException("Resolving Expression: " + lookupName + " detected type conflict: Not a ServiceExpressionFactory implementation. Found: "
+ type.getName());
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/impl/Activator.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/impl/Activator.java
index 5203363..dd105b0 100644
--- a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/impl/Activator.java
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/impl/Activator.java
@@ -544,11 +544,11 @@ public class Activator implements BundleActivator, BundleTrackerCustomizer<Objec
try {
Properties properties = loadProperties(url);
String classname = (String) properties.get("class");
- Class<?> type = bundle.loadClass(classname);
+ Class type = bundle.loadClass(classname);
if (!this.type.isAssignableFrom(type)) {
throw new IllegalArgumentException("Type is not a " + this.type.getName() + " implementation. Found: " + type.getName());
}
- return injector.newInstance((Class<T>) type);
+ return (T) injector.newInstance(type, false);
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException("Invalid URI, no " + this.type.getName() + " registered for scheme : " + name, e);
}
diff --git a/core/camel-core-xml/src/test/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBeanTest.java b/core/camel-core-xml/src/test/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBeanTest.java
index 7aed727..8bfcdf1 100644
--- a/core/camel-core-xml/src/test/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBeanTest.java
+++ b/core/camel-core-xml/src/test/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBeanTest.java
@@ -65,8 +65,14 @@ public class AbstractCamelContextFactoryBeanTest {
new Injector() {
@Override
public <T> T newInstance(Class<T> type) {
+ return newInstance(type, false);
+ }
+
+ @Override
+ public <T> T newInstance(Class<T> type, boolean postProcessBean) {
return ObjectHelper.newInstance(type);
}
+
@Override
public boolean supportsAutoWiring() {
return false;
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java b/core/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
index 1f5efd8..8885c49 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
@@ -425,7 +425,7 @@ public final class ModelHelper {
XmlConverter xmlConverter;
if (context != null) {
TypeConverterRegistry registry = context.getTypeConverterRegistry();
- xmlConverter = registry.getInjector().newInstance(XmlConverter.class);
+ xmlConverter = registry.getInjector().newInstance(XmlConverter.class, false);
} else {
xmlConverter = new XmlConverter();
}
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
index d9f753c..0cd2d61 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallExpressionConfiguration.java
@@ -235,7 +235,7 @@ public class ServiceCallExpressionConfiguration extends IdentifiedType implement
if (type != null) {
if (ServiceExpressionFactory.class.isAssignableFrom(type)) {
- factory = (ServiceExpressionFactory) camelContext.getInjector().newInstance(type);
+ factory = (ServiceExpressionFactory) camelContext.getInjector().newInstance(type, false);
} else {
throw new IllegalArgumentException(
"Resolving Expression: " + factoryKey + " detected type conflict: Not a ExpressionFactory implementation. Found: " + type.getName());
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
index 2dc6dfc..b3ff1b6 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceChooserConfiguration.java
@@ -153,7 +153,7 @@ public class ServiceCallServiceChooserConfiguration extends IdentifiedType imple
if (type != null) {
if (ServiceChooserFactory.class.isAssignableFrom(type)) {
- factory = (ServiceChooserFactory) camelContext.getInjector().newInstance(type);
+ factory = (ServiceChooserFactory) camelContext.getInjector().newInstance(type, false);
} else {
throw new NoFactoryAvailableException(
"Resolving ServiceChooser: " + factoryKey + " detected type conflict: Not a ServiceChooserFactory implementation. Found: " + type.getName());
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
index d153f41..f9ad9bd 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceDiscoveryConfiguration.java
@@ -160,7 +160,7 @@ public class ServiceCallServiceDiscoveryConfiguration extends IdentifiedType imp
if (type != null) {
if (ServiceDiscoveryFactory.class.isAssignableFrom(type)) {
- factory = (ServiceDiscoveryFactory) camelContext.getInjector().newInstance(type);
+ factory = (ServiceDiscoveryFactory) camelContext.getInjector().newInstance(type, false);
} else {
throw new IllegalArgumentException(
"Resolving ServiceDiscovery: " + factoryKey + " detected type conflict: Not a ServiceDiscoveryFactory implementation. Found: " + type.getName());
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
index db7887e..7a36a9c 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceFilterConfiguration.java
@@ -153,7 +153,7 @@ public class ServiceCallServiceFilterConfiguration extends IdentifiedType implem
if (type != null) {
if (ServiceFilterFactory.class.isAssignableFrom(type)) {
- factory = (ServiceFilterFactory) camelContext.getInjector().newInstance(type);
+ factory = (ServiceFilterFactory) camelContext.getInjector().newInstance(type, false);
} else {
throw new NoFactoryAvailableException(
"Resolving ServiceFilter: " + factoryKey + " detected type conflict: Not a ServiceFilterFactory implementation. Found: " + type.getName());
diff --git a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
index 6794a23..d224f1f 100644
--- a/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
+++ b/core/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
@@ -153,7 +153,7 @@ public class ServiceCallServiceLoadBalancerConfiguration extends IdentifiedType
if (type != null) {
if (ServiceLoadBalancerFactory.class.isAssignableFrom(type)) {
- factory = (ServiceLoadBalancerFactory) camelContext.getInjector().newInstance(type);
+ factory = (ServiceLoadBalancerFactory) camelContext.getInjector().newInstance(type, false);
} else {
throw new IllegalArgumentException(
"Resolving LoadBalancer: " + factoryKey + " detected type conflict: Not a LoadBalancerFactory implementation. Found: " + type.getName());
diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/loadbalancer/LoadBalancerReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/loadbalancer/LoadBalancerReifier.java
index e4bc022..797ac7f 100644
--- a/core/camel-core/src/main/java/org/apache/camel/reifier/loadbalancer/LoadBalancerReifier.java
+++ b/core/camel-core/src/main/java/org/apache/camel/reifier/loadbalancer/LoadBalancerReifier.java
@@ -75,7 +75,7 @@ public class LoadBalancerReifier<T extends LoadBalancerDefinition> {
if (type == null) {
throw new IllegalArgumentException("Cannot find class: " + loadBalancerTypeName + " in the classpath");
}
- answer = (LoadBalancer) routeContext.getCamelContext().getInjector().newInstance(type);
+ answer = (LoadBalancer) routeContext.getCamelContext().getInjector().newInstance(type, false);
definition.configureLoadBalancer(answer);
}
diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java
index 279643b..99afa45 100644
--- a/core/camel-core/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java
+++ b/core/camel-core/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java
@@ -46,7 +46,7 @@ class CustomTransformeReifier extends TransformerReifier<CustomTransformerDefini
if (transformerClass == null) {
throw new IllegalArgumentException("Cannot find transformer class: " + definition.getClassName());
}
- transformer = context.getInjector().newInstance(transformerClass);
+ transformer = context.getInjector().newInstance(transformerClass, false);
}
transformer.setCamelContext(context);
diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java
index 3db2b89..fb35984 100644
--- a/core/camel-core/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java
+++ b/core/camel-core/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java
@@ -46,7 +46,7 @@ class CustomValidatorReifier extends ValidatorReifier<CustomValidatorDefinition>
if (validatorClass == null) {
throw new IllegalArgumentException("Cannot find validator class: " + definition.getClassName());
}
- validator = context.getInjector().newInstance(validatorClass);
+ validator = context.getInjector().newInstance(validatorClass, false);
}
validator.setCamelContext(context);
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/engine/DefaultFactoryFinderTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/engine/DefaultFactoryFinderTest.java
index 0389d2d..bdaa0c3 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/engine/DefaultFactoryFinderTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/engine/DefaultFactoryFinderTest.java
@@ -78,7 +78,7 @@ public class DefaultFactoryFinderTest {
final Injector injector = mock(Injector.class);
final TestImplA expected = new TestImplA();
- when(injector.newInstance(TestImplA.class)).thenReturn(expected);
+ when(injector.newInstance(TestImplA.class, false)).thenReturn(expected);
try {
factoryFinder.newInstances("TestImplA", injector, TestImplB.class);
@@ -123,7 +123,7 @@ public class DefaultFactoryFinderTest {
final Injector injector = mock(Injector.class);
final TestImplA expected = new TestImplA();
- when(injector.newInstance(TestImplA.class)).thenReturn(expected);
+ when(injector.newInstance(TestImplA.class, false)).thenReturn(expected);
final List<TestType> instances = factoryFinder.newInstances("TestImplA", injector, TestType.class);
diff --git a/core/camel-core/src/test/java/org/apache/camel/util/ReflectionInjector.java b/core/camel-core/src/test/java/org/apache/camel/util/ReflectionInjector.java
index 04582e0..ed081a9 100644
--- a/core/camel-core/src/test/java/org/apache/camel/util/ReflectionInjector.java
+++ b/core/camel-core/src/test/java/org/apache/camel/util/ReflectionInjector.java
@@ -22,12 +22,19 @@ import org.apache.camel.support.ObjectHelper;
/**
* A simple implementation of {@link Injector} which just uses reflection to
* instantiate new objects using their zero argument constructor. For more
- * complex implementations try the Spring or Guice implementations.
+ * complex implementations try the Spring or CDI implementations.
*/
public class ReflectionInjector implements Injector {
+ @Override
public <T> T newInstance(Class<T> type) {
+ return newInstance(type, true);
+ }
+
+ @Override
+ public <T> T newInstance(Class<T> type, boolean postProcessBean) {
return ObjectHelper.newInstance(type);
+ // does not support post processing
}
@Override
[camel] 01/02: CAMEL-13582: Camel Main - @BindToRegistry are
processed earlier and for methods then process them in order where the most
basic methods are executed first.
Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 703b3851ad39d6fddf7fe394e9afca965e427907
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon May 27 10:36:09 2019 +0200
CAMEL-13582: Camel Main - @BindToRegistry are processed earlier and for methods then process them in order where the most basic methods are executed first.
---
.../impl/engine/DefaultCamelBeanPostProcessor.java | 49 +++++++++++++++++++---
1 file changed, 44 insertions(+), 5 deletions(-)
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultCamelBeanPostProcessor.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultCamelBeanPostProcessor.java
index 0e7003b..cab3f8b 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultCamelBeanPostProcessor.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultCamelBeanPostProcessor.java
@@ -19,6 +19,9 @@ package org.apache.camel.impl.engine;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
import java.util.Set;
import org.apache.camel.BeanInject;
@@ -81,6 +84,8 @@ public class DefaultCamelBeanPostProcessor implements CamelBeanPostProcessor {
injectClass(bean, beanName);
injectNestedClasses(bean, beanName);
+ injectBindToRegistryFields(bean, beanName);
+ injectBindToRegistryMethods(bean, beanName);
injectFields(bean, beanName);
injectMethods(bean, beanName);
@@ -181,7 +186,13 @@ public class DefaultCamelBeanPostProcessor implements CamelBeanPostProcessor {
String uri = produce.value().isEmpty() ? produce.uri() : produce.value();
injectField(field, uri, produce.property(), bean, beanName, produce.binding());
}
+ }
+ });
+ }
+ protected void injectBindToRegistryFields(final Object bean, final String beanName) {
+ ReflectionHelper.doWithFields(bean.getClass(), new ReflectionHelper.FieldCallback() {
+ public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
BindToRegistry bind = field.getAnnotation(BindToRegistry.class);
if (bind != null && getPostProcessorHelper().matchContext(bind.context())) {
bindToRegistry(field, bind.value(), bean, beanName);
@@ -222,6 +233,29 @@ public class DefaultCamelBeanPostProcessor implements CamelBeanPostProcessor {
});
}
+ protected void injectBindToRegistryMethods(final Object bean, final String beanName) {
+ // sort the methods so the simplest are used first
+
+ final List<Method> methods = new ArrayList<Method>();
+ ReflectionHelper.doWithMethods(bean.getClass(), method -> {
+ BindToRegistry bind = method.getAnnotation(BindToRegistry.class);
+ if (bind != null && getPostProcessorHelper().matchContext(bind.context())) {
+ methods.add(method);
+ }
+ });
+
+ // sort methods on shortest number of parameters as we want to process the most simplest first
+ methods.sort(Comparator.comparingInt(Method::getParameterCount));
+
+ LOG.trace("Discovered {} @BindToRegistry methods", methods.size());
+
+ // bind each method
+ methods.forEach(method -> {
+ BindToRegistry bind = method.getAnnotation(BindToRegistry.class);
+ bindToRegistry(method, bind.value(), bean, beanName);
+ });
+ }
+
protected void injectClass(final Object bean, final String beanName) {
Class<?> clazz = bean.getClass();
BindToRegistry ann = clazz.getAnnotation(BindToRegistry.class);
@@ -264,11 +298,6 @@ public class DefaultCamelBeanPostProcessor implements CamelBeanPostProcessor {
String uri = produce.value().isEmpty() ? produce.uri() : produce.value();
setterInjection(method, bean, beanName, uri, produce.property());
}
-
- BindToRegistry bind = method.getAnnotation(BindToRegistry.class);
- if (bind != null && getPostProcessorHelper().matchContext(bind.context())) {
- bindToRegistry(method, bind.value(), bean, beanName);
- }
}
public void setterInjection(Method method, Object bean, String beanName, String endpointUri, String endpointProperty) {
@@ -408,6 +437,16 @@ public class DefaultCamelBeanPostProcessor implements CamelBeanPostProcessor {
parameters[i] = camelContext.getTypeConverter().convertTo(type, value);
}
}
+ } else {
+ // okay attempt to default to singleton instances from the registry
+ Set<?> instances = camelContext.getRegistry().findByType(type);
+ if (instances.size() == 1) {
+ parameters[i] = instances.iterator().next();
+ } else {
+ // there are multiple instances of the same type, so barf
+ throw new IllegalArgumentException("Multiple beans of the same type: " + type
+ + " exists in the Camel registry. Specify the bean name on @BeanInject to bind to a single bean, at the method: " + method);
+ }
}
}