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 @@
 /**
  * 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 @@
 
 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 @@
     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 @@
     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 @@
  * 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 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 @@
         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 @@
         }
     }
 
+    /**
+     * 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 @@
 
 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 @@
     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 @@
     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 @@
  * 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 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.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 @@
         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 @@
         }
     }
 
+    /**
+     * 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 @@
 
     /** {@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 @@
 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.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 @@
         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 @@
         }
     }
 
+    /**
+     * 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> {
