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/07/17 09:30:15 UTC
[camel] branch master updated: CAMEL-13736: Camel main - Support
bean post processing on @BindToRegistry
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
The following commit(s) were added to refs/heads/master by this push:
new d5fbaf8 CAMEL-13736: Camel main - Support bean post processing on @BindToRegistry
d5fbaf8 is described below
commit d5fbaf8f56041eb6107076f488aa0acd96637333
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Jul 17 11:29:53 2019 +0200
CAMEL-13736: Camel main - Support bean post processing on @BindToRegistry
---
.../main/java/org/apache/camel/BindToRegistry.java | 7 ++-
.../impl/engine/DefaultCamelBeanPostProcessor.java | 39 ++++++++++---
.../impl/BindToRegistryBeanPostProcessorTest.java | 67 ++++++++++++++++++++++
3 files changed, 105 insertions(+), 8 deletions(-)
diff --git a/core/camel-api/src/main/java/org/apache/camel/BindToRegistry.java b/core/camel-api/src/main/java/org/apache/camel/BindToRegistry.java
index ab00b82..c9191b4 100644
--- a/core/camel-api/src/main/java/org/apache/camel/BindToRegistry.java
+++ b/core/camel-api/src/main/java/org/apache/camel/BindToRegistry.java
@@ -23,7 +23,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
- * Used for binding a bean to the registry
+ * Used for binding a bean to the registry.
*
* If no name is specified then the bean will have its name auto computed based on the
* class name, field name, or method name where the annotation is configured.
@@ -42,4 +42,9 @@ public @interface BindToRegistry {
* Id of {@link CamelContext} to use
*/
String context() default "";
+
+ /**
+ * Whether to perform bean post processing (dependency injection) on the bean
+ */
+ boolean beanPostProcess() default false;
}
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 6899089..72019f7 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
@@ -30,6 +30,7 @@ import org.apache.camel.CamelContext;
import org.apache.camel.CamelContextAware;
import org.apache.camel.DeferredContextBinding;
import org.apache.camel.EndpointInject;
+import org.apache.camel.ExtendedCamelContext;
import org.apache.camel.NoSuchBeanException;
import org.apache.camel.Produce;
import org.apache.camel.PropertyInject;
@@ -195,7 +196,7 @@ public class DefaultCamelBeanPostProcessor implements CamelBeanPostProcessor {
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);
+ bindToRegistry(field, bind.value(), bean, beanName, bind.beanPostProcess());
}
}
});
@@ -278,7 +279,7 @@ public class DefaultCamelBeanPostProcessor implements CamelBeanPostProcessor {
// bind each method
methods.forEach(method -> {
BindToRegistry bind = method.getAnnotation(BindToRegistry.class);
- bindToRegistry(method, bind.value(), bean, beanName);
+ bindToRegistry(method, bind.value(), bean, beanName, bind.beanPostProcess());
});
}
@@ -286,7 +287,7 @@ public class DefaultCamelBeanPostProcessor implements CamelBeanPostProcessor {
Class<?> clazz = bean.getClass();
BindToRegistry ann = clazz.getAnnotation(BindToRegistry.class);
if (ann != null && getPostProcessorHelper().matchContext(ann.context())) {
- bindToRegistry(clazz, ann.value(), bean, beanName);
+ bindToRegistry(clazz, ann.value(), bean, beanName, ann.beanPostProcess());
}
}
@@ -296,7 +297,7 @@ public class DefaultCamelBeanPostProcessor implements CamelBeanPostProcessor {
BindToRegistry ann = (BindToRegistry) clazz.getAnnotation(BindToRegistry.class);
if (ann != null && getPostProcessorHelper().matchContext(ann.context())) {
// its a nested class so we dont have a bean instance for it
- bindToRegistry(clazz, ann.value(), null, null);
+ bindToRegistry(clazz, ann.value(), null, null, ann.beanPostProcess());
}
}
});
@@ -360,7 +361,7 @@ public class DefaultCamelBeanPostProcessor implements CamelBeanPostProcessor {
}
}
- private void bindToRegistry(Class<?> clazz, String name, Object bean, String beanName) {
+ private void bindToRegistry(Class<?> clazz, String name, Object bean, String beanName, boolean beanPostProcess) {
if (isEmpty(name)) {
name = clazz.getSimpleName();
}
@@ -368,20 +369,36 @@ public class DefaultCamelBeanPostProcessor implements CamelBeanPostProcessor {
// no bean so then create an instance from its type
bean = camelContext.getInjector().newInstance(clazz);
}
+ if (beanPostProcess) {
+ try {
+ camelContext.adapt(ExtendedCamelContext.class).getBeanPostProcessor().postProcessBeforeInitialization(bean, beanName);
+ camelContext.adapt(ExtendedCamelContext.class).getBeanPostProcessor().postProcessAfterInitialization(bean, beanName);
+ } catch (Exception e) {
+ throw RuntimeCamelException.wrapRuntimeException(e);
+ }
+ }
camelContext.getRegistry().bind(name, bean);
}
- private void bindToRegistry(Field field, String name, Object bean, String beanName) {
+ private void bindToRegistry(Field field, String name, Object bean, String beanName, boolean beanPostProcess) {
if (isEmpty(name)) {
name = field.getName();
}
Object value = ReflectionHelper.getField(field, bean);
if (value != null) {
+ if (beanPostProcess) {
+ try {
+ camelContext.adapt(ExtendedCamelContext.class).getBeanPostProcessor().postProcessBeforeInitialization(value, beanName);
+ camelContext.adapt(ExtendedCamelContext.class).getBeanPostProcessor().postProcessAfterInitialization(value, beanName);
+ } catch (Exception e) {
+ throw RuntimeCamelException.wrapRuntimeException(e);
+ }
+ }
camelContext.getRegistry().bind(name, value);
}
}
- private void bindToRegistry(Method method, String name, Object bean, String beanName) {
+ private void bindToRegistry(Method method, String name, Object bean, String beanName, boolean beanPostProcess) {
if (isEmpty(name)) {
name = method.getName();
}
@@ -399,6 +416,14 @@ public class DefaultCamelBeanPostProcessor implements CamelBeanPostProcessor {
value = invokeMethod(method, bean);
}
if (value != null) {
+ if (beanPostProcess) {
+ try {
+ camelContext.adapt(ExtendedCamelContext.class).getBeanPostProcessor().postProcessBeforeInitialization(value, beanName);
+ camelContext.adapt(ExtendedCamelContext.class).getBeanPostProcessor().postProcessAfterInitialization(value, beanName);
+ } catch (Exception e) {
+ throw RuntimeCamelException.wrapRuntimeException(e);
+ }
+ }
camelContext.getRegistry().bind(name, value);
}
}
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/BindToRegistryBeanPostProcessorTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/BindToRegistryBeanPostProcessorTest.java
new file mode 100644
index 0000000..ac17277
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/BindToRegistryBeanPostProcessorTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.camel.impl;
+
+import org.apache.camel.BeanInject;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.spi.CamelBeanPostProcessor;
+import org.junit.Test;
+
+public class BindToRegistryBeanPostProcessorTest extends ContextTestSupport {
+
+ // field
+ @BindToRegistry(beanPostProcess = true)
+ private FooService foo = new FooService();
+
+ // method
+ @BindToRegistry(beanPostProcess = true)
+ public FooService myOtherFoo() {
+ return new FooService();
+ }
+
+ @Test
+ public void testPostProcessor() throws Exception {
+ // bean post processing dont run on ContextTestSupport
+ CamelBeanPostProcessor cbpp = context.adapt(ExtendedCamelContext.class).getBeanPostProcessor();
+ cbpp.postProcessBeforeInitialization(this, "this");
+ cbpp.postProcessAfterInitialization(this, "this");
+
+ assertNotNull(foo);
+ assertSame(context, foo.getCamelContext());
+
+ FooService other = (FooService) context.getRegistry().lookupByName("myOtherFoo");
+ assertNotNull(other);
+ assertSame(context, other.getCamelContext());
+ }
+
+ public class FooService {
+
+ @BeanInject
+ private CamelContext camelContext;
+
+ public CamelContext getCamelContext() {
+ return camelContext;
+ }
+
+ public void setCamelContext(CamelContext camelContext) {
+ this.camelContext = camelContext;
+ }
+ }
+}