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 2017/06/22 08:55:57 UTC
[4/7] camel git commit: Injector should support auto-wiring so eg
Spring can create bean instances that uses auto-wiring on bean constructors.
Injector should support auto-wiring so eg Spring can create bean instances that uses auto-wiring on bean constructors.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/184e07a3
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/184e07a3
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/184e07a3
Branch: refs/heads/master
Commit: 184e07a310cf002ede2efd49131fcea97bc3d227
Parents: f5296eb
Author: Claus Ibsen <da...@apache.org>
Authored: Wed Jun 21 14:49:43 2017 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Thu Jun 22 10:27:34 2017 +0200
----------------------------------------------------------------------
.../org/apache/camel/impl/DefaultInjector.java | 5 +++
.../org/apache/camel/model/BeanDefinition.java | 13 +++++-
.../java/org/apache/camel/spi/Injector.java | 7 ++++
.../apache/camel/util/ReflectionInjector.java | 5 +++
.../org/apache/camel/cdi/CdiCamelInjector.java | 6 +++
.../apache/camel/guice/impl/GuiceInjector.java | 5 +++
.../apache/camel/spring/spi/SpringInjector.java | 5 +++
.../component/bean/AutowireConstructorBean.java | 32 +++++++++++++++
.../bean/AutowireConstructorRouteTest.java | 43 ++++++++++++++++++++
.../bean/AutowireConstructorRouteTwoTest.java | 43 ++++++++++++++++++++
.../bean/AutowireConstructorTwoBean.java | 39 ++++++++++++++++++
.../bean/AutowireConstructorRouteTest.xml | 37 +++++++++++++++++
.../bean/AutowireConstructorRouteTwoTest.xml | 37 +++++++++++++++++
13 files changed, 276 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/184e07a3/camel-core/src/main/java/org/apache/camel/impl/DefaultInjector.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultInjector.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultInjector.java
index 7c6ef3c..9e72b9e 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultInjector.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultInjector.java
@@ -67,4 +67,9 @@ public class DefaultInjector implements Injector {
}
return answer;
}
+
+ @Override
+ public boolean supportsAutoWiring() {
+ return delegate.supportsAutoWiring();
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/184e07a3/camel-core/src/main/java/org/apache/camel/model/BeanDefinition.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/BeanDefinition.java b/camel-core/src/main/java/org/apache/camel/model/BeanDefinition.java
index 222d9f6..92daa39 100644
--- a/camel-core/src/main/java/org/apache/camel/model/BeanDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/BeanDefinition.java
@@ -274,8 +274,19 @@ public class BeanDefinition extends NoOutputDefinition<BeanDefinition> {
clazz = beanClass;
}
+ // attempt to create bean using injector which supports auto-wiring
+ if (isCacheBean() && routeContext.getCamelContext().getInjector().supportsAutoWiring()) {
+ try {
+ log.debug("Attempting to create new bean instance from class: {} via auto-wiring enabled", clazz);
+ bean = CamelContextHelper.newInstance(routeContext.getCamelContext(), clazz);
+ } catch (Throwable e) {
+ log.debug("Error creating new bean instance from class: " + clazz + ". This exception is ignored", e);
+ }
+ }
+
// create a bean if there is a default public no-arg constructor
- if (isCacheBean() && ObjectHelper.hasDefaultPublicNoArgConstructor(clazz)) {
+ if (bean == null && isCacheBean() && ObjectHelper.hasDefaultPublicNoArgConstructor(clazz)) {
+ log.debug("Class has default no-arg constructor so creating a new bean instance: {}", clazz);
bean = CamelContextHelper.newInstance(routeContext.getCamelContext(), clazz);
ObjectHelper.notNull(bean, "bean", this);
}
http://git-wip-us.apache.org/repos/asf/camel/blob/184e07a3/camel-core/src/main/java/org/apache/camel/spi/Injector.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/spi/Injector.java b/camel-core/src/main/java/org/apache/camel/spi/Injector.java
index ec39e2b..9feb41f 100644
--- a/camel-core/src/main/java/org/apache/camel/spi/Injector.java
+++ b/camel-core/src/main/java/org/apache/camel/spi/Injector.java
@@ -44,4 +44,11 @@ public interface Injector {
*/
<T> T newInstance(Class<T> type, Object instance);
+ /**
+ * 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.
+ */
+ boolean supportsAutoWiring();
+
}
http://git-wip-us.apache.org/repos/asf/camel/blob/184e07a3/camel-core/src/main/java/org/apache/camel/util/ReflectionInjector.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/util/ReflectionInjector.java b/camel-core/src/main/java/org/apache/camel/util/ReflectionInjector.java
index a82dc6a..79142da 100644
--- a/camel-core/src/main/java/org/apache/camel/util/ReflectionInjector.java
+++ b/camel-core/src/main/java/org/apache/camel/util/ReflectionInjector.java
@@ -41,4 +41,9 @@ public class ReflectionInjector implements Injector {
}
return newInstance(type);
}
+
+ @Override
+ public boolean supportsAutoWiring() {
+ return true;
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/184e07a3/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelInjector.java
----------------------------------------------------------------------
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 a658051..da58eec 100755
--- 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
@@ -43,4 +43,10 @@ final class CdiCamelInjector implements Injector {
public <T> T newInstance(Class<T> type, Object instance) {
return injector.newInstance(type, instance);
}
+
+ @Override
+ public boolean supportsAutoWiring() {
+ // TODO: cdi to support some kind of @Inject on constructors?
+ return false;
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/184e07a3/components/camel-guice/src/main/java/org/apache/camel/guice/impl/GuiceInjector.java
----------------------------------------------------------------------
diff --git a/components/camel-guice/src/main/java/org/apache/camel/guice/impl/GuiceInjector.java b/components/camel-guice/src/main/java/org/apache/camel/guice/impl/GuiceInjector.java
index 1544400..c73f6db 100644
--- a/components/camel-guice/src/main/java/org/apache/camel/guice/impl/GuiceInjector.java
+++ b/components/camel-guice/src/main/java/org/apache/camel/guice/impl/GuiceInjector.java
@@ -47,4 +47,9 @@ public class GuiceInjector implements Injector {
return newInstance(type);
}
+ @Override
+ public boolean supportsAutoWiring() {
+ return false;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/camel/blob/184e07a3/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringInjector.java
----------------------------------------------------------------------
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 157c8da..77549d4 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
@@ -50,6 +50,11 @@ public class SpringInjector implements Injector {
return newInstance(type);
}
+ @Override
+ public boolean supportsAutoWiring() {
+ return true;
+ }
+
public int getAutowireMode() {
return autowireMode;
}
http://git-wip-us.apache.org/repos/asf/camel/blob/184e07a3/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorBean.java
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorBean.java b/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorBean.java
new file mode 100644
index 0000000..a7dcd27
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorBean.java
@@ -0,0 +1,32 @@
+/**
+ * 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.component.bean;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class AutowireConstructorBean {
+
+ private final MyBeanCounter counter;
+
+ public AutowireConstructorBean(@Autowired MyBeanCounter counter) {
+ this.counter = counter;
+ }
+
+ public String hello(String name) {
+ return "Hello " + name + " at " + counter.count();
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/184e07a3/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorRouteTest.java b/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorRouteTest.java
new file mode 100644
index 0000000..88c9136
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorRouteTest.java
@@ -0,0 +1,43 @@
+/**
+ * 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.component.bean;
+
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.spring.SpringTestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+/**
+ * @version
+ */
+public class AutowireConstructorRouteTest extends SpringTestSupport {
+
+ public void testAutowireConstructor() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedBodiesReceived("Hello Camel at 1", "Hello World at 2");
+
+ template.sendBody("direct:start", "Camel");
+ template.sendBody("direct:start", "World");
+
+ assertMockEndpointsSatisfied();
+ }
+
+ protected AbstractXmlApplicationContext createApplicationContext() {
+ return new ClassPathXmlApplicationContext("org/apache/camel/component/bean/AutowireConstructorRouteTest.xml");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/184e07a3/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorRouteTwoTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorRouteTwoTest.java b/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorRouteTwoTest.java
new file mode 100644
index 0000000..dcf1a96
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorRouteTwoTest.java
@@ -0,0 +1,43 @@
+/**
+ * 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.component.bean;
+
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.spring.SpringTestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+/**
+ * @version
+ */
+public class AutowireConstructorRouteTwoTest extends SpringTestSupport {
+
+ public void testAutowireConstructor() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:result");
+ mock.expectedBodiesReceived("Hello Camel at 1", "Hello World at 2");
+
+ template.sendBody("direct:start", "Camel");
+ template.sendBody("direct:start", "World");
+
+ assertMockEndpointsSatisfied();
+ }
+
+ protected AbstractXmlApplicationContext createApplicationContext() {
+ return new ClassPathXmlApplicationContext("org/apache/camel/component/bean/AutowireConstructorRouteTwoTest.xml");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/184e07a3/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorTwoBean.java
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorTwoBean.java b/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorTwoBean.java
new file mode 100644
index 0000000..4412e3a
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/component/bean/AutowireConstructorTwoBean.java
@@ -0,0 +1,39 @@
+/**
+ * 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.component.bean;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * This bean has both a default no-arg and a autowired constructor
+ */
+public class AutowireConstructorTwoBean {
+
+ private final MyBeanCounter counter;
+
+ public AutowireConstructorTwoBean() {
+ this.counter = null;
+ }
+
+ public AutowireConstructorTwoBean(@Autowired MyBeanCounter counter) {
+ this.counter = counter;
+ }
+
+ public String hello(String name) {
+ return "Hello " + name + " at " + counter.count();
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/184e07a3/components/camel-spring/src/test/resources/org/apache/camel/component/bean/AutowireConstructorRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/component/bean/AutowireConstructorRouteTest.xml b/components/camel-spring/src/test/resources/org/apache/camel/component/bean/AutowireConstructorRouteTest.xml
new file mode 100644
index 0000000..e891a03
--- /dev/null
+++ b/components/camel-spring/src/test/resources/org/apache/camel/component/bean/AutowireConstructorRouteTest.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ 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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+ ">
+
+ <camelContext xmlns="http://camel.apache.org/schema/spring">
+ <route>
+ <from uri="direct:start"/>
+ <bean beanType="org.apache.camel.component.bean.AutowireConstructorBean"/>
+ <to uri="mock:result"/>
+ </route>
+ </camelContext>
+
+ <bean id="myCounter" class="org.apache.camel.component.bean.MyBeanCounter"/>
+
+</beans>
http://git-wip-us.apache.org/repos/asf/camel/blob/184e07a3/components/camel-spring/src/test/resources/org/apache/camel/component/bean/AutowireConstructorRouteTwoTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/component/bean/AutowireConstructorRouteTwoTest.xml b/components/camel-spring/src/test/resources/org/apache/camel/component/bean/AutowireConstructorRouteTwoTest.xml
new file mode 100644
index 0000000..708b4ac
--- /dev/null
+++ b/components/camel-spring/src/test/resources/org/apache/camel/component/bean/AutowireConstructorRouteTwoTest.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ 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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+ ">
+
+ <camelContext xmlns="http://camel.apache.org/schema/spring">
+ <route>
+ <from uri="direct:start"/>
+ <bean beanType="org.apache.camel.component.bean.AutowireConstructorTwoBean"/>
+ <to uri="mock:result"/>
+ </route>
+ </camelContext>
+
+ <bean id="myCounter" class="org.apache.camel.component.bean.MyBeanCounter"/>
+
+</beans>