diff --git a/akka-spring/src/main/scala/ActiveObjectFactoryBean.scala b/akka-spring/src/main/scala/ActiveObjectFactoryBean.scala index bc4286cec1..5b7a62a0b5 100644 --- a/akka-spring/src/main/scala/ActiveObjectFactoryBean.scala +++ b/akka-spring/src/main/scala/ActiveObjectFactoryBean.scala @@ -48,6 +48,20 @@ class ActiveObjectFactoryBean extends AbstractFactoryBean[AnyRef] with Logging w @BeanProperty var scope:String = VAL_SCOPE_SINGLETON @BeanProperty var property:PropertyEntries = _ @BeanProperty var applicationContext:ApplicationContext = _ + + // Holds info about if deps has been set or not. Depends on + // if interface is specified or not. We must set deps on + // target instance if interface is specified + var hasSetDependecies = false + + + override def isSingleton:Boolean = { + if(scope.equals(VAL_SCOPE_SINGLETON)) { + true + } else { + false + } + } /* * @see org.springframework.beans.factory.FactoryBean#getObjectType() @@ -63,11 +77,6 @@ class ActiveObjectFactoryBean extends AbstractFactoryBean[AnyRef] with Logging w * @see org.springframework.beans.factory.config.AbstractFactoryBean#createInstance() */ def createInstance: AnyRef = { - if(scope.equals(VAL_SCOPE_SINGLETON)) { - setSingleton(true) - } else { - setSingleton(false) - } var argumentList = "" if (isRemote) argumentList += "r" if (hasInterface) argumentList += "i" @@ -86,7 +95,11 @@ class ActiveObjectFactoryBean extends AbstractFactoryBean[AnyRef] with Logging w super.destroy } - private def setProperties(ref:AnyRef) : AnyRef = { + private def setProperties(ref:AnyRef) : AnyRef = { + if(hasSetDependecies) { + return ref + } + log.debug("Processing properties and dependencies for target class %s",target) val beanWrapper = new BeanWrapperImpl(ref); if(ref.isInstanceOf[ApplicationContextAware]) { @@ -109,6 +122,8 @@ class ActiveObjectFactoryBean extends AbstractFactoryBean[AnyRef] with Logging w throw new AkkaBeansException("Either property@ref or property@value must be set on property element") } } + //un-set so next bean can be managed + hasSetDependecies = false ref } @@ -139,10 +154,12 @@ class ActiveObjectFactoryBean extends AbstractFactoryBean[AnyRef] with Logging w if (transactional) config.makeTransactionRequired config } - - private[akka] def aNewInstance[T <: AnyRef](clazz: Class[T]) : T = { - clazz.newInstance().asInstanceOf[T] - } + def aNewInstance[T <: AnyRef](clazz: Class[T]) : T = { + var ref = clazz.newInstance().asInstanceOf[T] + setProperties(ref) + hasSetDependecies = true + ref +} private[akka] def isRemote = (host != null) && (!host.isEmpty) diff --git a/akka-spring/src/test/java/se/scalablesolutions/akka/spring/Pojo.java b/akka-spring/src/test/java/se/scalablesolutions/akka/spring/Pojo.java new file mode 100644 index 0000000000..42e1e393e7 --- /dev/null +++ b/akka-spring/src/test/java/se/scalablesolutions/akka/spring/Pojo.java @@ -0,0 +1,27 @@ +package se.scalablesolutions.akka.spring; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +public class Pojo implements PojoInf,ApplicationContextAware { + + private String string; + + private boolean gotApplicationContext = false; + + public boolean gotApplicationContext() { + return gotApplicationContext; + } + public void setApplicationContext(ApplicationContext context) { + gotApplicationContext = true; + } + + public void setString(String s) { + string = s; + } + + public String getString() { + return string; + } + + } diff --git a/akka-spring/src/test/java/se/scalablesolutions/akka/spring/PojoInf.java b/akka-spring/src/test/java/se/scalablesolutions/akka/spring/PojoInf.java new file mode 100644 index 0000000000..db31841f17 --- /dev/null +++ b/akka-spring/src/test/java/se/scalablesolutions/akka/spring/PojoInf.java @@ -0,0 +1,8 @@ +package se.scalablesolutions.akka.spring; + +public interface PojoInf { + + public String getString(); + public boolean gotApplicationContext(); + + } diff --git a/akka-spring/src/test/java/se/scalablesolutions/akka/spring/SampleBean.java b/akka-spring/src/test/java/se/scalablesolutions/akka/spring/SampleBean.java index ce8cf1fd70..e8adaa38e7 100644 --- a/akka-spring/src/test/java/se/scalablesolutions/akka/spring/SampleBean.java +++ b/akka-spring/src/test/java/se/scalablesolutions/akka/spring/SampleBean.java @@ -1,23 +1,13 @@ package se.scalablesolutions.akka.spring; -import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ApplicationContext; - import se.scalablesolutions.akka.actor.annotation.shutdown; -public class SampleBean implements ApplicationContextAware { +public class SampleBean { public boolean down; - public boolean gotApplicationContext; - public SampleBean() { down = false; - gotApplicationContext = false; - } - - public void setApplicationContext(ApplicationContext context) { - gotApplicationContext = true; } public String foo(String s) { diff --git a/akka-spring/src/test/resources/appContext.xml b/akka-spring/src/test/resources/appContext.xml index b299b3e363..e9a651b735 100644 --- a/akka-spring/src/test/resources/appContext.xml +++ b/akka-spring/src/test/resources/appContext.xml @@ -22,4 +22,12 @@ - + + + + + diff --git a/akka-spring/src/test/scala/ActiveObjectFactoryBeanTest.scala b/akka-spring/src/test/scala/ActiveObjectFactoryBeanTest.scala index e0db33e8f1..5055fb6184 100644 --- a/akka-spring/src/test/scala/ActiveObjectFactoryBeanTest.scala +++ b/akka-spring/src/test/scala/ActiveObjectFactoryBeanTest.scala @@ -65,14 +65,15 @@ class ActiveObjectFactoryBeanTest extends Spec with ShouldMatchers { assert(target.getSource === entry.value) } - it("should create an application context and inject a string dependency") { + it("should create an application context and verify dependency injection") { var ctx = new ClassPathXmlApplicationContext("appContext.xml"); val target:ResourceEditor = ctx.getBean("bean").asInstanceOf[ResourceEditor] assert(target.getSource === "someString") - - val sampleBean = ctx.getBean("sample").asInstanceOf[SampleBean]; - Thread.sleep(300) - assert(sampleBean.gotApplicationContext) + + val pojoInf = ctx.getBean("pojoInf").asInstanceOf[PojoInf]; + println("pojoInf = " + pojoInf.getString) + assert(pojoInf.getString == "akka rocks") + assert(pojoInf.gotApplicationContext) } it("should stop the created active object when scope is singleton and the context is closed") {