You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by se...@apache.org on 2021/04/16 08:03:15 UTC

[ignite-extensions] branch master updated: IGNITE-13169 Remove Ignite bean name requirement for Spring Data Repository - Fixes #55.

This is an automated email from the ASF dual-hosted git repository.

sergeychugunov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite-extensions.git


The following commit(s) were added to refs/heads/master by this push:
     new a25117b  IGNITE-13169 Remove Ignite bean name requirement for Spring Data Repository - Fixes #55.
a25117b is described below

commit a25117b7ce4c156bf29d207e43002d35b9ff70cc
Author: Semyon Danilov <sa...@yandex.ru>
AuthorDate: Fri Apr 16 10:14:30 2021 +0300

    IGNITE-13169 Remove Ignite bean name requirement for Spring Data Repository - Fixes #55.
    
    Signed-off-by: Sergey Chugunov <se...@gmail.com>
---
 .../examples/SpringApplicationConfiguration.java   |   6 +-
 .../repository/support/IgniteProxyFactory.java     |  73 ++++++++++-----
 .../support/IgniteRepositoryFactoryBean.java       |   4 +-
 ...gniteSpringDataConnectionConfigurationTest.java |  99 ++++++++++++++++++++
 .../repository/support/IgniteProxyFactory.java     |  73 ++++++++++-----
 .../support/IgniteRepositoryFactoryBean.java       |   4 +-
 ...gniteSpringDataConnectionConfigurationTest.java | 100 +++++++++++++++++++++
 .../repository/support/IgniteProxyFactory.java     |  63 +++++++++----
 ...gniteSpringDataConnectionConfigurationTest.java |  82 +++++++++++++++++
 9 files changed, 433 insertions(+), 71 deletions(-)

