Polyglot Programming in Spring
0 CommentsPolyglot Programming
Is the practice of programming in multiple programming languages. According to Wikipedia it is –
In computing, a polyglot is a computer program or script written in a valid form of multiple programming languages, which performs the same operations or output independent of the programming language used to compile or interpret it.
In writing the code for a recent blog post on Spring Integration, I thought it would be fun to write some of the code in Groovy. I’ve been writing in Groovy for about 7 years. I’m as fluent in Groovy as I am in Java, so its no problem for me to bounce between the two languages. If you been following my blog, you’ve probably seen me use Spock for my unit tests. Spock is a great tool. A Groovy testing framework for testing Java code.
Many Java developers who are not familiar with Groovy, view it as just a scripting language. Groovy is not just a scripting language. It is an Object Oriented Programming language, just like Java is. Some may argue that Groovy is a pure object oriented language and Java is not because of Java’s support of Primitive Types. Because unlike Java, Groovy does autoboxing of primitive types.
Its also important to understand, Groovy was never intended to be a replacement of Java. It’s written to supplement Java. As such, its very easy to mix and match code. Ultimately both Groovy and Java compile down to JVM byte code, and the compiled code is compatible.
Polyglot Programming in the Spring Framework
The Spring Framework is no stranger to Polyglot programming. The Grails community really spearheaded things with the Groovy language. In version 4 of the Spring Framework, we’re seeing a lot more support of polyglot programming around the Groovy language. But in the various Spring Framework projects, we’re seeing more polyglot programming support around the Scala programming language. With Rod Johnson involved with Typesafe, I think it’s a safe bet we will see additional support of Scala in Spring in the future.
Groovy Spring Beans
It is possible to write Spring Beans in Groovy. Your application will compile and run just fine. Whenever programming for Dependency Injection, I recommend developing your code to an interface.
AddressService
When doing polyglot programming, I prefer to write the interface in Java. Now any class, written in Java or Groovy can implement the interface. You probably could write the interface in Groovy and use it in Java just fine, but there are some pitfalls of using Groovy from Java you need to be aware of. For example, if you use def
as a type, Java treats it as a Object data type. Sometimes the strong typing of Java is not a bad thing. This also seems more appropriate to me when defining the interface to use.
package guru.springframework.si.services; import guru.springframework.si.model.commands.PlaceOrderCommand; import org.springframework.validation.Errors; public interface AddressService { Errors verifyAddress(PlaceOrderCommand command); }
AddressServiceImpl.groovy
You can see my Groovy class simply implements the AddressService
 interface. I mark the class with the @Service("addressService")
 annotation as I would a normal Java Spring Bean.
package guru.springframework.si.services import guru.springframework.si.model.commands.PlaceOrderCommand import org.springframework.stereotype.Service import org.springframework.validation.BeanPropertyBindingResult import org.springframework.validation.Errors @Service("addressService") class AddressServiceImpl implements AddressService{ @Override Errors verifyAddress(PlaceOrderCommand command) { def i = 0 def msg = Thread.currentThread().id + ' : In Address Service' while (i < 1000) { println msg i = i + 100 msg = msg + '. ' } new BeanPropertyBindingResult(command, 'Place Order Command') } }
Using a link below, you can checkout the full project. You will see the Groovy class compiles with the Java code and runs in the Spring context like any other Spring Bean.
Conclusion
In enterprise Java / Spring shops, you probably will not see much Polyglot programming. But, the Grails team uses Groovy for Spring Beans all the time. I’ve demonstrated its easy to use Groovy Spring beans outside of the Grails environment. This is not a technology issue to overcome. Culturally, I suspect it may be some time before you see polyglot programming in large scale enterprise applications. But doing polyglot programming like this is something fun to do in blog posts!
Get The Code
I’ve committed the source code for this post to GitHub. It is a Maven project which you can download and build. If you wish to learn more about the Spring Framework, I have a free introduction to the Spring tutorial. You can sign up for this tutorial in the section below.