Repository: ignite
Updated Branches:
  refs/heads/ignite-2.6 a2e4876e8 -> d6300fc35


IGNITE-8740: Support reuse of already initialized Ignite in IgniteSpringBean - 
Fixes #4208

Signed-off-by: Valentin Kulichenko <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/d6300fc3
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/d6300fc3
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/d6300fc3

Branch: refs/heads/ignite-2.6
Commit: d6300fc350de089f5899740c0a2280562f9e68a8
Parents: a2e4876
Author: Amir Akhmedov <[email protected]>
Authored: Fri Jun 22 16:29:43 2018 -0700
Committer: Valentin Kulichenko <[email protected]>
Committed: Fri Jun 22 16:29:43 2018 -0700

----------------------------------------------------------------------
 .../ignite/cache/spring/SpringCacheManager.java |  31 +-
 .../spring/SpringTransactionManager.java        |  28 +-
 .../spring-transactions-ignite-spring-bean.xml  |  67 ++++
 .../test/java/config/spring-transactions.xml    |   7 +-
 .../GridSpringCacheManagerAbstractTest.java     | 382 +++++++++++++++++++
 .../spring/GridSpringCacheManagerSelfTest.java  | 359 +----------------
 ...ridSpringCacheManagerSpringBeanSelfTest.java |  40 ++
 .../spring-caching-ignite-spring-bean.xml       |  90 +++++
 .../testsuites/IgniteSpringTestSuite.java       |   4 +
 ...ridSpringTransactionManagerAbstractTest.java | 119 ++++++
 .../GridSpringTransactionManagerSelfTest.java   | 127 +-----
 ...ingTransactionManagerSpringBeanSelfTest.java |  35 ++
 .../spring/GridSpringTransactionService.java    |   2 -
 13 files changed, 788 insertions(+), 503 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/d6300fc3/modules/spring/src/main/java/org/apache/ignite/cache/spring/SpringCacheManager.java
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/main/java/org/apache/ignite/cache/spring/SpringCacheManager.java
 
b/modules/spring/src/main/java/org/apache/ignite/cache/spring/SpringCacheManager.java
index 93c18d4..0b02f4c 100644
--- 
a/modules/spring/src/main/java/org/apache/ignite/cache/spring/SpringCacheManager.java
+++ 
b/modules/spring/src/main/java/org/apache/ignite/cache/spring/SpringCacheManager.java
@@ -20,21 +20,24 @@ package org.apache.ignite.cache.spring;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import java.util.function.Function;
 import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteLock;
 import org.apache.ignite.IgniteSpring;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.configuration.NearCacheConfiguration;
-import java.util.concurrent.ConcurrentHashMap;
-import org.springframework.beans.factory.InitializingBean;
+import org.apache.ignite.internal.util.typedef.internal.U;
 import org.springframework.cache.Cache;
 import org.springframework.cache.CacheManager;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.context.event.EventListener;
 
 /**
  * Implementation of Spring cache abstraction based on Ignite cache.
@@ -140,7 +143,7 @@ import org.springframework.context.ApplicationContextAware;
  * Ignite distribution, and all these nodes will participate
  * in caching the data.
  */