diff --git a/modules/spring-data-2.0-ext/examples/main/java/org/apache/ignite/springdata20/examples/SpringApplicationConfiguration.java b/modules/spring-data-2.0-ext/examples/main/java/org/apache/ignite/springdata20/examples/SpringApplicationConfiguration.java
index d7b4a91..15ded04 100644
--- a/modules/spring-data-2.0-ext/examples/main/java/org/apache/ignite/springdata20/examples/SpringApplicationConfiguration.java
+++ b/modules/spring-data-2.0-ext/examples/main/java/org/apache/ignite/springdata20/examples/SpringApplicationConfiguration.java
@@ -29,10 +29,10 @@ import org.springframework.context.annotation.Configuration;
 /**
  * Every {@link IgniteRepository} is bound to a specific Apache Ignite that it communicates to in order to mutate and
  * read data via Spring Data API. To pass an instance of Apache Ignite cache to an {@link IgniteRepository} it's
- * required to initialize {@link IgniteRepositoryFactoryBean} with on of the following:
+ * required to initialize {@link IgniteRepositoryFactoryBean} with one of the following:
  * <ul>
- * <li>{@link Ignite} instance bean named "igniteInstance"</li>
- * <li>{@link IgniteConfiguration} bean named "igniteCfg"</li>
+ * <li>{@link Ignite} instance bean</li>
+ * <li>{@link IgniteConfiguration} bean</li>
  * <li>A path to Ignite's Spring XML configuration named "igniteSpringCfgPath"</li>
  * <ul/>
  * In this example the first approach is utilized.
diff --git a/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteProxyFactory.java b/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteProxyFactory.java
index d571cc2..b5280ee 100644
--- a/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteProxyFactory.java
+++ b/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteProxyFactory.java
@@ -19,8 +19,14 @@ package org.apache.ignite.springdata20.repository.support;
 
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Stream;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.client.IgniteClient;
+import org.apache.ignite.configuration.ClientConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.springdata.proxy.IgniteProxy;
 import org.apache.ignite.springdata20.repository.config.RepositoryConfig;
 import org.springframework.beans.BeansException;
@@ -103,29 +109,25 @@ public class IgniteProxyFactory implements ApplicationContextAware, DisposableBe
     private IgniteProxy createIgniteProxy(Class<?> repoInterface) {
         RepositoryConfig repoCfg = getRepositoryConfiguration(repoInterface);
 
-        Object connCfg;
-
-        try {
-            connCfg = ctx.getBean(evaluateExpression(repoCfg.igniteInstance()));
-        }
-        catch (BeansException ex) {
-            try {
-                connCfg = ctx.getBean(evaluateExpression(repoCfg.igniteCfg()));
-            }
-            catch (BeansException ex2) {
-                try {
-                    connCfg = ctx.getBean(evaluateExpression(repoCfg.igniteSpringCfgPath()), String.class);
-                }
-                catch (BeansException ex3) {
-                    throw new IllegalArgumentException("Invalid configuration for repository " +
-                        repoInterface.getName() + ". No beans were found that provide connection configuration to the" +
-                        " Ignite cluster. Check \"igniteInstance\", \"igniteCfg\", \"igniteSpringCfgPath\" parameters" +
-                        " of " + RepositoryConfig.class.getName() + " repository annotation.");
-                }
-            }
-        }
-
-        return IgniteProxy.of(connCfg);
+        return Stream.<BeanFinder>of(
+            () -> ctx.getBean(evaluateExpression(repoCfg.igniteInstance())),
+            () -> ctx.getBean(evaluateExpression(repoCfg.igniteCfg())),
+            () -> ctx.getBean(evaluateExpression(repoCfg.igniteSpringCfgPath()), String.class),
+            () -> ctx.getBean(Ignite.class),
+            () -> ctx.getBean(IgniteClient.class),
+            () -> ctx.getBean(IgniteConfiguration.class),
+            () -> ctx.getBean(ClientConfiguration.class)
+        ).map(BeanFinder::getBean)
+            .filter(Objects::nonNull)
+            .findFirst()
+            .map(IgniteProxy::of)
+            .orElseThrow(() -> {
+                return new IllegalArgumentException("Invalid configuration for repository " +
+                    repoInterface.getName() + ". No beans were found that provide connection configuration to the" +
+                    " Ignite cluster. Check \"igniteInstance\", \"igniteCfg\", \"igniteSpringCfgPath\" parameters" +
+                    " of " + RepositoryConfig.class.getName() + " repository annotation or provide Ignite, IgniteClient, " +
+                    " ClientConfiguration or IgniteConfiguration bean to application context.");
+            });
     }
 
     /**
@@ -137,4 +139,29 @@ public class IgniteProxyFactory implements ApplicationContextAware, DisposableBe
     private String evaluateExpression(String spelExpression) {
         return (String)expressionResolver.evaluate(spelExpression, beanExpressionCtx);
     }
+
+    /**
+     * Helper interface that wraps getBean method.
+     */
+    @FunctionalInterface
+    private interface BeanFinder {
+        /**
+         * Get bean.
+         * @return Bean or null if {@link BeansException} was thrown.
+         */
+        default Object getBean() {
+            try {
+                return get();
+            } catch (BeansException ex) {
+                return null;
+            }
+        }
+
+        /**
+         * Get bean.
+         * @return Bean.
+         * @throws BeansException If bean was not found.
+         */
+        Object get() throws BeansException;
+    }
 }
diff --git a/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactoryBean.java b/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactoryBean.java
index bce6dda..0ec1313 100644
--- a/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactoryBean.java
+++ b/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactoryBean.java
@@ -34,8 +34,8 @@ import org.springframework.data.repository.core.support.RepositoryFactorySupport
  * The {@link org.apache.ignite.springdata20.repository.config.RepositoryConfig} requires to define one of the
  * parameters below in your Spring application configuration in order to get an access to Apache Ignite cluster:
  * <ul>
- * <li>{@link Ignite} instance bean named "igniteInstance" by default</li>
- * <li>{@link IgniteConfiguration} bean named "igniteCfg" by default</li>
+ * <li>{@link Ignite} instance bean</li>
+ * <li>{@link IgniteConfiguration} bean</li>
  * <li>A path to Ignite's Spring XML configuration named "igniteSpringCfgPath" by default</li>
  * <ul/>
  *
