inner class Builder is in charge of creating Customer instances
mandatory fields – either primitive (e.g. id) or annotated with @NotNull (e.g. lastName) – are part of the builder's constructor
all optional fields setter methods on the builder are provided
newly created Customer instance is validated using the Validator#validate() method
impossible to retrieve an invalid Customer instance
extract the validation routine into a base class:
abstract class AbstractBuilder<T>
T build() throws ConstraintViolationException
protected abstract T buildInternal();
private static Validator validator
Concrete builder classes have to
extend AbstractBuilder
must implement the buildInternal() method:
Builder extends AbstractBuilder<Customer>
@Override
protected Customer buildInternal()
Implementing the Builder Pattern using the Bean Validation API
variation of the Builder design pattern for instantiating objects with multiple optional attributes.
this pattern frees you from providing multiple constructors with the different optional attributes as parameters (hard to maintain and hard to read for clients)
or providing setter methods for the optional attributes
(require objects to be mutable, can leave objects in inconsistent state)
well, dependency injection, but moreover, the soa approach to service design tends to force otherwise intelligent software engineers into doing procedural design
the services just end up being bags of method calls that implement any type of behavior, with the domain objects or entity beans being reduced to mere data structures with little responsibility or behavior beyond persistence. (which, in this anti-pattern, is typically mostly provided by the repository or dao class! ie. domain object crud)
The discussion whether or not to use Spring vs. Java EE for new enterprise Java applications is a no-brainer
Why migrate?
since then fallen a prey to the hungry minds of Venture Capitalists and finally into the hands of a virtualization company called VMware
While the different companies and individuals behind the Spring framework have been doing some work in the JCP their voting behavior on important JSRs is peculiar to say the least
outdated ORM solution like JDBC templates
some developers completely stopped looking at new developments in the Java EE space and might have lost track of the current state of technology
size of the deployment archive
fairly standard Java EE 6 application will take up about 100 kilobytes
comparable Spring application weighs in at a whopping 30 Megabytes!
Lightweight
Firing up the latest JBoss AS 7 Application Server from scratch and deploying a full blown Java EE 6 application into the server takes somewhere between two and five seconds on a standard machine. This is in the same league as a Tomcat / Spring combo
Dependency injection
Java EE 6, the Context and Dependency Injection (CDI) specification was introduced to the Java platform, which has a very powerful contextual DI model adDIng extensibility of injectable enterprise services
Aspect Oriented Programming
“AOP Light” and this is exactly what Java EE Interceptors do
common pitfall when taking AOP too far is that your code might end up all asymmetric and unreadable. This is due to the fact that the aspect and its implementation are not in the same place. Determining what a piece of code will do at runtime at a glance will be really hard
Testing
With Arquillian we can get rid of mocking frameworks and test Java EE components in their natural environment
Tooling
capabilities comparison matrix below to map Spring’s technology to that of Java EE
Capability
Spring
JavaEE
Dependency Injection
Spring Container
CDI
Transactions
AOP / annotations
EJB
Web framework
Spring Web MVC
JSF
AOP
AspectJ (limited to Spring beans)
Interceptors
Messaging
JMS
JMS / CDI
Data Access
JDBC templates / other ORM / JPA
JPA
RESTful Web Services
Spring Web MVC (3.0)
JAX-RS
Integration testing
Spring Test framework
Arquillian *