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 06d6ab6d21a8b1331d66ebd9b4c34353b7a67742
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Mon Mar 5 10:40:37 2018 +0100

    CAMEL-12309: Optimised SpEL to eager lookup bean resolver.
---
 .../apache/camel/language/spel/SpelExpression.java | 16 ++++++++---
 .../apache/camel/language/spel/SpelLanguage.java   | 31 +++++++++++++++++++---
 2 files changed, 40 insertions(+), 7 deletions(-)

diff --git 
a/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelExpression.java
 
b/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelExpression.java
index e410e1d..4ac573e 100644
--- 
a/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelExpression.java
+++ 
b/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelExpression.java
@@ -23,6 +23,7 @@ import org.apache.camel.spring.SpringCamelContext;
 import org.apache.camel.spring.util.RegistryBeanResolver;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.expression.BeanFactoryResolver;
+import org.springframework.expression.BeanResolver;
 import org.springframework.expression.EvaluationContext;
 import org.springframework.expression.Expression;
 import org.springframework.expression.ParserContext;
@@ -31,22 +32,27 @@ import 
org.springframework.expression.spel.standard.SpelExpressionParser;
 import org.springframework.expression.spel.support.StandardEvaluationContext;
 
 /**
- * Class responsible for evaluating <a href="http://static.springsource.org
- * /spring/docs/current/spring-framework-reference/html/expressions.html">
- * Spring Expression Language</a> in the context of Camel.
+ * Class responsible for evaluating <a 
href="https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions";>
+ * Spring Expression Language (SpEL)</a> in the context of Camel.
  */
 @SuppressWarnings("deprecation")
 public class SpelExpression extends ExpressionSupport {
 
     private final String expressionString;
     private final Class<?> type;
+    private final BeanResolver beanResolver;
 
     // SpelExpressionParser is thread-safe according to the docs
     private final SpelExpressionParser expressionParser;
 
     public SpelExpression(String expressionString, Class<?> type) {
+        this(expressionString, type, null);
+    }
+
+    public SpelExpression(String expressionString, Class<?> type, BeanResolver 
beanResolver) {
         this.expressionString = expressionString;
         this.type = type;
+        this.beanResolver = beanResolver;
         this.expressionParser = new SpelExpressionParser();
     }
 
@@ -68,7 +74,9 @@ public class SpelExpression extends ExpressionSupport {
 
     private EvaluationContext createEvaluationContext(Exchange exchange) {
         StandardEvaluationContext evaluationContext = new 
StandardEvaluationContext(new RootObject(exchange));
-        if (exchange.getContext() instanceof SpringCamelContext) {
+        if (beanResolver != null) {
+            evaluationContext.setBeanResolver(beanResolver);
+        } else if (exchange.getContext() instanceof SpringCamelContext) {
             // Support references (like @foo) in expressions to beans defined 
in the Registry/ApplicationContext
             ApplicationContext applicationContext = ((SpringCamelContext) 
exchange.getContext()).getApplicationContext();
             evaluationContext.setBeanResolver(new 
BeanFactoryResolver(applicationContext));
diff --git 
a/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java
 
b/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java
index 5e7c57f..e9a06e0 100644
--- 
a/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java
+++ 
b/components/camel-spring/src/main/java/org/apache/camel/language/spel/SpelLanguage.java
@@ -18,22 +18,47 @@ package org.apache.camel.language.spel;
 
 import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
+import org.apache.camel.Service;
 import org.apache.camel.spi.Language;
+import org.apache.camel.spring.SpringCamelContext;
+import org.apache.camel.spring.util.RegistryBeanResolver;
 import org.apache.camel.support.LanguageSupport;
+import org.apache.camel.util.ObjectHelper;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.expression.BeanFactoryResolver;
+import org.springframework.expression.BeanResolver;
 
 /**
  * A Spring Expression {@link Language} plugin
  */
-public class SpelLanguage extends LanguageSupport {
+public class SpelLanguage extends LanguageSupport implements Service {
+
+    private BeanResolver beanResolver;
 
     public Predicate createPredicate(String expression) {
         expression = loadResource(expression);
-        return new SpelExpression(expression, Boolean.class);
+        return new SpelExpression(expression, Boolean.class, beanResolver);
     }
 
     public Expression createExpression(String expression) {
         expression = loadResource(expression);
-        return new SpelExpression(expression, Object.class);
+        return new SpelExpression(expression, Object.class, beanResolver);
     }
 
+    @Override
+    public void start() throws Exception {
+        ObjectHelper.notNull(getCamelContext(), "CamelContext", this);
+
+        if (getCamelContext() instanceof SpringCamelContext) {
+            ApplicationContext applicationContext = ((SpringCamelContext) 
getCamelContext()).getApplicationContext();
+            beanResolver = new BeanFactoryResolver(applicationContext);
+        } else {
+            beanResolver = new 
RegistryBeanResolver(getCamelContext().getRegistry());
+        }
+    }
+
+    @Override
+    public void stop() throws Exception {
+        // noop
+    }
 }

-- 
To stop receiving notification emails like this one, please contact
davscl...@apache.org.

Reply via email to