diff --git a/modules/spring-data-2.0-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java b/modules/spring-data-2.0-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
index 4187e28..10d016d 100644
--- a/modules/spring-data-2.0-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
+++ b/modules/spring-data-2.0-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
@@ -21,6 +21,7 @@ import java.io.Serializable;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.ClientConfiguration;
 import org.apache.ignite.configuration.ClientConnectorConfiguration;
@@ -75,6 +76,30 @@ public class IgniteSpringDataConnectionConfigurationTest extends GridCommonAbstr
         checkRepositoryConfiguration(ClientConfigurationApplication.class, IgniteClientConfigRepository.class);
     }
 
+    /** Tests repository configuration in case {@link Ignite} with non default is used to access the Ignite cluster. */
+    @Test
+    public void testRepositoryWithoutIgniteInstanceParameter() {
+        checkRepositoryConfiguration(DefaultIgniteBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+    }
+
+    /** Tests repository configuration in case {@link IgniteClient} with non default name is used to access the Ignite cluster. */
+    @Test
+    public void testRepositoryWithoutIgniteClientInstanceParameter() {
+        checkRepositoryConfiguration(DefaultIgniteClientBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+    }
+
+    /** Tests repository configuration in case {@link ClientConfiguration} with non default name is used to access the Ignite cluster. */
+    @Test
+    public void testRepositoryWithoutIgnitClientConfigurationParameter() {
+        checkRepositoryConfiguration(DefaultIgniteClientConfigurationBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+    }
+
+    /** Tests repository configuration in case {@link IgniteConfiguration} with non default name is used to access the Ignite cluster. */
+    @Test
+    public void testRepositoryWithoutIgniteConfigurationParameter() {
+        checkRepositoryConfiguration(DefaultIgniteConfigurationBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+    }
+
     /**
      * Tests repository configuration in case {@link IgniteConfiguration} that refers to existing Ignite node instance
      * used to access the Ignite cluster.
@@ -205,6 +230,80 @@ public class IgniteSpringDataConnectionConfigurationTest extends GridCommonAbstr
         }
     }
 
+    /**
+     * Spring Application configuration for repository testing in case if Ignite bean name was not provided
+     * through {@link RepositoryConfig#igniteInstance()} ()}.
+     */
+    @Configuration
+    @EnableIgniteRepositories(
+        considerNestedRepositories = true,
+        includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+    )
+    public static class DefaultIgniteBeanApplication {
+        /** Ignite bean. */
+        @Bean
+        public Ignite someIgnite() {
+            return Ignition.start(getIgniteConfiguration("test", false));
+        }
+    }
+
+    /**
+     * Spring Application configuration for repository testing in case if IgniteClient bean name was not provided
+     * through {@link RepositoryConfig#igniteInstance()} ()}.
+     */
+    @Configuration
+    @EnableIgniteRepositories(
+        considerNestedRepositories = true,
+        includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+    )
+    public static class DefaultIgniteClientBeanApplication {
+        /** Ignite client bean. */
+        @Bean
+        public IgniteClient someIgnite() {
+            return Ignition.startClient(new ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT));
+        }
+    }
+
+    /**
+     * Spring Application configuration for repository testing in case if ClientConfiguration bean name was not provided
+     * through {@link RepositoryConfig#igniteCfg()}.
+     */
+    @Configuration
+    @EnableIgniteRepositories(
+        considerNestedRepositories = true,
+        includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+    )
+    public static class DefaultIgniteClientConfigurationBeanApplication {
+        /** Ignite client configuration bean. */
+        @Bean
+        public ClientConfiguration someCfg() {
+            return new ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT);
+        }
+    }
+
+    /**
+     * Spring Application configuration for repository testing in case if IgniteConfiguration bean name was not provided
+     * through {@link RepositoryConfig#igniteCfg()}.
+     */
+    @Configuration
+    @EnableIgniteRepositories(
+        considerNestedRepositories = true,
+        includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+    )
+    public static class DefaultIgniteConfigurationBeanApplication {
+        /** Ignite client configuration bean. */
+        @Bean
+        public IgniteConfiguration someCfg() {
+            return getIgniteConfiguration("test", false);
+        }
+    }
+
+    /** Repository for testing configuration approach through default ignite beans. */
+    @RepositoryConfig(cacheName = "PersonCache")
+    public interface IgniteRepositoryWithoutExplicitIgnite extends IgniteRepository<Object, Serializable> {
+        // No-op.
+    }
+
     /** Repository for testing configuration approach through {@link IgniteConfiguration}. */
     @RepositoryConfig(cacheName = "PersonCache", igniteCfg = "igniteConfiguration")
     public interface IgniteConfigRepository extends IgniteRepository<Object, Serializable> {
diff --git a/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteProxyFactory.java b/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteProxyFactory.java
index ac56e00..33d3757 100644
--- a/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteProxyFactory.java
+++ b/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteProxyFactory.java
@@ -19,8 +19,14 @@ package org.apache.ignite.springdata22.repository.support;
 
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Stream;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.client.IgniteClient;
+import org.apache.ignite.configuration.ClientConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.springdata.proxy.IgniteProxy;
 import org.apache.ignite.springdata22.repository.config.RepositoryConfig;
 import org.springframework.beans.BeansException;
@@ -103,29 +109,25 @@ public class IgniteProxyFactory implements ApplicationContextAware, DisposableBe
     private IgniteProxy createIgniteProxy(Class<?> repoInterface) {
         RepositoryConfig repoCfg = getRepositoryConfiguration(repoInterface);
 
-        Object connCfg;
-
-        try {
-            connCfg = ctx.getBean(evaluateExpression(repoCfg.igniteInstance()));
-        }
-        catch (BeansException ex) {
-            try {
-                connCfg = ctx.getBean(evaluateExpression(repoCfg.igniteCfg()));
-            }
-            catch (BeansException ex2) {
-                try {
-                    connCfg = ctx.getBean(evaluateExpression(repoCfg.igniteSpringCfgPath()), String.class);
-                }
-                catch (BeansException ex3) {
-                    throw new IllegalArgumentException("Invalid configuration for repository " +
-                        repoInterface.getName() + ". No beans were found that provide connection configuration to the" +
-                        " Ignite cluster. Check \"igniteInstance\", \"igniteCfg\", \"igniteSpringCfgPath\" parameters" +
-                        " of " + RepositoryConfig.class.getName() + " repository annotation.");
-                }
-            }
-        }
-
-        return IgniteProxy.of(connCfg);
+        return Stream.<BeanFinder>of(
+            () -> ctx.getBean(evaluateExpression(repoCfg.igniteInstance())),
+            () -> ctx.getBean(evaluateExpression(repoCfg.igniteCfg())),
+            () -> ctx.getBean(evaluateExpression(repoCfg.igniteSpringCfgPath()), String.class),
+            () -> ctx.getBean(Ignite.class),
+            () -> ctx.getBean(IgniteClient.class),
+            () -> ctx.getBean(IgniteConfiguration.class),
+            () -> ctx.getBean(ClientConfiguration.class)
+        ).map(BeanFinder::getBean)
+            .filter(Objects::nonNull)
+            .findFirst()
+            .map(IgniteProxy::of)
+            .orElseThrow(() -> {
+                return new IllegalArgumentException("Invalid configuration for repository " +
+                    repoInterface.getName() + ". No beans were found that provide connection configuration to the" +
+                    " Ignite cluster. Check \"igniteInstance\", \"igniteCfg\", \"igniteSpringCfgPath\" parameters" +
+                    " of " + RepositoryConfig.class.getName() + " repository annotation or provide Ignite, IgniteClient, " +
+                    " ClientConfiguration or IgniteConfiguration bean to application context.");
+            });
     }
 
     /**
@@ -137,4 +139,29 @@ public class IgniteProxyFactory implements ApplicationContextAware, DisposableBe
     private String evaluateExpression(String spelExpression) {
         return (String)expressionResolver.evaluate(spelExpression, beanExpressionCtx);
     }
+
+    /**
+     * Helper interface that wraps getBean method.
+     */
+    @FunctionalInterface
+    private interface BeanFinder {
+        /**
+         * Get bean.
+         * @return Bean or null if {@link BeansException} was thrown.
+         */
+        default Object getBean() {
+            try {
+                return get();
+            } catch (BeansException ex) {
+                return null;
+            }
+        }
+
+        /**
+         * Get bean.
+         * @return Bean.
+         * @throws BeansException If bean was not found.
+         */
+        Object get() throws BeansException;
+    }
 }
diff --git a/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactoryBean.java b/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactoryBean.java
index 9d6794d..4f6b7a9 100644
--- a/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactoryBean.java
+++ b/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactoryBean.java
@@ -34,8 +34,8 @@ import org.springframework.data.repository.core.support.RepositoryFactorySupport
  * The {@link org.apache.ignite.springdata22.repository.config.RepositoryConfig} requires to define one of the
  * parameters below in your Spring application configuration in order to get an access to Apache Ignite cluster:
  * <ul>
- * <li>{@link Ignite} instance bean named "igniteInstance" by default</li>
- * <li>{@link IgniteConfiguration} bean named "igniteCfg" by default</li>
+ * <li>{@link Ignite} instance bean</li>
+ * <li>{@link IgniteConfiguration} bean</li>
  * <li>A path to Ignite's Spring XML configuration named "igniteSpringCfgPath" by default</li>
  * <ul/>
  *
diff --git a/modules/spring-data-2.2-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java b/modules/spring-data-2.2-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
index 68c421a..c91dbe1 100644
--- a/modules/spring-data-2.2-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
+++ b/modules/spring-data-2.2-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
@@ -21,6 +21,7 @@ import java.io.Serializable;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.ClientConfiguration;
 import org.apache.ignite.configuration.ClientConnectorConfiguration;
@@ -28,6 +29,7 @@ import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.springdata.misc.PersonRepository;
 import org.apache.ignite.springdata22.repository.IgniteRepository;
 import org.apache.ignite.springdata22.repository.config.EnableIgniteRepositories;
 import org.apache.ignite.springdata22.repository.config.RepositoryConfig;
@@ -75,6 +77,30 @@ public class IgniteSpringDataConnectionConfigurationTest extends GridCommonAbstr
         checkRepositoryConfiguration(ClientConfigurationApplication.class, IgniteClientConfigRepository.class);
     }
 
+    /** Tests repository configuration in case {@link Ignite} with non default is used to access the Ignite cluster. */
+    @Test
+    public void testRepositoryWithoutIgniteInstanceParameter() {
+        checkRepositoryConfiguration(DefaultIgniteBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+    }
+
+    /** Tests repository configuration in case {@link IgniteClient} with non default name is used to access the Ignite cluster. */
+    @Test
+    public void testRepositoryWithoutIgniteClientInstanceParameter() {
+        checkRepositoryConfiguration(DefaultIgniteClientBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+    }
+
+    /** Tests repository configuration in case {@link ClientConfiguration} with non default name is used to access the Ignite cluster. */
+    @Test
+    public void testRepositoryWithoutIgnitClientConfigurationParameter() {
+        checkRepositoryConfiguration(DefaultIgniteClientConfigurationBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+    }
+
+    /** Tests repository configuration in case {@link IgniteConfiguration} with non default name is used to access the Ignite cluster. */
+    @Test
+    public void testRepositoryWithoutIgniteConfigurationParameter() {
+        checkRepositoryConfiguration(DefaultIgniteConfigurationBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+    }
+
     /**
      * Tests repository configuration in case {@link IgniteConfiguration} that refers to existing Ignite node instance
      * used to access the Ignite cluster.
@@ -205,6 +231,80 @@ public class IgniteSpringDataConnectionConfigurationTest extends GridCommonAbstr
         }
     }
 
+    /**
+     * Spring Application configuration for repository testing in case if Ignite bean name was not provided
+     * through {@link RepositoryConfig#igniteInstance()} ()}.
+     */
+    @Configuration
+    @EnableIgniteRepositories(
+        considerNestedRepositories = true,
+        includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+    )
+    public static class DefaultIgniteBeanApplication {
+        /** Ignite bean. */
+        @Bean
+        public Ignite someIgnite() {
+            return Ignition.start(getIgniteConfiguration("test", false));
+        }
+    }
+
+    /**
+     * Spring Application configuration for repository testing in case if IgniteClient bean name was not provided
+     * through {@link RepositoryConfig#igniteInstance()} ()}.
+     */
+    @Configuration
+    @EnableIgniteRepositories(
+        considerNestedRepositories = true,
+        includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+    )
+    public static class DefaultIgniteClientBeanApplication {
+        /** Ignite client bean. */
+        @Bean
+        public IgniteClient someIgnite() {
+            return Ignition.startClient(new ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT));
+        }
+    }
+
+    /**
+     * Spring Application configuration for repository testing in case if ClientConfiguration bean name was not provided
+     * through {@link RepositoryConfig#igniteCfg()}.
+     */
+    @Configuration
+    @EnableIgniteRepositories(
+        considerNestedRepositories = true,
+        includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+    )
+    public static class DefaultIgniteClientConfigurationBeanApplication {
+        /** Ignite client configuration bean. */
+        @Bean
+        public ClientConfiguration someCfg() {
+            return new ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT);
+        }
+    }
+
+    /**
+     * Spring Application configuration for repository testing in case if IgniteConfiguration bean name was not provided
+     * through {@link RepositoryConfig#igniteCfg()}.
+     */
+    @Configuration
+    @EnableIgniteRepositories(
+        considerNestedRepositories = true,
+        includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+    )
+    public static class DefaultIgniteConfigurationBeanApplication {
+        /** Ignite client configuration bean. */
+        @Bean
+        public IgniteConfiguration someCfg() {
+            return getIgniteConfiguration("test", false);
+        }
+    }
+
+    /** Repository for testing configuration approach through default ignite beans. */
+    @RepositoryConfig(cacheName = "PersonCache")
+    public interface IgniteRepositoryWithoutExplicitIgnite extends IgniteRepository<Object, Serializable> {
+        // No-op.
+    }
+
     /** Repository for testing configuration approach through {@link IgniteConfiguration}. */
     @RepositoryConfig(cacheName = "PersonCache", igniteCfg = "igniteConfiguration")
     public interface IgniteConfigRepository extends IgniteRepository<Object, Serializable> {
diff --git a/modules/spring-data-ext/src/main/java/org/apache/ignite/springdata/repository/support/IgniteProxyFactory.java b/modules/spring-data-ext/src/main/java/org/apache/ignite/springdata/repository/support/IgniteProxyFactory.java
index 3585287..ba19f93 100644
--- a/modules/spring-data-ext/src/main/java/org/apache/ignite/springdata/repository/support/IgniteProxyFactory.java
+++ b/modules/spring-data-ext/src/main/java/org/apache/ignite/springdata/repository/support/IgniteProxyFactory.java
@@ -17,6 +17,12 @@
 
 package org.apache.ignite.springdata.repository.support;
 
+import java.util.Objects;
+import java.util.stream.Stream;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.client.IgniteClient;
+import org.apache.ignite.configuration.ClientConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.springdata.proxy.IgniteProxy;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.AbstractFactoryBean;
@@ -60,28 +66,49 @@ public class IgniteProxyFactory extends AbstractFactoryBean<IgniteProxy> impleme
 
     /** {@inheritDoc} */
     @Override protected IgniteProxy createInstance() {
-        Object connCfg;
+        return Stream.<BeanFinder>of(
+            () -> ctx.getBean(IGNITE_INSTANCE_BEAN_NAME),
+            () -> ctx.getBean(IGNITE_CONFIG_BEAN_NAME),
+            () -> ctx.getBean(IGNITE_SPRING_CONFIG_PATH_BEAN_NAME, String.class),
+            () -> ctx.getBean(Ignite.class),
+            () -> ctx.getBean(IgniteClient.class),
+            () -> ctx.getBean(IgniteConfiguration.class),
+            () -> ctx.getBean(ClientConfiguration.class)
+        ).map(BeanFinder::getBean)
+            .filter(Objects::nonNull)
+            .findFirst()
+            .map(IgniteProxy::of)
+            .orElseThrow(() -> {
+                return new IllegalArgumentException("No beans were found that provide connection configuration to" +
+                    " the Ignite cluster. One of the beans with the following names is required : \"" +
+                    IGNITE_INSTANCE_BEAN_NAME + "\", \"" + IGNITE_CONFIG_BEAN_NAME + "\" or \"" +
+                    IGNITE_SPRING_CONFIG_PATH_BEAN_NAME + "\". You can also provide Ignite, IgniteClient," +
+                    " IgniteConfiguration or ClientConfiguration bean to application context.");
+            });
+    }
 
-        try {
-            connCfg = ctx.getBean(IGNITE_INSTANCE_BEAN_NAME);
-        }
-        catch (BeansException ex) {
+    /**
+     * Helper interface that wraps getBean method.
+     */
+    @FunctionalInterface
+    private interface BeanFinder {
+        /**
+         * Get bean.
+         * @return Bean or null if {@link BeansException} was thrown.
+         */
+        default Object getBean() {
             try {
-                connCfg = ctx.getBean(IGNITE_CONFIG_BEAN_NAME);
-            }
-            catch (BeansException ex2) {
-                try {
-                    connCfg = ctx.getBean(IGNITE_SPRING_CONFIG_PATH_BEAN_NAME, String.class);
-                }
-                catch (BeansException ex3) {
-                    throw new IllegalArgumentException("No beans were found that provide connection configuration to" +
-                        " the Ignite cluster. One of the beans with the following names is required : \"" +
-                        IGNITE_INSTANCE_BEAN_NAME + "\", \"" + IGNITE_CONFIG_BEAN_NAME + "\" or \"" +
-                        IGNITE_SPRING_CONFIG_PATH_BEAN_NAME + "\".");
-                }
+                return get();
+            } catch (BeansException ex) {
+                return null;
             }
         }
 
-        return IgniteProxy.of(connCfg);
+        /**
+         * Get bean.
+         * @return Bean.
+         * @throws BeansException If bean was not found.
+         */
+        Object get() throws BeansException;
     }
 }
diff --git a/modules/spring-data-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java b/modules/spring-data-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
index aa3d6a7..5d5fbae 100644
--- a/modules/spring-data-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
+++ b/modules/spring-data-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.springdata;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.ClientConfiguration;
 import org.apache.ignite.configuration.ClientConnectorConfiguration;
@@ -32,6 +33,7 @@ import org.apache.ignite.springdata.misc.PersonRepository;
 import org.apache.ignite.springdata.repository.IgniteRepository;
 import org.apache.ignite.springdata.repository.config.EnableIgniteRepositories;
 import org.apache.ignite.springdata.repository.config.RepositoryConfig;
+import org.apache.ignite.springdata.repository.support.IgniteProxyFactory;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Test;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
@@ -76,6 +78,30 @@ public class IgniteSpringDataConnectionConfigurationTest extends GridCommonAbstr
         checkRepositoryConfiguration(ClientConfigurationApplication.class);
     }
 
+    /** Tests repository configuration in case {@link Ignite} with non default is used to access the Ignite cluster. */
+    @Test
+    public void testRepositoryWithNonDefaultIgniteBean() {
+        checkRepositoryConfiguration(NonDefaultIgniteBeanApplication.class);
+    }
+
+    /** Tests repository configuration in case {@link IgniteClient} with non default name is used to access the Ignite cluster. */
+    @Test
+    public void testRepositoryWithNonDefaultIgniteClientBean() {
+        checkRepositoryConfiguration(NonDefaultIgniteClientBeanApplication.class);
+    }
+
+    /** Tests repository configuration in case {@link ClientConfiguration} with non default name is used to access the Ignite cluster. */
+    @Test
+    public void testRepositoryWithNonDefaultIgniteClientConfigurationBean() {
+        checkRepositoryConfiguration(NonDefaultIgniteClientConfigurationBeanApplication.class);
+    }
+
+    /** Tests repository configuration in case {@link IgniteConfiguration} with non default name is used to access the Ignite cluster. */
+    @Test
+    public void testRepositoryWithNonDefaultIgniteConfigurationBean() {
+        checkRepositoryConfiguration(NonDefaultIgniteConfigurationBeanApplication.class);
+    }
+
     /**
      * Tests repository configuration in case {@link IgniteConfiguration} that refers to existing Ignite node instance
      * is used to access the Ignite cluster.
@@ -198,6 +224,62 @@ public class IgniteSpringDataConnectionConfigurationTest extends GridCommonAbstr
         }
     }
 
+    /**
+     * Spring Application configuration for repository testing in case {@link Ignite} bean with name different from
+     * {@link IgniteProxyFactory#IGNITE_INSTANCE_BEAN_NAME} is used for accessing the cluster.
+     */
+    @Configuration
+    @EnableIgniteRepositories(includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = PersonRepository.class))
+    public static class NonDefaultIgniteBeanApplication {
+        /** Ignite bean. */
+        @Bean
+        public Ignite someIgnite() {
+            return Ignition.start(getIgniteConfiguration("test", false));
+        }
+    }
+
+    /**
+     * Spring Application configuration for repository testing in case {@link IgniteClient} bean with name different from
+     * {@link IgniteProxyFactory#IGNITE_INSTANCE_BEAN_NAME} is used for accessing the cluster.
+     */
+    @Configuration
+    @EnableIgniteRepositories(includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = PersonRepository.class))
+    public static class NonDefaultIgniteClientBeanApplication {
+        /** Ignite client bean. */
+        @Bean
+        public IgniteClient someIgnite() {
+            return Ignition.startClient(new ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT));
+        }
+    }
+
+    /**
+     * Spring Application configuration for repository testing in case {@link ClientConfiguration} bean with name different from
+     * {@link IgniteProxyFactory#IGNITE_CONFIG_BEAN_NAME} is used for accessing the cluster.
+     */
+    @Configuration
+    @EnableIgniteRepositories(includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = PersonRepository.class))
+    public static class NonDefaultIgniteClientConfigurationBeanApplication {
+        /** Ignite client configuration bean. */
+        @Bean
+        public ClientConfiguration someCfg() {
+            return new ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT);
+        }
+    }
+
+    /**
+     * Spring Application configuration for repository testing in case {@link IgniteConfiguration} bean with name different from
+     * {@link IgniteProxyFactory#IGNITE_CONFIG_BEAN_NAME} is used for accessing the cluster.
+     */
+    @Configuration
+    @EnableIgniteRepositories(includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = PersonRepository.class))
+    public static class NonDefaultIgniteConfigurationBeanApplication {
+        /** Ignite client configuration bean. */
+        @Bean
+        public IgniteConfiguration someCfg() {
+            return getIgniteConfiguration("test", false);
+        }
+    }
+
     /** Repository for testing application behavior in case the cache name is not specified in the repository configuration. */
     @RepositoryConfig
     interface InvalidCacheRepository extends IgniteRepository<Person, Integer> {