Why I will use Java EE instead of Spring in new Enterprise Java Projects in 2012
I know: Several articles, blogs and forum discussions are available regarding this topic. Why is there a need for one more? Because many blogs talk about older versions of Java EE or because they are not neutral (I hope to be neutral). And because many people still think thank EJBs are heavy! And because the time has changed: It is Java EE 6 time now, J2EE is dead. Finally! Finally, because not only JEE 6 is available, but also several application servers (not just Glassfish as reference implementation). I do not want to start a flame war (too many exist already), I just want to describe my personal opinion of the JEE vs. Spring „fight“…
Therefore, I think it is very important to start with a short overview and history of both alternatives. Afterwards, I will list the differences of both and explain why these differences lead me to JEE instead of Spring for most new Java projects. I am explicitly talking about new applications. If you have to extend an existing application, continue using the existing framework!
One more disclaimer: I am talking about mission-critical Enterprise Java applications. I am not talking about a little internal application or other uncritical stuff. I also would prefer using a combination of Scala, Groovy and Clojure persisting to a NoSQL database while being deployed at a PaaS cloud service such as JBoss OpenShift or VMware CloudFoundry…
General Information about JEE and Spring
First, I want to summarize some general information about JEE and Spring:
- In the end, both alternatives consist of several libraries which can be used by developers to create enterprise applications.
- Both can be used in most use cases, they have very similar functionality (business logic, transactions, web-frameworks, whatever…) – they only differ in realization (e.g. declarative transactions in Spring vs. conventions in JEE).
- You also can use only one or some of the available libraries. You can even combine JEE and Spring stuff.
- Usually, the crucial question is: „Should I use JEE (i.e. especially EJB, JPA, CDI, etc.) or the Spring core framework (i.e. especially Spring Application Context, Spring beans, etc.) for realizing my new application? Mostly, you can choose both, it does not matter from the point of view of the end user. But you should not merge both, this only creates higher complexity.
- There always was a debate about which alternative to choose. It is very difficult to discuss this question in a neutral way. That’s why almost all discussions end up in praising one framework and bashing the other one (I hope to be neutral in this blog post).
History: J2EE was horrible, so Spring helped!
J2EE was horrible. So much XML configuration, so many interfaces, and so lame application servers. This is why the Spring framework was created. It solved many problems of J2EE. It was lightweight, easy to use, and applications could be deployed in a web container (such as Tomcat) instead of a heavy J2EE application server. Deployment took seconds instead of 15 minutes. Unfortunately, JRebel did not exist at that time. The Spring framework is no standard as J2EE, nevertheless it became very widespread and an large community arose.
Today: J2EE is dead. JEE „stole“ the lightweight Spring ideas!
Everything started with a little shortcut change. J2EE was dead. The new shortcut was JEE. JEE 5 was born in 2006. It „stole“ many good, lightweight ideas such as „convention over configuration“ or „dependency injection“ from Spring and other frameworks. Yes, JEE application servers still were heavy, and testing was almost impossible. Nevertheless, developing JEE applications was fun with JEE 5. You did not have to write 20 interfaces when creating an EJB. Wow, amazing!
Then, in 2009, JEE 6 was released. Development is so easy. Finally! For example, you have to add only one annotation and your EJB is ready! Of course, the developers of the Spring framework did not sleep. Much new stuff was added. Today, you can create a Spring application without any one XML file as I have read in a „No Fluff Just Stuff“ article some weeks ago. Besides, several really cool frameworks were added to the Spring stack, e.g. Spring Integration, Spring Batch or Spring Roo.
Today (November, 2011), both JEE and Spring are very widespread and have a large community. Much information is available for both, e.g. books, blogs, tutorials, etc.
So, after I have described the evolution of JEE and Spring, why will I use JEE in most new Java projects?
Pros and Cons of JEE and Spring
A decision must be made. Which alternative to use in new projects? Let’s look at the pros and cons of both. I will add a „BUT“ to the Spring advantages – these „BUTs“ are the reason why I prefer JEE to Spring.
Advantages of JEE
- JEE is a set of standard specifications, thus it is vendor-independent. Usually, several implementations exist of a specification.
- Sustainability: Well, this is the advantage of a standard which is supported by several big players.
- Yes, believe it or not, testing is possible! Lightweight application servers and frameworks such as Arquillian arrived in the JEE world!
- Convention over Configuration is everywhere instead of explicit (I know that some people will disagree that this is an advantage).
Advantages of Spring
- You do not need a heavy JEE application server, you can deploy your application in a web container such as Tomcat.
BUT: JEE application servers are not as heavy as they were some years ago. Besides, the JEE web profile can be used, too. You do not have to use a Tomcat or Jetty to be lightweight!
- Spring offers features which are not available as JEE standards, such as Spring Batch.
BUT: You can add such a library to a JEE project without problems. You can also add other Spring libraries such as JDBCTemplate or JMSTemplate (which help reducing some boilerplate code) if you want.
- Spring offers much more flexiblity and power, e.g. aspect-oriented programming is more powerful than JEE interceptors.
BUT: In most projects you do not need this flexibility or power. If you do need it, then use Spring, not JEE – of course!
- Faster Releases (because it is no standard and only one vendor). The reaction to market requirements is much faster. Some current examples: cloud, mobile, social computing.
BUT: All enterprise projects – of many different clients – which I have seen, are not that flexible. Enterprise applications do not change every month or year. If there is a project, where you can change your version very easily, Spring might be better than JEE under some circumstances. But in most enterprise projects, you cannot simply upgrade from Spring 2.5 to Spring 3.x or from JEE 5 to JEE 6. I wish this would be possible, but low flexibility and politics rule in large companies with thousands of employees.
Conclusion: I will use JEE in most new Enterprise Java Projects
Due to the reasons I explained against Spring in the „BUT“ parts, I will choose JEE in most new Enterprise Java projects. Nevertheless, I will sometimes use a Spring libraries, too (such as Spring Batch). Sometimes, I will even have to use Spring (if I need its flexibility or power), but only then I will choose it. Of course, for existing projects, I will continue using the framework that is used already. I would probably not migrate a Spring 2.5 application to JEE, but I would migrate it to Spring 3.x instead!
So, I have described my reasons why I will use JEE in most new Enterprise Java projects. If I have missed something, or if you have got another opinion (probably many guys have), you can bash me in the comments. I appreciate all „non-flame-war“ discussions…
Reference: Why I will use Java EE instead of Spring in new Enterprise Java Projects in 2012 from our JCG partner Kai Wahner at the Blog about Java EE / SOA / Cloud Computing blog.
When you discussed Advantages, are you talking about advantages of each over the other? I can’t understand why you list testability and Convention over Convention be an advantage of JEE. These has been Spring features for ages already. The way I see it, your goal of being neutral wasn’t successful by the way.
I recommend do not use acronym JEE according to: http://www.java.com/en/about/javanaming.jsp ;)
This is not a neutral comparison at all since you list advantages of one above the other (which BTW are wrong like File G said). A neutral comparison would have list some criterias and evaluate JEE and Spring on this criteria. Standardization : JEE is a standard not Spring (this is not important to me but maybe it is to you) Common prinicples : The 2 frameworks have the same base concepts (DI, Annotations, …) and allow to integrate all the boilerplate frameworks (JMS, JPA, …) Advanced principles : JEE relies on Interceptor, Spring is all-in for AOP Extensibility :… Read more »
I will suggest to put in performance comparison to make this article neutral. Nothing beat the number and math speak for itself.
IMHO I really don’t see any reason to use JEE at all in any project (unless you are an oracle employee…). The reason is simple, everything you can do in JEE you can also do in Spring, and Spring allows to do much more on top of it…, so why bother?
I completely agree with you.This is going to be more political decision rather reading this article Spring vs JEE.I still prefer to go with Spring as mention quite easy to use and lot of features and one of the main feature like is testing which JEE never ever covered it thoroughly.
IMHO I really don’t see any reason to use Spring at all in any project (unless you are a VMware employee…). The reason is simple, everything you can do in Spring you can also do in JEE, and JEE allows you to do much more on top of it…, so why bother?
Nice try, but simply reverting the message doesn’t make it true. There’s no support for non-JPA data access in JavaEE, there’s no support for integration or batch type applications. So if you ever face a requirement not approachable with what the standard covers you’re screwed. There’s tons of undocumented implications when using the JavaEE annotations (@Singleton:twitter effectively serializing *all* method calls to the object), a crippled DI model (constructor injection anyone?), yadda yadda yadda… But even if we stick with your statement and agree on JavaEE being on par with Spring: where are the features JavaEE provides, which Spring does not?… Read more »
I’m in the Spring camp myself but many companies purchase expensive application servers, databases, hardware for the comfort of dedicated consulting/vendor support services and (being slightly facetious) to be able to sue someone if there’s a resulting problem in the technology. In this situation with the app server having been decided on this basis (as well as meeting performance, availability requirements) and with Tomcat not in the running, the resulting web app software architecture is founded on JEE not Spring despite IMO Spring being the more powerful, agile and flexible of the two frameworks.
“Spring being the more powerful, agile and flexible of the two frameworks.”
I absolutely agree!
The question is if this is an advantage all the time. In most of our projects, (unfortunately) this is a disadvantage because the organization is not ready for too much power, flexibility and agile development. I do not say that I like this, but that is reality in many huge (non-IT) enterprises.
Talking about features, Spring is definitive winner in terms of testability, deployment on different app servers, feature list etc. But I’m not confortable with the fact that the whole DI is on application level. For example, if I have to use EJB, I have to initiate a separate Spring container per EJB, and that’s not effective at all vand it makes my app very memory-consuming (yes, I know, I can make a shared Spring container for all the beans, but my suspicion is that it uses thread-local storage and that is IMHO evil in JEE world). JPA per se is not… Read more »
“To me, Spring is more developer-centric, more testable and more feature rich. But it comes with a cost of a large application footprint and too many features involved. I doubt that most of use everything from its bag of tricks…” This is exactly my experience. And this is why I prefer Java EE in most use cases. As mentioned in the article: “Convention over Configuration is everywhere [in Java EE 6] instead of explicit (I know that some people will disagree that this is an advantage).” So, @olivergierke:disqus I absolute agree to most of your comments! I cannot tell you… Read more »
“I need a stable and easy to use programming model, which can be used also by newcomers easily.” Would you mind outlining how Spring fails at that? “In the end, I want to create business applications easily, and IMO Java EE 6 (not 4 and not 5) beats Spring.” That’s highly vague and depends on what your business application looks like. So I’d argue this is a wrong statement in more cases than it isn’t (because neither you nor me know what a business application looks like for others). So I’d argue that for such bold statements the more flexible… Read more »
I agree with leon the math speak should appear not the feelings one :)
The way I see it, JEE only has only one advantage over Spring and it’s a pure theoretical one; it’s a standard.
Some companies care, others do not.
For the rest, I agree with chris b. His comparison is more neutral than yours. sorry
I do agree when you say that JEE6 has come a long way and that nowadays, it’s actually usable
Nice article. I sometimes hear people saying that there are no more projects starting with JEE anymore. I think this is a common misconception caused by J2EE (1.4), like you mentioned in the beginning.
I’m going to use Spring in my projects for a long time because it encourages you to good programming (dependency injection, use of interfaces, separate of concerns, unit testing…) and it allows you to locally test your business logic. Besides, the new feature of profiling allows you to develope in one environment (or two if you want to) and easyly deploy to any application server. However, is still has a big con: if there is any library collision, you will have to work a lot to solve the related issues. And that’s true, some new technologies are not functional enough… Read more »
It’s great that you add the “BUT” on the Spring side but forgot to do on the JavaEE side. Let me help you out a little bit on that one: Portability (because it’s a standard) – it’s 2012 and I am puzzled this myth is still around. Have you ever tried to port a non-trivial application from one application server to another? The different JPA providers alone make this close to impossible. That’s why I think coding you app against JPA is fine but requires bundling the persistence provider with it to be portable (in case that actually matters to… Read more »
Have you considered an alternative like the Play Framework?
I would think about going pure JEE only once out of container testing is as seamless as it is with Spring.
Man. Are you still on this band wagon. I was once a JUG leader, been programming in Java for the some 15 years, and for me, it is clearly a dead horse. JEE and Spring are both an hindrance to good development, they are full of anti-patterns. And the first anti-pattern is calling something “Enterprise App”. More and more “features”, and hordes of programmers that are no much than mere push buttons. And the result? The result you can in any company, slow, dumb applications that are hard to use, that require full time maintenance. You don’t need more frameworks, you… Read more »
For those who are interested, I wrote a +/- similar article a few months ago on JCG, with a concrete comparison of both technologies:
With Spring you can just get support of VMware’s tc server.
BUT with JEE 6 you have more options to choose, Glassfish, jBoss, Resing, Weblogic and many other application servers.
Both doesn’t seem to have an advantage over each other aside from the fact that Java EE 6 is a standard. The only problem I see with Spring is that it is redundant.
Spring is the new Struts and like Struts, it is being deployed to many production servers already and its seems hard to migrate. My point is, its already a legacy framework, it maybe deployed to lots production servers already but so as Struts and Cobol.
For new projects, just use java ee 6 and you will be giving yourself a favor.
It is very simple: my customers have only tomcat, want to use only tomcat, period. J2ee force you to you jboss or (my God) glassfish, or some other thing that is not Tomcat. Spring not.
When we talk about JEE , immediately we tend to think about those days we had faced when J2EE/EJB combination was there.Developing a full blown J2EE compliant application with EJB was very tedious process. No doubt about that.Moreover, selecting an EJB component (to be or not to be) was little bit scary as well.In fact there was a lot of learning curve for both experienced and entry professionals alike.So to save , Spring came. It was because of its easiness and less learning curve, there were many existing applications converted to Spring.Spring introduced the concept of attribute driven programming.Later on… Read more »
– Spring’s Exception handling is excellent and 99 times out of 100 I will get a clear message when something goes wrong. The same cannot be said of other vendors JEE implementations. – I am not 100% convinced that each JEE6 app server has 100% same behavior with JEE6 e.g. CDI. There are also significant amount of bugs being found in App Server’s JEE implementations e.g. look at fix list for WAS 8 – Spring has solved many of the problems the real world throws at it, where JEE hasn’t. Yes this means it’s bigger, but something probably already exists… Read more »
I’m currently new to all this, seems like you all here are vast and professional in this aspect, I really don’t know which to learn! Between spring and javaEE6, a lot of controversies basically every where one the internet. People keeping saying spring, some other set of people say javaEE! Whichever, all I need is an advice on a path to follow or the next step! I’m currently on jsp and jsf, buh I intend advancing my knowledge! And also, I have doubts most times due to the expensive nature of hosting a java website, it kills my morale most… Read more »