-public class SpringCacheManager implements CacheManager, InitializingBean, 
ApplicationContextAware {
+public class SpringCacheManager implements CacheManager, 
ApplicationListener<ContextRefreshedEvent>, ApplicationContextAware {
     /** Default locks count. */
     private static final int DEFAULT_LOCKS_COUNT = 512;
 
@@ -311,7 +314,7 @@ public class SpringCacheManager implements CacheManager, 
InitializingBean, Appli
     }
 
     /** {@inheritDoc} */
-    @Override public void afterPropertiesSet() throws Exception {
+    @Override public void onApplicationEvent(ContextRefreshedEvent event) {
         assert ignite == null;
 
         if (cfgPath != null && cfg != null) {
@@ -321,12 +324,18 @@ public class SpringCacheManager implements CacheManager, 
InitializingBean, Appli
                 "'igniteInstanceName' property.");
         }
 
-        if (cfgPath != null)
-            ignite = IgniteSpring.start(cfgPath, springCtx);
-        else if (cfg != null)
-            ignite = IgniteSpring.start(cfg, springCtx);
-        else
-            ignite = Ignition.ignite(igniteInstanceName);
+        try {
+            if (cfgPath != null) {
+                ignite = IgniteSpring.start(cfgPath, springCtx);
+            }
+            else if (cfg != null)
+                ignite = IgniteSpring.start(cfg, springCtx);
+            else
+                ignite = Ignition.ignite(igniteInstanceName);
+        }
+        catch (IgniteCheckedException e) {
+            throw U.convertException(e);
+        }
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/d6300fc3/modules/spring/src/main/java/org/apache/ignite/transactions/spring/SpringTransactionManager.java
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/main/java/org/apache/ignite/transactions/spring/SpringTransactionManager.java
 
b/modules/spring/src/main/java/org/apache/ignite/transactions/spring/SpringTransactionManager.java
index d09656e..57c099a 100644
--- 
a/modules/spring/src/main/java/org/apache/ignite/transactions/spring/SpringTransactionManager.java
+++ 
b/modules/spring/src/main/java/org/apache/ignite/transactions/spring/SpringTransactionManager.java
@@ -19,17 +19,21 @@ package org.apache.ignite.transactions.spring;
 
 import java.util.concurrent.TimeUnit;
 import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.IgniteSpring;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.transactions.Transaction;
 import org.apache.ignite.transactions.TransactionConcurrency;
 import org.apache.ignite.transactions.TransactionIsolation;
-import org.springframework.beans.factory.InitializingBean;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.context.event.EventListener;
 import org.springframework.transaction.CannotCreateTransactionException;
 import org.springframework.transaction.InvalidIsolationLevelException;
 import org.springframework.transaction.PlatformTransactionManager;
@@ -197,7 +201,7 @@ import 
org.springframework.transaction.support.TransactionSynchronizationManager
  * </pre>
  */
 public class SpringTransactionManager extends 
AbstractPlatformTransactionManager
-    implements ResourceTransactionManager, PlatformTransactionManager, 
InitializingBean, ApplicationContextAware {
+    implements ResourceTransactionManager, PlatformTransactionManager, 
ApplicationListener<ContextRefreshedEvent>, ApplicationContextAware {
     /**
      * Logger.
      */
@@ -339,7 +343,7 @@ public class SpringTransactionManager extends 
AbstractPlatformTransactionManager
     }
 
     /** {@inheritDoc} */
-    @Override public void afterPropertiesSet() throws Exception {
+    @Override public void onApplicationEvent(ContextRefreshedEvent event) {
         assert ignite == null;
 
         if (cfgPath != null && cfg != null) {
@@ -349,12 +353,18 @@ public class SpringTransactionManager extends 
AbstractPlatformTransactionManager
                     "'igniteInstanceName' property.");
         }
 
-        if (cfgPath != null)
-            ignite = IgniteSpring.start(cfgPath, springCtx);
-        else if (cfg != null)
-            ignite = IgniteSpring.start(cfg, springCtx);
-        else
-            ignite = Ignition.ignite(igniteInstanceName);
+        try {
+            if (cfgPath != null) {
+                ignite = IgniteSpring.start(cfgPath, springCtx);
+            }
+            else if (cfg != null)
+                ignite = IgniteSpring.start(cfg, springCtx);
+            else
+                ignite = Ignition.ignite(igniteInstanceName);
+        }
+        catch (IgniteCheckedException e) {
+            throw U.convertException(e);
+        }
 
         if (transactionConcurrency == null)
             transactionConcurrency = 
ignite.configuration().getTransactionConfiguration().getDefaultTxConcurrency();

http://git-wip-us.apache.org/repos/asf/ignite/blob/d6300fc3/modules/spring/src/test/java/config/spring-transactions-ignite-spring-bean.xml
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/test/java/config/spring-transactions-ignite-spring-bean.xml
 
b/modules/spring/src/test/java/config/spring-transactions-ignite-spring-bean.xml
new file mode 100644
index 0000000..57a0ced
--- /dev/null
+++ 
b/modules/spring/src/test/java/config/spring-transactions-ignite-spring-bean.xml
@@ -0,0 +1,67 @@
+<?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";
+       xmlns:tx="http://www.springframework.org/schema/tx";
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx.xsd";>
+
+    <tx:annotation-driven/>
+
+    <bean id="mySpringBean" class="org.apache.ignite.IgniteSpringBean">
+        <property name="configuration">
+            <bean id="ignite.cfg" 
class="org.apache.ignite.configuration.IgniteConfiguration">
+                <property name="peerClassLoadingEnabled" value="true"/>
+                <property name="igniteInstanceName" value="testGrid"/>
+
+                <property name="cacheConfiguration">
+                    <list>
+                        <bean 
class="org.apache.ignite.configuration.CacheConfiguration">
+                            <property name="name" value="testCache"/>
+                            <property name="atomicityMode" 
value="TRANSACTIONAL"/>
+                        </bean>
+                    </list>
+                </property>
+
+                <property name="discoverySpi">
+                    <bean 
class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
+                        <property name="ipFinder">
+                            <bean 
class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
+                                <property name="addresses">
+                                    <list>
+                                        <value>127.0.0.1:47500..47509</value>
+                                    </list>
+                                </property>
+                            </bean>
+                        </property>
+                    </bean>
+                </property>
+            </bean>
+        </property>
+    </bean>
+
+    <bean id="gridSpringTransactionService" 
class="org.apache.ignite.transactions.spring.GridSpringTransactionService"/>
+
+    <bean id="transactionManager" 
class="org.apache.ignite.transactions.spring.SpringTransactionManager">
+        <property name="transactionConcurrency" value="OPTIMISTIC"/>
+        <property name="igniteInstanceName" value="testGrid"/>
+    </bean>
+</beans>

http://git-wip-us.apache.org/repos/asf/ignite/blob/d6300fc3/modules/spring/src/test/java/config/spring-transactions.xml
----------------------------------------------------------------------
diff --git a/modules/spring/src/test/java/config/spring-transactions.xml 
b/modules/spring/src/test/java/config/spring-transactions.xml
index f40e880..f1a29ad 100644
--- a/modules/spring/src/test/java/config/spring-transactions.xml
+++ b/modules/spring/src/test/java/config/spring-transactions.xml
@@ -19,17 +19,14 @@
 
 <beans xmlns="http://www.springframework.org/schema/beans";
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-       xmlns:context="http://www.springframework.org/schema/context";
        xmlns:tx="http://www.springframework.org/schema/tx";
        xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
-       http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx.xsd";>
 
     <tx:annotation-driven/>
-    <context:component-scan 
base-package="org.apache.ignite.transactions.spring">
-        <context:exclude-filter type="annotation" 
expression="org.springframework.context.annotation.Configuration"/>
-    </context:component-scan>
+
+    <bean id="gridSpringTransactionService" 
class="org.apache.ignite.transactions.spring.GridSpringTransactionService"/>
 
     <bean id="transactionManager" 
class="org.apache.ignite.transactions.spring.SpringTransactionManager">
         <property name="transactionConcurrency" value="OPTIMISTIC"/>

http://git-wip-us.apache.org/repos/asf/ignite/blob/d6300fc3/modules/spring/src/test/java/org/apache/ignite/cache/spring/GridSpringCacheManagerAbstractTest.java
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/test/java/org/apache/ignite/cache/spring/GridSpringCacheManagerAbstractTest.java
 
b/modules/spring/src/test/java/org/apache/ignite/cache/spring/GridSpringCacheManagerAbstractTest.java
new file mode 100644
index 0000000..370c634
--- /dev/null
+++ 
b/modules/spring/src/test/java/org/apache/ignite/cache/spring/GridSpringCacheManagerAbstractTest.java
@@ -0,0 +1,382 @@
+/*
+ * 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.ignite.cache.spring;
+
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+/**
+ * Spring cache test.
+ */
+public abstract class GridSpringCacheManagerAbstractTest extends 
GridCommonAbstractTest {
+    /** */
+    protected static final String CACHE_NAME = "testCache";
+
+    /** */
+    protected static final String DYNAMIC_CACHE_NAME = "dynamicCache";
+
+    /** */
+    private static final Object NULL;
+
+    /**
+     */
+    static {
+        try {
+            NULL = U.field(SpringCache.class, "NULL");
+        }
+        catch (IgniteCheckedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /** */
+    protected GridSpringCacheTestService svc;
+
+    /** */
+    protected GridSpringDynamicCacheTestService dynamicSvc;
+
+    /** {@inheritDoc} */
+    @Override public String getTestIgniteInstanceName() {
+        return "testGrid";
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testSimpleKey() throws Exception {
+        for (int i = 0; i < 3; i++) {
+            assertEquals("value" + i, svc.simpleKey(i));
+            assertEquals("value" + i, svc.simpleKey(i));
+        }
+
+        assertEquals(3, svc.called());
+
+        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
+
+        assertEquals(3, c.size());
+
+        for (int i = 0; i < 3; i++)
+            assertEquals("value" + i, c.get(i));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testSimpleKeyNullValue() throws Exception {
+        for (int i = 0; i < 3; i++) {
+            assertNull(svc.simpleKeyNullValue(i));
+            assertNull(svc.simpleKeyNullValue(i));
+        }
+
+        assertEquals(3, svc.called());
+
+        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
+
+        assertEquals(3, c.size());
+
+        for (int i = 0; i < 3; i++)
+            assertEquals(NULL, c.get(i));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testComplexKey() throws Exception {
+        for (int i = 0; i < 3; i++) {
+            assertEquals("value" + i + "suffix" + i, svc.complexKey(i, 
"suffix" + i));
+            assertEquals("value" + i + "suffix" + i, svc.complexKey(i, 
"suffix" + i));
+        }
+
+        assertEquals(3, svc.called());
+
+        IgniteCache<GridSpringCacheTestKey, String> c = 
grid().cache(CACHE_NAME);
+
+        assertEquals(3, c.size());
+
+        for (int i = 0; i < 3; i++)
+            assertEquals("value" + i + "suffix" + i, c.get(new 
GridSpringCacheTestKey(i, "suffix" + i)));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testComplexKeyNullValue() throws Exception {
+        for (int i = 0; i < 3; i++) {
+            assertNull(svc.complexKeyNullValue(i, "suffix" + i));
+            assertNull(svc.complexKeyNullValue(i, "suffix" + i));
+        }
+
+        assertEquals(3, svc.called());
+
+        IgniteCache<GridSpringCacheTestKey, String> c = 
grid().cache(CACHE_NAME);
+
+        assertEquals(3, c.size());
+
+        for (int i = 0; i < 3; i++)
+            assertEquals(NULL, c.get(new GridSpringCacheTestKey(i, "suffix" + 
i)));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testSimpleKeyPut() throws Exception {
+        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
+
+        for (int i = 0; i < 3; i++) {
+            assertEquals("value" + i + "odd", svc.simpleKeyPut(i));
+
+            assertEquals(i + 1, c.size());
+            assertEquals("value" + i + "odd", c.get(i));
+
+            assertEquals("value" + i + "even", svc.simpleKeyPut(i));
+
+            assertEquals(i + 1, c.size());
+            assertEquals("value" + i + "even", c.get(i));
+        }
+
+        assertEquals(6, svc.called());
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testSimpleKeyPutNullValue() throws Exception {
+        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
+
+        for (int i = 0; i < 3; i++) {
+            assertNull(svc.simpleKeyPutNullValue(i));
+
+            assertEquals(i + 1, c.size());
+            assertEquals(NULL, c.get(i));
+
+            assertNull(svc.simpleKeyPutNullValue(i));
+
+            assertEquals(i + 1, c.size());
+            assertEquals(NULL, c.get(i));
+        }
+
+        assertEquals(6, svc.called());
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testComplexKeyPut() throws Exception {
+        IgniteCache<GridSpringCacheTestKey, String> c = 
grid().cache(CACHE_NAME);
+
+        for (int i = 0; i < 3; i++) {
+            assertEquals("value" + i + "suffix" + i + "odd", 
svc.complexKeyPut(i, "suffix" + i));
+
+            assertEquals(i + 1, c.size());
+            assertEquals("value" + i + "suffix" + i + "odd", c.get(new 
GridSpringCacheTestKey(i, "suffix" + i)));
+
+            assertEquals("value" + i + "suffix" + i + "even", 
svc.complexKeyPut(i, "suffix" + i));
+
+            assertEquals(i + 1, c.size());
+            assertEquals("value" + i + "suffix" + i + "even", c.get(new 
GridSpringCacheTestKey(i, "suffix" + i)));
+        }
+
+        assertEquals(6, svc.called());
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testComplexKeyPutNullValue() throws Exception {
+        IgniteCache<GridSpringCacheTestKey, String> c = 
grid().cache(CACHE_NAME);
+
+        for (int i = 0; i < 3; i++) {
+            assertNull(svc.complexKeyPutNullValue(i, "suffix" + i));
+
+            assertEquals(i + 1, c.size());
+            assertEquals(NULL, c.get(new GridSpringCacheTestKey(i, "suffix" + 
i)));
+
+            assertNull(svc.complexKeyPutNullValue(i, "suffix" + i));
+
+            assertEquals(i + 1, c.size());
+            assertEquals(NULL, c.get(new GridSpringCacheTestKey(i, "suffix" + 
i)));
+        }
+
+        assertEquals(6, svc.called());
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testSimpleKeyEvict() throws Exception {
+        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
+
+        for (int i = 0; i < 3; i++)
+            c.put(i, "value" + i);
+
+        assertEquals(3, c.size());
+
+        assertEquals("value0", c.get(0));
+        assertEquals("value1", c.get(1));
+        assertEquals("value2", c.get(2));
+
+        svc.simpleKeyEvict(2);
+
+        assertEquals(2, c.size());
+
+        assertEquals("value0", c.get(0));
+        assertEquals("value1", c.get(1));
+        assertNull(c.get(2));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testComplexKeyEvict() throws Exception {
+        IgniteCache<GridSpringCacheTestKey, String> c = 
grid().cache(CACHE_NAME);
+
+        for (int i = 0; i < 3; i++)
+            c.put(new GridSpringCacheTestKey(i, "suffix" + i), "value" + i);
+
+        assertEquals(3, c.size());
+
+        assertEquals("value0", c.get(new GridSpringCacheTestKey(0, "suffix" + 
0)));
+        assertEquals("value1", c.get(new GridSpringCacheTestKey(1, "suffix" + 
1)));
+        assertEquals("value2", c.get(new GridSpringCacheTestKey(2, "suffix" + 
2)));
+
+        svc.complexKeyEvict(2, "suffix" + 2);
+
+        assertEquals(2, c.size());
+
+        assertEquals("value0", c.get(new GridSpringCacheTestKey(0, "suffix" + 
0)));
+        assertEquals("value1", c.get(new GridSpringCacheTestKey(1, "suffix" + 
1)));
+        assertNull(c.get(new GridSpringCacheTestKey(2, "suffix" + 2)));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testEvictAll() throws Exception {
+        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
+
+        for (int i = 0; i < 3; i++)
+            c.put(i, "value" + i);
+
+        assertEquals(3, c.size());
+
+        assertEquals("value0", c.get(0));
+        assertEquals("value1", c.get(1));
+        assertEquals("value2", c.get(2));
+
+        svc.evictAll();
+
+        assertEquals(0, c.size());
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testDynamicCache() throws Exception {
+        for (int i = 0; i < 3; i++) {
+            assertEquals("value" + i, dynamicSvc.cacheable(i));
+            assertEquals("value" + i, dynamicSvc.cacheable(i));
+        }
+
+        assertEquals(3, dynamicSvc.called());
+
+        IgniteCache<Integer, String> c = grid().cache(DYNAMIC_CACHE_NAME);
+
+        // Check that correct config is used.
+        assertEquals(2, 
c.getConfiguration(CacheConfiguration.class).getBackups());
+
+        assertEquals(3, c.size());
+
+        for (int i = 0; i < 3; i++)
+            assertEquals("value" + i, c.get(i));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testDynamicCachePut() throws Exception {
+        for (int i = 0; i < 3; i++) {
+            assertEquals("value" + i, dynamicSvc.cachePut(i));
+            assertEquals("value" + i, dynamicSvc.cachePut(i));
+        }
+
+        assertEquals(6, dynamicSvc.called());
+
+        IgniteCache<Integer, String> c = grid().cache(DYNAMIC_CACHE_NAME);
+
+        // Check that correct config is used.
+        assertEquals(2, 
c.getConfiguration(CacheConfiguration.class).getBackups());
+
+        assertEquals(3, c.size());
+
+        for (int i = 0; i < 3; i++)
+            assertEquals("value" + i, c.get(i));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testDynamicCacheEvict() throws Exception {
+        CacheConfiguration<Integer, String> cacheCfg = new 
CacheConfiguration<>(DEFAULT_CACHE_NAME);
+
+        cacheCfg.setName(DYNAMIC_CACHE_NAME);
+
+        IgniteCache<Integer, String> c = grid().createCache(cacheCfg);
+
+        for (int i = 0; i < 3; i++)
+            c.put(i, "value" + i);
+
+        assertEquals(3, c.size());
+
+        for (int i = 0; i < 2; i++) {
+            dynamicSvc.cacheEvict(i);
+            dynamicSvc.cacheEvict(i);
+        }
+
+        assertEquals(4, dynamicSvc.called());
+
+        assertEquals(1, c.size());
+
+        assertEquals("value2", c.get(2));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testDynamicCacheEvictAll() throws Exception {
+        CacheConfiguration<Integer, String> cacheCfg = new 
CacheConfiguration<>(DEFAULT_CACHE_NAME);
+
+        cacheCfg.setName(DYNAMIC_CACHE_NAME);
+
+        IgniteCache<Integer, String> c = grid().createCache(cacheCfg);
+
+        for (int i = 0; i < 3; i++)
+            c.put(i, "value" + i);
+
+        assertEquals(3, c.size());
+
+        dynamicSvc.cacheEvictAll();
+        dynamicSvc.cacheEvictAll();
+
+        assertEquals(2, dynamicSvc.called());
+
+        assertEquals(0, c.size());
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/d6300fc3/modules/spring/src/test/java/org/apache/ignite/cache/spring/GridSpringCacheManagerSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/test/java/org/apache/ignite/cache/spring/GridSpringCacheManagerSelfTest.java
 
b/modules/spring/src/test/java/org/apache/ignite/cache/spring/GridSpringCacheManagerSelfTest.java
index 5a0e759..5d3c320 100644
--- 
a/modules/spring/src/test/java/org/apache/ignite/cache/spring/GridSpringCacheManagerSelfTest.java
+++ 
b/modules/spring/src/test/java/org/apache/ignite/cache/spring/GridSpringCacheManagerSelfTest.java
@@ -17,51 +17,21 @@
 
 package org.apache.ignite.cache.spring;
 
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.util.typedef.internal.U;
 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.testframework.junits.common.GridCommonAbstractTest;
 import org.springframework.beans.factory.BeanFactory;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 
 /**
  * Spring cache test.
  */
-public class GridSpringCacheManagerSelfTest extends GridCommonAbstractTest {
+public class GridSpringCacheManagerSelfTest extends 
GridSpringCacheManagerAbstractTest {
     /** */
     private static final TcpDiscoveryIpFinder IP_FINDER = new 
TcpDiscoveryVmIpFinder(true);
 
-    /** */
-    private static final String CACHE_NAME = "testCache";
-
-    /** */
-    private static final String DYNAMIC_CACHE_NAME = "dynamicCache";
-
-    /** */
-    private static final Object NULL;
-
-    /**
-     */
-    static {
-        try {
-            NULL = U.field(SpringCache.class, "NULL");
-        }
-        catch (IgniteCheckedException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /** */
-    private GridSpringCacheTestService svc;
-
-    /** */
-    private GridSpringDynamicCacheTestService dynamicSvc;
-
     /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String 
igniteInstanceName) throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
@@ -82,11 +52,6 @@ public class GridSpringCacheManagerSelfTest extends 
GridCommonAbstractTest {
     }
 
     /** {@inheritDoc} */
-    @Override public String getTestIgniteInstanceName() {
-        return "testGrid";
-    }
-
-    /** {@inheritDoc} */
     @Override protected void beforeTestsStarted() throws Exception {
         startGrid();
     }
@@ -113,326 +78,4 @@ public class GridSpringCacheManagerSelfTest extends 
GridCommonAbstractTest {
 
         grid().destroyCache(DYNAMIC_CACHE_NAME);
     }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testSimpleKey() throws Exception {
-        for (int i = 0; i < 3; i++) {
-            assertEquals("value" + i, svc.simpleKey(i));
-            assertEquals("value" + i, svc.simpleKey(i));
-        }
-
-        assertEquals(3, svc.called());
-
-        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
-
-        assertEquals(3, c.size());
-
-        for (int i = 0; i < 3; i++)
-            assertEquals("value" + i, c.get(i));
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testSimpleKeyNullValue() throws Exception {
-        for (int i = 0; i < 3; i++) {
-            assertNull(svc.simpleKeyNullValue(i));
-            assertNull(svc.simpleKeyNullValue(i));
-        }
-
-        assertEquals(3, svc.called());
-
-        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
-
-        assertEquals(3, c.size());
-
-        for (int i = 0; i < 3; i++)
-            assertEquals(NULL, c.get(i));
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testComplexKey() throws Exception {
-        for (int i = 0; i < 3; i++) {
-            assertEquals("value" + i + "suffix" + i, svc.complexKey(i, 
"suffix" + i));
-            assertEquals("value" + i + "suffix" + i, svc.complexKey(i, 
"suffix" + i));
-        }
-
-        assertEquals(3, svc.called());
-
-        IgniteCache<GridSpringCacheTestKey, String> c = 
grid().cache(CACHE_NAME);
-
-        assertEquals(3, c.size());
-
-        for (int i = 0; i < 3; i++)
-            assertEquals("value" + i + "suffix" + i, c.get(new 
GridSpringCacheTestKey(i, "suffix" + i)));
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testComplexKeyNullValue() throws Exception {
-        for (int i = 0; i < 3; i++) {
-            assertNull(svc.complexKeyNullValue(i, "suffix" + i));
-            assertNull(svc.complexKeyNullValue(i, "suffix" + i));
-        }
-
-        assertEquals(3, svc.called());
-
-        IgniteCache<GridSpringCacheTestKey, String> c = 
grid().cache(CACHE_NAME);
-
-        assertEquals(3, c.size());
-
-        for (int i = 0; i < 3; i++)
-            assertEquals(NULL, c.get(new GridSpringCacheTestKey(i, "suffix" + 
i)));
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testSimpleKeyPut() throws Exception {
-        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
-
-        for (int i = 0; i < 3; i++) {
-            assertEquals("value" + i + "odd", svc.simpleKeyPut(i));
-
-            assertEquals(i + 1, c.size());
-            assertEquals("value" + i + "odd", c.get(i));
-
-            assertEquals("value" + i + "even", svc.simpleKeyPut(i));
-
-            assertEquals(i + 1, c.size());
-            assertEquals("value" + i + "even", c.get(i));
-        }
-
-        assertEquals(6, svc.called());
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testSimpleKeyPutNullValue() throws Exception {
-        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
-
-        for (int i = 0; i < 3; i++) {
-            assertNull(svc.simpleKeyPutNullValue(i));
-
-            assertEquals(i + 1, c.size());
-            assertEquals(NULL, c.get(i));
-
-            assertNull(svc.simpleKeyPutNullValue(i));
-
-            assertEquals(i + 1, c.size());
-            assertEquals(NULL, c.get(i));
-        }
-
-        assertEquals(6, svc.called());
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testComplexKeyPut() throws Exception {
-        IgniteCache<GridSpringCacheTestKey, String> c = 
grid().cache(CACHE_NAME);
-
-        for (int i = 0; i < 3; i++) {
-            assertEquals("value" + i + "suffix" + i + "odd", 
svc.complexKeyPut(i, "suffix" + i));
-
-            assertEquals(i + 1, c.size());
-            assertEquals("value" + i + "suffix" + i + "odd", c.get(new 
GridSpringCacheTestKey(i, "suffix" + i)));
-
-            assertEquals("value" + i + "suffix" + i + "even", 
svc.complexKeyPut(i, "suffix" + i));
-
-            assertEquals(i + 1, c.size());
-            assertEquals("value" + i + "suffix" + i + "even", c.get(new 
GridSpringCacheTestKey(i, "suffix" + i)));
-        }
-
-        assertEquals(6, svc.called());
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testComplexKeyPutNullValue() throws Exception {
-        IgniteCache<GridSpringCacheTestKey, String> c = 
grid().cache(CACHE_NAME);
-
-        for (int i = 0; i < 3; i++) {
-            assertNull(svc.complexKeyPutNullValue(i, "suffix" + i));
-
-            assertEquals(i + 1, c.size());
-            assertEquals(NULL, c.get(new GridSpringCacheTestKey(i, "suffix" + 
i)));
-
-            assertNull(svc.complexKeyPutNullValue(i, "suffix" + i));
-
-            assertEquals(i + 1, c.size());
-            assertEquals(NULL, c.get(new GridSpringCacheTestKey(i, "suffix" + 
i)));
-        }
-
-        assertEquals(6, svc.called());
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testSimpleKeyEvict() throws Exception {
-        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
-
-        for (int i = 0; i < 3; i++)
-            c.put(i, "value" + i);
-
-        assertEquals(3, c.size());
-
-        assertEquals("value0", c.get(0));
-        assertEquals("value1", c.get(1));
-        assertEquals("value2", c.get(2));
-
-        svc.simpleKeyEvict(2);
-
-        assertEquals(2, c.size());
-
-        assertEquals("value0", c.get(0));
-        assertEquals("value1", c.get(1));
-        assertNull(c.get(2));
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testComplexKeyEvict() throws Exception {
-        IgniteCache<GridSpringCacheTestKey, String> c = 
grid().cache(CACHE_NAME);
-
-        for (int i = 0; i < 3; i++)
-            c.put(new GridSpringCacheTestKey(i, "suffix" + i), "value" + i);
-
-        assertEquals(3, c.size());
-
-        assertEquals("value0", c.get(new GridSpringCacheTestKey(0, "suffix" + 
0)));
-        assertEquals("value1", c.get(new GridSpringCacheTestKey(1, "suffix" + 
1)));
-        assertEquals("value2", c.get(new GridSpringCacheTestKey(2, "suffix" + 
2)));
-
-        svc.complexKeyEvict(2, "suffix" + 2);
-
-        assertEquals(2, c.size());
-
-        assertEquals("value0", c.get(new GridSpringCacheTestKey(0, "suffix" + 
0)));
-        assertEquals("value1", c.get(new GridSpringCacheTestKey(1, "suffix" + 
1)));
-        assertNull(c.get(new GridSpringCacheTestKey(2, "suffix" + 2)));
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testEvictAll() throws Exception {
-        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
-
-        for (int i = 0; i < 3; i++)
-            c.put(i, "value" + i);
-
-        assertEquals(3, c.size());
-
-        assertEquals("value0", c.get(0));
-        assertEquals("value1", c.get(1));
-        assertEquals("value2", c.get(2));
-
-        svc.evictAll();
-
-        assertEquals(0, c.size());
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testDynamicCache() throws Exception {
-        for (int i = 0; i < 3; i++) {
-            assertEquals("value" + i, dynamicSvc.cacheable(i));
-            assertEquals("value" + i, dynamicSvc.cacheable(i));
-        }
-
-        assertEquals(3, dynamicSvc.called());
-
-        IgniteCache<Integer, String> c = grid().cache(DYNAMIC_CACHE_NAME);
-
-        // Check that correct config is used.
-        assertEquals(2, 
c.getConfiguration(CacheConfiguration.class).getBackups());
-
-        assertEquals(3, c.size());
-
-        for (int i = 0; i < 3; i++)
-            assertEquals("value" + i, c.get(i));
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testDynamicCachePut() throws Exception {
-        for (int i = 0; i < 3; i++) {
-            assertEquals("value" + i, dynamicSvc.cachePut(i));
-            assertEquals("value" + i, dynamicSvc.cachePut(i));
-        }
-
-        assertEquals(6, dynamicSvc.called());
-
-        IgniteCache<Integer, String> c = grid().cache(DYNAMIC_CACHE_NAME);
-
-        // Check that correct config is used.
-        assertEquals(2, 
c.getConfiguration(CacheConfiguration.class).getBackups());
-
-        assertEquals(3, c.size());
-
-        for (int i = 0; i < 3; i++)
-            assertEquals("value" + i, c.get(i));
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testDynamicCacheEvict() throws Exception {
-        CacheConfiguration<Integer, String> cacheCfg = new 
CacheConfiguration<>(DEFAULT_CACHE_NAME);
-
-        cacheCfg.setName(DYNAMIC_CACHE_NAME);
-
-        IgniteCache<Integer, String> c = grid().createCache(cacheCfg);
-
-        for (int i = 0; i < 3; i++)
-            c.put(i, "value" + i);
-
-        assertEquals(3, c.size());
-
-        for (int i = 0; i < 2; i++) {
-            dynamicSvc.cacheEvict(i);
-            dynamicSvc.cacheEvict(i);
-        }
-
-        assertEquals(4, dynamicSvc.called());
-
-        assertEquals(1, c.size());
-
-        assertEquals("value2", c.get(2));
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testDynamicCacheEvictAll() throws Exception {
-        CacheConfiguration<Integer, String> cacheCfg = new 
CacheConfiguration<>(DEFAULT_CACHE_NAME);
-
-        cacheCfg.setName(DYNAMIC_CACHE_NAME);
-
-        IgniteCache<Integer, String> c = grid().createCache(cacheCfg);
-
-        for (int i = 0; i < 3; i++)
-            c.put(i, "value" + i);
-
-        assertEquals(3, c.size());
-
-        dynamicSvc.cacheEvictAll();
-        dynamicSvc.cacheEvictAll();
-
-        assertEquals(2, dynamicSvc.called());
-
-        assertEquals(0, c.size());
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/d6300fc3/modules/spring/src/test/java/org/apache/ignite/cache/spring/GridSpringCacheManagerSpringBeanSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/test/java/org/apache/ignite/cache/spring/GridSpringCacheManagerSpringBeanSelfTest.java
 
b/modules/spring/src/test/java/org/apache/ignite/cache/spring/GridSpringCacheManagerSpringBeanSelfTest.java
new file mode 100644
index 0000000..8557cc2
--- /dev/null
+++ 
b/modules/spring/src/test/java/org/apache/ignite/cache/spring/GridSpringCacheManagerSpringBeanSelfTest.java
@@ -0,0 +1,40 @@
+/*
+ * 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.ignite.cache.spring;
+
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+/**
+ * Spring cache test.
+ */
+public class GridSpringCacheManagerSpringBeanSelfTest extends 
GridSpringCacheManagerAbstractTest {
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        BeanFactory factory = new 
ClassPathXmlApplicationContext("org/apache/ignite/cache/spring/spring-caching-ignite-spring-bean.xml");
+
+        svc = (GridSpringCacheTestService)factory.getBean("testService");
+        dynamicSvc = 
(GridSpringDynamicCacheTestService)factory.getBean("dynamicTestService");
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        stopAllGrids();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/d6300fc3/modules/spring/src/test/java/org/apache/ignite/cache/spring/spring-caching-ignite-spring-bean.xml
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/test/java/org/apache/ignite/cache/spring/spring-caching-ignite-spring-bean.xml
 
b/modules/spring/src/test/java/org/apache/ignite/cache/spring/spring-caching-ignite-spring-bean.xml
new file mode 100644
index 0000000..2671a5d
--- /dev/null
+++ 
b/modules/spring/src/test/java/org/apache/ignite/cache/spring/spring-caching-ignite-spring-bean.xml
@@ -0,0 +1,90 @@
+<?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";
+       xmlns:cache="http://www.springframework.org/schema/cache";
+       xsi:schemaLocation="
+        http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
+        http://www.springframework.org/schema/cache 
http://www.springframework.org/schema/cache/spring-cache.xsd";>
+
+    <bean id="mySpringBean" class="org.apache.ignite.IgniteSpringBean">
+        <property name="configuration">
+            <bean id="ignite.cfg" 
class="org.apache.ignite.configuration.IgniteConfiguration">
+                <property name="peerClassLoadingEnabled" value="true"/>
+                <property name="igniteInstanceName" value="testGrid"/>
+
+                <property name="cacheConfiguration">
+                    <list>
+                        <bean 
class="org.apache.ignite.configuration.CacheConfiguration">
+                            <property name="name" value="testCache"/>
+                            <property name="atomicityMode" 
value="TRANSACTIONAL"/>
+                        </bean>
+                    </list>
+                </property>
+
+                <property name="discoverySpi">
+                    <bean 
class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
+                        <property name="ipFinder">
+                            <bean 
class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
+                                <property name="addresses">
+                                    <list>
+                                        <value>127.0.0.1:47500..47509</value>
+                                    </list>
+                                </property>
+                            </bean>
+                        </property>
+                    </bean>
+                </property>
+            </bean>
+        </property>
+    </bean>
+
+    <!--
+        Test service with cacheable methods.
+    -->
+    <bean id="testService" 
class="org.apache.ignite.cache.spring.GridSpringCacheTestService"/>
+
+    <!--
+        Test service with cacheable methods (dynamic cache).
+    -->
+    <bean id="dynamicTestService" 
class="org.apache.ignite.cache.spring.GridSpringDynamicCacheTestService"/>
+
+    <!--
+        Cache manager.
+    -->
+    <bean id="cacheManager" 
class="org.apache.ignite.cache.spring.SpringCacheManager">
+        <property name="igniteInstanceName" value="testGrid"/>
+        <property name="dynamicCacheConfiguration">
+            <bean class="org.apache.ignite.configuration.CacheConfiguration">
+                <property name="backups" value="2"/>
+            </bean>
+        </property>
+    </bean>
+
+    <!--
+        Key generator.
+    -->
+    <bean id="keyGenerator" 
class="org.apache.ignite.cache.spring.GridSpringCacheTestKeyGenerator"/>
+
+    <!--
+        Enable annotation-driver configuration for caching.
+    -->
+    <cache:annotation-driven key-generator="keyGenerator"/>
+</beans>

http://git-wip-us.apache.org/repos/asf/ignite/blob/d6300fc3/modules/spring/src/test/java/org/apache/ignite/testsuites/IgniteSpringTestSuite.java
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/test/java/org/apache/ignite/testsuites/IgniteSpringTestSuite.java
 
b/modules/spring/src/test/java/org/apache/ignite/testsuites/IgniteSpringTestSuite.java
index ff96c7b..810f6af 100644
--- 
a/modules/spring/src/test/java/org/apache/ignite/testsuites/IgniteSpringTestSuite.java
+++ 
b/modules/spring/src/test/java/org/apache/ignite/testsuites/IgniteSpringTestSuite.java
@@ -19,6 +19,7 @@ package org.apache.ignite.testsuites;
 
 import junit.framework.TestSuite;
 import org.apache.ignite.cache.spring.GridSpringCacheManagerSelfTest;
+import org.apache.ignite.cache.spring.GridSpringCacheManagerSpringBeanSelfTest;
 import org.apache.ignite.cache.spring.SpringCacheManagerContextInjectionTest;
 import org.apache.ignite.cache.spring.SpringCacheTest;
 import 
org.apache.ignite.spring.injection.IgniteSpringBeanSpringResourceInjectionTest;
@@ -38,6 +39,7 @@ import 
org.apache.ignite.spring.IgniteStartFromStreamConfigurationTest;
 import 
org.apache.ignite.spring.injection.GridServiceInjectionSpringResourceTest;
 import org.apache.ignite.testframework.IgniteTestSuite;
 import 
org.apache.ignite.transactions.spring.GridSpringTransactionManagerSelfTest;
+import 
org.apache.ignite.transactions.spring.GridSpringTransactionManagerSpringBeanSelfTest;
 import 
org.apache.ignite.transactions.spring.SpringTransactionManagerContextInjectionTest;
 
 /**
@@ -63,6 +65,7 @@ public class IgniteSpringTestSuite extends TestSuite {
         suite.addTestSuite(GridP2PUserVersionChangeSelfTest.class);
 
         suite.addTestSuite(GridSpringCacheManagerSelfTest.class);
+        suite.addTestSuite(GridSpringCacheManagerSpringBeanSelfTest.class);
 
         suite.addTestSuite(IgniteDynamicCacheConfigTest.class);
 
@@ -76,6 +79,7 @@ public class IgniteSpringTestSuite extends TestSuite {
         suite.addTestSuite(CachePojoStoreXmlWithSqlEscapeSelfTest.class);
 
         suite.addTestSuite(GridSpringTransactionManagerSelfTest.class);
+        
suite.addTestSuite(GridSpringTransactionManagerSpringBeanSelfTest.class);
 
         suite.addTestSuite(GridServiceInjectionSpringResourceTest.class);
         suite.addTestSuite(IgniteSpringBeanSpringResourceInjectionTest.class);

http://git-wip-us.apache.org/repos/asf/ignite/blob/d6300fc3/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionManagerAbstractTest.java
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionManagerAbstractTest.java
 
b/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionManagerAbstractTest.java
new file mode 100644
index 0000000..c58d911
--- /dev/null
+++ 
b/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionManagerAbstractTest.java
@@ -0,0 +1,119 @@
+package org.apache.ignite.transactions.spring;
+
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.apache.ignite.transactions.Transaction;
+import org.springframework.transaction.IllegalTransactionStateException;
+import org.springframework.transaction.InvalidIsolationLevelException;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.support.TransactionCallback;
+import org.springframework.transaction.support.TransactionTemplate;
+
+public abstract class GridSpringTransactionManagerAbstractTest extends 
GridCommonAbstractTest {
+
+    /** */
+    protected static final String CACHE_NAME = "testCache";
+
+    /** */
+    public abstract IgniteCache<Integer, String> cache();
+
+    /** */
+    public abstract GridSpringTransactionService service();
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        cache().removeAll();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String getTestIgniteInstanceName() {
+        return "testGrid";
+    }
+
+    /** */
+    public void testSuccessPut() {
+        int entryCnt = 1_000;
+
+        service().put(cache(), entryCnt);
+
+        assertEquals(entryCnt, cache().size());
+    }
+
+    /** */
+    public void testFailPut() {
+        int entryCnt = 1_000;
+
+        try {
+            service().putWithError(cache(), entryCnt);
+        }
+        catch (NumberFormatException ignored) {
+            System.out.println();
+            // No-op.
+        }
+
+        assertEquals(0, cache().size());
+    }
+
+    /** */
+    public void testMandatoryPropagation() {
+        try {
+            service().putWithMandatoryPropagation(cache());
+        }
+        catch (IllegalTransactionStateException e) {
+            assertEquals("No existing transaction found for transaction marked 
with propagation 'mandatory'", e.getMessage());
+        }
+
+        assertEquals(0, cache().size());
+    }
+
+    /** */
+    public void testUnsupportedIsolationLevel() {
+        try {
+            service().putWithUnsupportedIsolationLevel(cache());
+        }
+        catch (InvalidIsolationLevelException e) {
+            assertEquals("Ignite does not support READ_UNCOMMITTED isolation 
level.", e.getMessage());
+        }
+
+        assertEquals(0, cache().size());
+    }
+
+    /**
+     * @throws Exception If test failed.
+     */
+    public void testDoSetRollbackOnlyInExistingTransaction() throws Exception {
+        SpringTransactionManager mngr = new SpringTransactionManager();
+        mngr.setIgniteInstanceName(grid().name());
+        mngr.onApplicationEvent(null);
+
+        TransactionTemplate txTmpl = new TransactionTemplate(mngr);
+
+        try {
+            txTmpl.execute(new TransactionCallback<Object>() {
+                @Override public Object doInTransaction(TransactionStatus 
status) {
+                    cache().put(1, "1");
+
+                    Transaction tx = grid().transactions().tx();
+
+                    assertFalse(tx.isRollbackOnly());
+
+                    try {
+                        service().putWithError(cache(), 1_000);
+                    }
+                    catch (Exception ignored) {
+                        // No-op.
+                    }
+
+                    assertTrue(tx.isRollbackOnly());
+
+                    return null;
+                }
+            });
+        }
+        catch (Exception ignored) {
+            // No-op.
+        }
+
+        assertEquals(0, cache().size());
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/d6300fc3/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionManagerSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionManagerSelfTest.java
 
b/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionManagerSelfTest.java
index e68ddb4..ae1abb2 100644
--- 
a/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionManagerSelfTest.java
+++ 
b/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionManagerSelfTest.java
@@ -24,27 +24,17 @@ 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.testframework.junits.common.GridCommonAbstractTest;
-import org.apache.ignite.transactions.Transaction;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.GenericXmlApplicationContext;
-import org.springframework.transaction.IllegalTransactionStateException;
-import org.springframework.transaction.InvalidIsolationLevelException;
-import org.springframework.transaction.TransactionStatus;
-import org.springframework.transaction.support.TransactionCallback;
-import org.springframework.transaction.support.TransactionTemplate;
 
 /**
  * Spring transaction test.
  */
-public class GridSpringTransactionManagerSelfTest extends 
GridCommonAbstractTest {
+public class GridSpringTransactionManagerSelfTest extends 
GridSpringTransactionManagerAbstractTest {
     /** */
     private static final TcpDiscoveryIpFinder IP_FINDER = new 
TcpDiscoveryVmIpFinder(true);
 
     /** */
-    private static final String CACHE_NAME = "testCache";
-
-    /** */
     private GridSpringTransactionService service;
 
     /** {@inheritDoc} */
@@ -67,9 +57,12 @@ public class GridSpringTransactionManagerSelfTest extends 
GridCommonAbstractTest
         return cfg;
     }
 
-    /** {@inheritDoc} */
-    @Override public String getTestIgniteInstanceName() {
-        return "testGrid";
+    @Override public IgniteCache<Integer, String> cache() {
+        return grid().cache(CACHE_NAME);
+    }
+
+    @Override public GridSpringTransactionService service() {
+        return service;
     }
 
     /** {@inheritDoc} */
@@ -84,109 +77,7 @@ public class GridSpringTransactionManagerSelfTest extends 
GridCommonAbstractTest
 
     /** {@inheritDoc} */
     @Override protected void beforeTest() throws Exception {
-        ApplicationContext applicationContext = new 
GenericXmlApplicationContext("config/spring-transactions.xml");
-
-        service = 
(GridSpringTransactionService)applicationContext.getBean("gridSpringTransactionService");
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void afterTest() throws Exception {
-        grid().cache(CACHE_NAME).removeAll();
-    }
-
-    /** */
-    public void testSuccessPut() {
-        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
-
-        int entryCnt = 1_000;
-
-        service.put(c, entryCnt);
-
-        assertEquals(entryCnt, c.size());
-    }
-
-    /** */
-    public void testFailPut() {
-        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
-
-        int entryCnt = 1_000;
-
-        try {
-            service.putWithError(c, entryCnt);
-        }
-        catch (Exception ignored) {
-            // No-op.
-        }
-
-        assertEquals(0, c.size());
-    }
-
-    /** */
-    public void testMandatoryPropagation() {
-        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
-
-        try {
-            service.putWithMandatoryPropagation(c);
-        }
-        catch (IllegalTransactionStateException e) {
-            assertEquals("No existing transaction found for transaction marked 
with propagation 'mandatory'", e.getMessage());
-        }
-
-        assertEquals(0, c.size());
-    }
-
-    /** */
-    public void testUnsupportedIsolationLevel() {
-        IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
-
-        try {
-            service.putWithUnsupportedIsolationLevel(c);
-        }
-        catch (InvalidIsolationLevelException e) {
-            assertEquals("Ignite does not support READ_UNCOMMITTED isolation 
level.", e.getMessage());
-        }
-
-        assertEquals(0, c.size());
-    }
-
-    /**
-     * @throws Exception If test failed.
-     */
-    public void testDoSetRollbackOnlyInExistingTransaction() throws Exception {
-        final IgniteCache<Integer, String> c = grid().cache(CACHE_NAME);
-
-        SpringTransactionManager mngr = new SpringTransactionManager();
-        mngr.setIgniteInstanceName(grid().name());
-        mngr.afterPropertiesSet();
-
-        TransactionTemplate txTmpl = new TransactionTemplate(mngr);
-
-        try {
-            txTmpl.execute(new TransactionCallback<Object>() {
-                @Override public Object doInTransaction(TransactionStatus 
status) {
-                    c.put(1, "1");
-
-                    Transaction tx = grid().transactions().tx();
-
-                    assertFalse(tx.isRollbackOnly());
-
-                    try {
-                        service.putWithError(c, 1_000);
-                    }
-                    catch (Exception ignored) {
-                        // No-op.
-                    }
-
-                    assertTrue(tx.isRollbackOnly());
-
-                    return null;
-                }
-            });
-        }
-        catch (Exception ignored) {
-            // No-op.
-        }
-
-        assertEquals(0, c.size());
+        ApplicationContext appCtx = new 
GenericXmlApplicationContext("config/spring-transactions.xml");
+        service = 
(GridSpringTransactionService)appCtx.getBean("gridSpringTransactionService");
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/d6300fc3/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionManagerSpringBeanSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionManagerSpringBeanSelfTest.java
 
b/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionManagerSpringBeanSelfTest.java
new file mode 100644
index 0000000..ab91132
--- /dev/null
+++ 
b/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionManagerSpringBeanSelfTest.java
@@ -0,0 +1,35 @@
+package org.apache.ignite.transactions.spring;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.GenericXmlApplicationContext;
+
+public class GridSpringTransactionManagerSpringBeanSelfTest extends 
GridSpringTransactionManagerAbstractTest {
+
+    /** */
+    private Ignite ignite;
+
+    /** */
+    private GridSpringTransactionService service;
+
+    @Override public IgniteCache<Integer, String> cache() {
+        return ignite.cache(CACHE_NAME);
+    }
+
+    @Override public GridSpringTransactionService service() {
+        return service;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        ApplicationContext appCtx = new 
GenericXmlApplicationContext("config/spring-transactions-ignite-spring-bean.xml");
+        ignite = (Ignite)appCtx.getBean("mySpringBean");
+        service = 
(GridSpringTransactionService)appCtx.getBean("gridSpringTransactionService");
+    }
+
+    @Override protected void afterTest() throws Exception {
+        super.afterTest();
+        stopAllGrids();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/d6300fc3/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionService.java
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionService.java
 
b/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionService.java
index dc9bca7..1a4c2b6 100644
--- 
a/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionService.java
+++ 
b/modules/spring/src/test/java/org/apache/ignite/transactions/spring/GridSpringTransactionService.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.transactions.spring;
 
 import org.apache.ignite.IgniteCache;
-import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -26,7 +25,6 @@ import 
org.springframework.transaction.annotation.Transactional;
 /**
  * Service.
  */
-@Service
 public class GridSpringTransactionService {
     /**
      * @param cache Cache.

Reply via email to