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
