Decorating classes at injection time with Java EE 6
Let’s say you have a ticket service that lets you order tickets for a certain event. The TicketService handles the registration etc, but we want to add catering. We don’t see this as part of the ticket ordering logic, so we created a decorator. The decorator will call the TicketService and add catering for the number of tickets.
The interface:
public interface TicketService { Ticket orderTicket(String name); }
The implementation of the interface, creates a ticket and persists it.
@Stateless public class TicketServiceImpl implements TicketService { @PersistenceContext private EntityManager entityManager; @TransactionAttribute @Override public Ticket orderTicket(String name) { Ticket ticket = new Ticket(name); entityManager.persist(ticket); return ticket; } }
We create a new implementation of the same interface.
@Decorator public class TicketServiceDecorator implements TicketService { @Inject @Delegate private TicketService ticketService; @Inject private CateringService cateringService; @Override public Ticket orderTicket(String name) { Ticket ticket = ticketService.orderTicket(name); cateringService.orderCatering(ticket); return ticket; } }
We adjust our beans.xml to mark the TicketServiceDecorator as ‘Decorator’.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> <decorators> <class>be.styledideas.blog.decorator.TicketServiceDecorator</class> </decorators> </beans>
We can combine a number of decorators and choose the order we want them executed.
<decorators> <class>be.styledideas.blog.decorator.HighDecorator</class> <class>be.styledideas.blog.decorator.LowDecorator</class> </decorators>
Related Article:
Reference: Java EE6 Decorators, decorating classes at injection time from our JCG partner Jelle Victoor at Styled Ideas Blog