Skip to main content
Version: 5.4

Enabling SpringAware Objects

You can mark Hazelcast Distributed Objects with @SpringAware if the object wants to apply:

  • bean properties
  • factory callbacks such as ApplicationContextAware, BeanNameAware
  • bean post-processing annotations such as InitializingBean, @PostConstruct.

Hazelcast Distributed ExecutorService, or more generally any Hazelcast managed object, can benefit from these features. To enable SpringAware objects, you must first configure HazelcastInstance using hazelcast namespace as explained in Configuring Spring and add <hz:spring-aware /> tag.

SpringAware Examples​

  • Configure a Hazelcast Instance via Spring Configuration and define someBean as Spring Bean.

  • Add <hz:spring-aware /> to Hazelcast configuration to enable @SpringAware.

    xml
    <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:hz="http://www.hazelcast.com/schema/spring"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.hazelcast.com/schema/spring
    http://www.hazelcast.com/schema/spring/hazelcast-spring.xsd">

    <context:component-scan base-package="..."/>

    <hz:hazelcast id="instance">
    <hz:config>
    <hz:spring-aware />
    <hz:cluster-name name="dev"/>
    <hz:network port="5701" port-auto-increment="false">
    <hz:join>
    <hz:multicast enabled="false" />
    <hz:tcp-ip enabled="true">
    <hz:members>10.10.1.2, 10.10.1.3</hz:members>
    </hz:tcp-ip>
    </hz:join>
    </hz:network>
    ...
    </hz:config>
    </hz:hazelcast>

    <bean id="someBean" class="com.hazelcast.examples.spring.SomeBean"
    scope="singleton" />
    ...
    </beans>

Distributed Map SpringAware Example:

  • Create a class called SomeValue which contains Spring Bean definitions like ApplicationContext and SomeBean.

    java
    @SpringAware
    @Component("someValue")
    @Scope("prototype")
    public class SomeValue implements Serializable, ApplicationContextAware {

    private transient ApplicationContext context;
    private transient SomeBean someBean;
    private transient boolean init = false;

    public void setApplicationContext( ApplicationContext applicationContext )
    throws BeansException {
    context = applicationContext;
    }

    @Autowired
    public void setSomeBean( SomeBean someBean) {
    this.someBean = someBean;
    }

    @PostConstruct
    public void init() {
    someBean.doSomethingUseful();
    init = true;
    }
    }
  • Get SomeValue Object from Context and put it into Hazelcast Distributed Map on the first member.

    java
    HazelcastInstance hazelcastInstance =
    (HazelcastInstance) context.getBean( "instance" );
    SomeValue value = (SomeValue) context.getBean( "someValue" );
    IMap<String, SomeValue> map = hazelcastInstance.getMap( "values" );
    map.put( "key", value );
  • Read SomeValue Object from Hazelcast Distributed Map and assert that init method is called since it is annotated with @PostConstruct.

    java
    HazelcastInstance hazelcastInstance =
    (HazelcastInstance) context.getBean( "instance" );
    IMap<String, SomeValue> map = hazelcastInstance.getMap( "values" );
    SomeValue value = map.get( "key" );
    Assert.assertTrue( value.init );

ExecutorService SpringAware Example:

  • Create a Callable Class called SomeTask which contains Spring Bean definitions like ApplicationContext, SomeBean.

    java
    @SpringAware
    public class SomeTask
    implements Callable<Long>, ApplicationContextAware, Serializable {

    private transient ApplicationContext context;
    private transient SomeBean someBean;

    public Long call() throws Exception {
    return someBean.value;
    }

    public void setApplicationContext( ApplicationContext applicationContext )
    throws BeansException {
    context = applicationContext;
    }

    @Autowired
    public void setSomeBean( SomeBean someBean ) {
    this.someBean = someBean;
    }
    }
  • Submit SomeTask to two Hazelcast Members and assert that someBean is autowired.

    java
    HazelcastInstance hazelcastInstance =
    (HazelcastInstance) context.getBean( "instance" );
    SomeBean bean = (SomeBean) context.getBean( "someBean" );

    Future<Long> f = hazelcastInstance.getExecutorService("executorService")
    .submit(new SomeTask());
    Assert.assertEquals(bean.value, f.get().longValue());

    // choose a member
    Member member = hazelcastInstance.getCluster().getMembers().iterator().next();

    Future<Long> f2 = (Future<Long>) hazelcast.getExecutorService("executorService")
    .submitToMember(new SomeTask(), member);
    Assert.assertEquals(bean.value, f2.get().longValue());
note

Spring managed properties/fields are marked as transient.