Download presentation
Presentation is loading. Please wait.
Published byJunior Dawson Modified over 9 years ago
1
#JavaEE @alextheedom Professional Java EE Design Patterns Alex Theedom @alextheedom alextheedom.com
2
@alextheedom #JavaEE Speaker’s Bio Senior Java Developer Author: Professional Java EE Design Patterns E-learning Platforms Cash Machine Software Microservice Based Lottery Systems Spring and Java EE
3
@alextheedom #JavaEE What to expect What’s the story Why am I here? What’s the message? Whistle stop tour Design Patterns: what, when and why Context Dependency Injection
4
@alextheedom #JavaEE What to expect Deep Dive Singleton Pattern Factory Pattern Harnessing the power (something special) Quickie Patterns Façade, Decorator, Observer Q&A
5
@alextheedom #JavaEE What’s the story Java EE changed design pattern implementation Implementation has simplified Implementation has been enhanced Greater creativity How? I will show you today Change is part of Java EE continued development
6
@alextheedom #JavaEE How did we get here? Java Enterprise Edition EJBs, a panacea? 1.4 greatest milestone in Java History But was bloated: XML, JDNI, heavy containers Too complex, promise not delivered Spring was the response Java EE 5 back on the agenda Now EE 7
7
@alextheedom #JavaEE Design patterns: 3W’S What are design patterns? Why do we need them? When to use them?
8
@alextheedom #JavaEE Context Dependency Injection Simplifies programming model Annotations have replaced XML config files Convention over Configuration Resources are injected by type @Inject and disambiguation @Qualifier POJO (JSR 299 managed bean) Otherwise @Producer
9
@alextheedom #JavaEE Singleton Pattern Ubiquitous and controversial but inescapable Instantiated once Not normally destroy during application life cycle
10
@alextheedom #JavaEE Conventional Implementation public class Logger { private static Logger instance; private Logger() { // Creation code here } public static synchronized Logger getInstance() { if(instance == null) { instance = new Logger(); } return instance; } public class Logger { private static Logger instance; private Logger() { // Creation code here } public static synchronized Logger getInstance() { if(instance == null) { instance = new Logger(); } return instance; }
11
@alextheedom #JavaEE Conventional Implementation Only one instance of Logger created Created by first call the getInstance() Thread safe creation Use it like so: Logger logger = Logger.getInstance();
12
@alextheedom #JavaEE Java EE Implementation @Singleton public class Logger { private Logger() { // Creation code here } @Singleton public class Logger { private Logger() { // Creation code here }
13
@alextheedom #JavaEE Java EE Implementation Only one instance of Logger created Created by container (lazily) Knows it’s a singleton because @Singleton Use it like so: @Inject Logger logger; @Inject Logger logger;
14
@alextheedom #JavaEE Java EE Implementation Eager instantiation @Startup Perform startup tasks @PostConstruct
15
@alextheedom #JavaEE Java EE Implementation @Startup @Singleton public class Logger { private Logger() { // Creation code here } @PostConstruct void startUpTask() { // Perform start up tasks } @Startup @Singleton public class Logger { private Logger() { // Creation code here } @PostConstruct void startUpTask() { // Perform start up tasks }
16
@alextheedom #JavaEE Java EE Implementation Specify dependent instantiation @DependsOn("PrimaryBean") @Startup @Singleton public class Logger {... } @DependsOn("PrimaryBean") @Startup @Singleton public class Logger {... }
17
@alextheedom #JavaEE Java EE Implementation @DependsOn("PrimaryBean") @Startup @Singleton public class Logger { private Logger() { // Creation code here } @PostConstruct void startUpTask() { // Perform start up tasks } @DependsOn("PrimaryBean") @Startup @Singleton public class Logger { private Logger() { // Creation code here } @PostConstruct void startUpTask() { // Perform start up tasks }
18
@alextheedom #JavaEE Java EE Implementation Conclusions so far Very different implementation Substantially less boilerplate code Enhancements via specialized annotations
19
@alextheedom #JavaEE Java EE Implementation Further enhancements Fine grain concurrency management Container vs. bean managed @Singleton @ConcurrencyManagement(ConcurrencyManagementType.BEAN) public class Logger {... } @Singleton @ConcurrencyManagement(ConcurrencyManagementType.BEAN) public class Logger {... } What about method access?
20
@alextheedom #JavaEE Java EE Implementation Method access LockType.WRITE and LockType.READ @Lock(LockType.WRITE) public void addMessage(String message) { // Add message to log } @Lock(LockType.READ) public String getMessage() { // Get message } @Lock(LockType.WRITE) public void addMessage(String message) { // Add message to log } @Lock(LockType.READ) public String getMessage() { // Get message }
21
@alextheedom #JavaEE Java EE Implementation Method access timeout ConcurrentAccessTimeoutException Defined by annotation @AccessTimeout Class and method level @AccessTimeout(value = 30, unit=TimeUnit.SECONDS) @Lock(LockType.WRITE) public void addMessage(String message) { // Add message to log } @AccessTimeout(value = 30, unit=TimeUnit.SECONDS) @Lock(LockType.WRITE) public void addMessage(String message) { // Add message to log }
22
@alextheedom #JavaEE Conclusion Substantially different manner of implementation Marked reduction in code (~50%) Implementation improved via specialized annotations Startup behavioural characteristics Fine grain control over concurrency and access timeout
23
@alextheedom #JavaEE Factory Pattern Creational pattern Interface for creating family of objects Clients are decoupled from the creation
24
@alextheedom #JavaEE Conventional Implementation public class DrinksMachineFactory implements AbstractDrinksMachineFactory{ public DrinksMachine createCoffeeMachine() { return new CoffeeMachine(); } public class DrinksMachineFactory implements AbstractDrinksMachineFactory{ public DrinksMachine createCoffeeMachine() { return new CoffeeMachine(); } Use it like so: AbstractDrinksMachineFactory factory = new DrinksMachineFactory(); DrinksMachine coffeeMachine = factory.createCoffeeMachine(); AbstractDrinksMachineFactory factory = new DrinksMachineFactory(); DrinksMachine coffeeMachine = factory.createCoffeeMachine(); Abstract factory
25
@alextheedom #JavaEE Java EE Implementation CDI framework is a factory public class CoffeeMachine implements DrinksMachine { // Implementation code } public class CoffeeMachine implements DrinksMachine { // Implementation code } Use it like so: @Inject DrinksMachine drinksMachine; @Inject DrinksMachine drinksMachine;
26
@alextheedom #JavaEE Java EE Implementation Problem! Multiple concrete implementations public class CoffeeMachine implements DrinksMachine { // Implementation code } public class SoftDrinksMachine implements DrinksMachine { // Implementation code } public class CoffeeMachine implements DrinksMachine { // Implementation code } public class SoftDrinksMachine implements DrinksMachine { // Implementation code } @Inject DrinksMachine drinksMachine; @Inject DrinksMachine drinksMachine; Which DrinksMachine to inject?
27
@alextheedom #JavaEE Java EE Implementation Solution! Qualifiers @Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.FIELD}) public @interface SoftDrink @Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.FIELD}) public @interface SoftDrink @Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.FIELD}) public @interface Coffee @Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.FIELD}) public @interface Coffee
28
@alextheedom #JavaEE Java EE Implementation Annotate respective classes @Coffee public class CoffeeMachine implements DrinksMachine { // Implementation code } @Coffee public class CoffeeMachine implements DrinksMachine { // Implementation code } @SoftDrink public class SoftDrinksMachine implements DrinksMachine { // Implementation code } @SoftDrink public class SoftDrinksMachine implements DrinksMachine { // Implementation code }
29
@alextheedom #JavaEE Java EE Implementation Annotate injection points @Inject @SoftDrink DrinksMachine softDrinksMachine; @Inject @SoftDrink DrinksMachine softDrinksMachine; @Inject @Coffee DrinksMachine coffeeDrinksMachine ; @Inject @Coffee DrinksMachine coffeeDrinksMachine ;
30
@alextheedom #JavaEE Java EE Implementation Conclusions so far No boilerplate code Container does all the hard work Disambiguation via qualifiers Remember Only JSR299 beans are ‘injectable’
31
@alextheedom #JavaEE Java EE Implementation Dive deeper Producer methods Use it like so: @Produces @Library public List getLibrary(){ // Generate a List of books called 'library' return library; } @Produces @Library public List getLibrary(){ // Generate a List of books called 'library' return library; } @Inject @Library List library; @Inject @Library List library;
32
@alextheedom #JavaEE Java EE Implementation Scope Determines when method called Life of object: @RequestScoped -> @ApplicationScoped @SessionScoped @Produces @Library public List getLibrary(){ // Generate a List of books called 'library' return library; } @SessionScoped @Produces @Library public List getLibrary(){ // Generate a List of books called 'library' return library; }
33
@alextheedom #JavaEE Java EE Implementation Parameterized creation Use it like so: public class LoggerFactory{ @Produces public Logger logger(InjectionPoint injectionPoint) { return Logger.getLogger( injectionPoint.getMember().getDeclaringClass().getName()); } } public class LoggerFactory{ @Produces public Logger logger(InjectionPoint injectionPoint) { return Logger.getLogger( injectionPoint.getMember().getDeclaringClass().getName()); } } @Inject private transient Logger logger;
34
@alextheedom #JavaEE Java EE Implementation Conclusions so far Virtually any object can be made injectable Automatic per class configuration
35
@alextheedom #JavaEE Harnessing the power of CDI A variation on the factory pattern Imaginative use of CDI Multiple implementations of the same interface Collect and select pattern Uses @Any, enums, annotation literals and Instance class
36
@alextheedom #JavaEE Harnessing the power of CDI @Any @Inject private Instance messages @Any @Inject private Instance messages
37
@alextheedom #JavaEE Harnessing the power of CDI Distinguish between message types using qualifiers @Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) public @interface Message { Type value(); enum Type{ SHORT, LONG } } @Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) public @interface Message { Type value(); enum Type{ SHORT, LONG } }
38
@alextheedom #JavaEE Harnessing the power of CDI Annotate our classes @Message(Message.Type.SHORT) public class ShortMessage implements MessageType{ // Short message implementation code } @Message(Message.Type.SHORT) public class ShortMessage implements MessageType{ // Short message implementation code } @Message(Message.Type.LONG) public class LongMessage implements MessageType{ // Long message implementation code } @Message(Message.Type.LONG) public class LongMessage implements MessageType{ // Long message implementation code }
39
@alextheedom #JavaEE Harnessing the power of CDI Create an annotation literal for messages public class MessageLiteral extends AnnotationLiteral implements Message { private Type type; public MessageLiteral(Type type) { this.type = type; } public Type value() { return type; } public class MessageLiteral extends AnnotationLiteral implements Message { private Type type; public MessageLiteral(Type type) { this.type = type; } public Type value() { return type; }
40
@alextheedom #JavaEE Harnessing the power of CDI Putting the puzzle together @Inject @Any private Instance messages; public MessageType getMessage(Message.Type type) { MessageLiteral literal = new MessageLiteral(type); Instance typeMessages = messages.select(literal); return typeMessages.get(); } @Inject @Any private Instance messages; public MessageType getMessage(Message.Type type) { MessageLiteral literal = new MessageLiteral(type); Instance typeMessages = messages.select(literal); return typeMessages.get(); }
41
@alextheedom #JavaEE Harnessing the power of CDI Use it like so: @Inject private MessageFactory mf; public void doMessage(){ MessageType m = mf.getMessage(Message.Type.SHORT); } @Inject private MessageFactory mf; public void doMessage(){ MessageType m = mf.getMessage(Message.Type.SHORT); }
42
@alextheedom #JavaEE Conclusion CDI removes need for factory pattern Container does all the hard work Substantially less boilerplate code Disambiguation via qualifiers Increased creativity Collect and select
43
@alextheedom #JavaEE Other Patterns Facade Decorator Observer
44
@alextheedom #JavaEE Fa ç ade Pattern Encapsulates complicated logic @Stateless, @Stateful @Stateless public class BankServiceFacade{ @Inject private AccountService accountService; } @Stateless public class BankServiceFacade{ @Inject private AccountService accountService; } @Stateless public class AccountService{} @Stateless public class AccountService{}
45
@alextheedom #JavaEE Decorator Pattern Dynamically adds logic to an object
46
@alextheedom #JavaEE Decorator Pattern @Decorator @Priority(Interceptor.Priority.APPLICATION) public class PriceDiscountDecorator implements Product { @Any @Inject @Delegate private Product product; public String generateLabel() { product.setPrice(product.getPrice() * 0.5); return product.generateLabel(); } } @Decorator @Priority(Interceptor.Priority.APPLICATION) public class PriceDiscountDecorator implements Product { @Any @Inject @Delegate private Product product; public String generateLabel() { product.setPrice(product.getPrice() * 0.5); return product.generateLabel(); } }
47
@alextheedom #JavaEE Observer Pattern Notifies dependents of state change public void trace(@Observes String message){ // Response to String event } public void trace(@Observes String message){ // Response to String event }
48
@alextheedom #JavaEE Final Conclusion Efficiency savings Greater control over behaviour New features enhance implementation Opens doors to new pattern design
49
#JavaEE @alextheedom 40% discount with promo code VBK43 when ordering through wiley.com valid until 1st September
50
@YourTwitterHandle#DVXFR14{session hashtag} @alextheedom #JavaEE Q & A
51
#JavaEE @alextheedom Professional Java EE Design Patterns Alex Theedom @alextheedom alextheedom.com Thank You
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.