Web Beans, the RI of JSR-299

          Pete Muir
 JBoss, a division of Red Hat
Road Map



Background
Concepts
Status




               2
Java EE 6

• The EE 6 web profile removes most of the “cruft” that
  has developed over the years
  -   mainly the totally...
Goals

• JSR-299 defines a unifying dependency injection
  and contextual lifecycle model for Java EE 6
  -   a completely...
What can be injected?


• Pre-defined by the specification:
  -   (Almost) any Java class
  -   EJB session beans
  -   Ob...
Loose coupling

• Events, interceptors and decorators enhance the
  loose-coupling that is inherent in this model:
  -   e...
Going beyond the spec

• Web Beans provides extra integrations
  -   Tomcat/Jetty support
  -   Wicket support
  -   ???
•...
Seam 3?

• Use the JSR-299 core
• Provide a development environment
  -   JBoss Tools
  -   Seam-gen (command line tool)
•...
Road Map



Background
Concepts
Status




               9
Essential ingrediants

•   API types
•   Binding annotations
•   Scope
•   Deployment type
•   A name (optional)
•   Inter...
Simple Example



public class Hello {                    Any Java Bean can use
   public String hello(String name) {   th...
Simple Example



public class Printer {                  @Current is the default
                                        ...
Constructor injection



public class Printer {
                                          Mark the constructor to be calle...
Web Bean Names


                                          By default not available through EL.
@Named(quot;helloquot;)
pu...
JSF Page




<h:commandButton value=“Say Hello”
                 action=“#{hello.hello}”/>


                             ...
Binding Types

• A binding type is an annotation that lets a client
  choose between multiple implementations of an
  API ...
Define a binding type



public
                                       Creating a binding type is
@BindingType
           ...
Using a binding type


                                 We also specify the @Casual binding
@Casual                       ...
Using a binding type

                                       Here we inject the Hello
                                    ...
Deployment Types

• A deployment type is an annotation that
  identifies a deployment scenario
  -   Deployment types may ...
Create a deployment type



public
@DeploymentType
@Retention(RUNTIME)
@Target({TYPE, METHOD})
@interface Espanol {}




 ...
Using a deployment type



                                         Same API, different
@Espanol
                         ...
Enabling deployment types



<Beans>
  <Deploy>
    <Standard />
    <Production>
    <i8ln:Espanol>
                     ...
Scopes and Contexts

• Extensible context model
  -   A scope type is an annotation, can write your own
      context impl...
Scopes



@SessionScoped                         Session scoped
public class Login {
   private User user;
   public void ...
Scopes



public class Printer {                  No coupling between scope
                                        and us...
Conversation context


@ConversationScoped                    Conversation has the same
                                  ...
Producer methods

• Producer methods allow control over the
  production of a bean where:
  -   the objects to be injected...
Producer methods



@SessionScoped
public class Login {
   private User user;
   public void login() {
      user = ...;
 ...
Producer methods



                                             Producer method can a
@SessionScoped                     ...
Producer methods



public class Printer {
   @Current Hello hello;
   @Current User user;                 Much better, no...
Producer Fields




• Simpler alternative to Producer methods
 @SessionScoped                          Similar to outjecti...
Disposal Method



    • Clean up after a producer method
public class UserDatabaseEntityManager {

     @Produces @UserDa...
Java EE Resources

•    To inject Java EE resources, persistence contexts, web
    service references, remote EJB referenc...
Events

Event producers raise events that are then delivered
to event observers by the Web Bean manager.
-   not only are ...
Event producer

                          Inject an instance of Event. Additional binding
                          types ...
Event consumer


                               Observer methods, take the API
public class Printer {         type and add...
Specialization

• Allows a bean with a higher precedence
  deployment to completely replace a bean with a
  lower preceden...
Road Map



Background
Concepts
Status




               39
JSR-299

• Public Review Draft 2 published
• Currently working on EE6 integration
• Web Beans “Book” (a less formal guide ...
Web Beans

• The Reference implementation
  -   Feature complete preview of second public review
      draft. Download it,...
Q&A




http://in.relation.to/Bloggers/Pete

http://www.seamframework.org/WebBeans

http://jcp.org/en/jsr/detail?id=299


...
Upcoming SlideShare
Loading in...5
×

Introduction To Web Beans

6,814

Published on

An overview of JSR299 by the Pete Muir, the implementation lead for the RI.

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
6,814
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
90
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Introduction To Web Beans

  1. 1. Web Beans, the RI of JSR-299 Pete Muir JBoss, a division of Red Hat
  2. 2. Road Map Background Concepts Status 2
  3. 3. Java EE 6 • The EE 6 web profile removes most of the “cruft” that has developed over the years - mainly the totally useless stuff like web services, EJB 2 entity beans, etc - some useful stuff like JMS is also missing, but vendors can include it if they like • EJB 3.1 - a whole bunch of cool new functionality! • JPA 2.0 - typesafe criteria query API, many more O/R mapping options • JSF 2.0 - don’t need to say much more! • Bean Validation 1.0 - annotation-based validation API • Servlet 3.0 - async support, better support for frameworks • Standard global JNDI names • Contexts and Dependency Injection for Java EE 3
  4. 4. Goals • JSR-299 defines a unifying dependency injection and contextual lifecycle model for Java EE 6 - a completely new, richer dependency management model - designed for use with stateful objects - integrates the “web” and “transactional” tiers - makes it much easier to build applications using JSF and EJB together - includes a complete SPI allowing third-party frameworks to integrate cleanly in the EE 6 environment 4
  5. 5. What can be injected? • Pre-defined by the specification: - (Almost) any Java class - EJB session beans - Objects returned by producer methods - Java EE resources (Datasources, JMS topics/ queues, etc) - Persistence contexts (JPA EntityManager) - Web service references - Remote EJBs references • Plus anything else you can think of! - An SPI allows third-party frameworks to introduce new kinds of things 5
  6. 6. Loose coupling • Events, interceptors and decorators enhance the loose-coupling that is inherent in this model: - event notifications decouple event producers from event consumers - interceptors decouple technical concerns from business logic - decorators allow business concerns to be compartmentalized 6
  7. 7. Going beyond the spec • Web Beans provides extra integrations - Tomcat/Jetty support - Wicket support - ??? • and features which can be used in any JSR-299 environment - jBPM integration - log injection (choose between log4j and jlr, parameter interpolation - Seam2 bridge - Spring bridge 7
  8. 8. Seam 3? • Use the JSR-299 core • Provide a development environment - JBoss Tools - Seam-gen (command line tool) • include a set of modules for any container which includes JSR-299 - Seam Security - Reporting (Excel/PDF) - Mail - etc. 8
  9. 9. Road Map Background Concepts Status 9
  10. 10. Essential ingrediants • API types • Binding annotations • Scope • Deployment type • A name (optional) • Interceptor bindings • The implementation 10
  11. 11. Simple Example public class Hello { Any Java Bean can use public String hello(String name) { these services return quot;helloquot; + name; } } So can EJBs @Stateless public class Hello { public String hello(String name) { return quot;helloquot; + name; } 11
  12. 12. Simple Example public class Printer { @Current is the default (built in) binding type @Current Hello hello; public void hello() { System.out.println( hello.hello(quot;worldquot;) ); } } 12
  13. 13. Constructor injection public class Printer { Mark the constructor to be called by private Hello hello; the container @Initializer @Initializer public Printer(Hello hello) { this.hello=hello; } public void hello() { System.out.println( hello.hello(quot;worldquot;) ); } Constructors are injected by default; } @Current is the default binding type 13
  14. 14. Web Bean Names By default not available through EL. @Named(quot;helloquot;) public class Hello { public String hello(String name) { return quot;helloquot; + name; } } If no name is specified, then a default name is used. Both these @Named beans have the same name public class Hello { public String hello(String name) { return quot;helloquot; + name; } 14
  15. 15. JSF Page <h:commandButton value=“Say Hello” action=“#{hello.hello}”/> Calling an action on a bean through EL 15
  16. 16. Binding Types • A binding type is an annotation that lets a client choose between multiple implementations of an API at runtime - Binding types replace lookup via string-based names - @Current is the default binding type 16
  17. 17. Define a binding type public Creating a binding type is @BindingType really easy! @Retention(RUNTIME) @Target({TYPE, METHOD, FIELD, PARAMETER}) @interface Casual {} 17
  18. 18. Using a binding type We also specify the @Casual binding @Casual type. If no binding type is specified on a bean, @Current is assumed public class Hi extends Hello { public String hello(String name) { return quot;hiquot; + name; } } 18
  19. 19. Using a binding type Here we inject the Hello bean, and require an implementation which is public class Printer { bound to @Casual @Casual Hello hello; public void hello() { System.out.println( hello.hello(quot;JBossquot;) ); } } 19
  20. 20. Deployment Types • A deployment type is an annotation that identifies a deployment scenario - Deployment types may be enabled or disabled, allowing whole sets of beans to be easily enabled or disabled at deployment time - Deployment types have a precedence, allowing different implementations of an API to be chosen - Deployment types replace verbose XML configuration documents • Default deployment type: Production 20
  21. 21. Create a deployment type public @DeploymentType @Retention(RUNTIME) @Target({TYPE, METHOD}) @interface Espanol {} 21
  22. 22. Using a deployment type Same API, different @Espanol implementation public class Hola extends Hello { public String hello(String name) { return quot;hola quot; + name; } } 22
  23. 23. Enabling deployment types <Beans> <Deploy> <Standard /> <Production> <i8ln:Espanol> A strongly ordered list of enabled </Deploy> deployment types. Notice how everything </Beans> is an annotation and so typesafe! Only Web Bean implementations which have enabled deployment types will be deployed to the container 23
  24. 24. Scopes and Contexts • Extensible context model - A scope type is an annotation, can write your own context implementation and scope type annotation • Dependent scope, @Dependent • Built-in scopes: - Any servlet - @ApplicationScoped, @RequestScoped, @SessionScoped - JSF requests - @ConversationScoped • Custom scopes 24
  25. 25. Scopes @SessionScoped Session scoped public class Login { private User user; public void login() { user = ...; } public User getUser() { return user; } } 25
  26. 26. Scopes public class Printer { No coupling between scope and use of implementation @Current Hello hello; @Current Login login; public void hello() { System.out.println( hello.hello( login.getUser().getName() ) ); } } 26
  27. 27. Conversation context @ConversationScoped Conversation has the same semantics as in Seam public class ChangePassword { @UserDatabase EntityManager em; @Current Conversation conversation; private User user; public User getUser(String userName) { conversation.begin(); Conversation is user = em.find(User.class, userName); demarcated by the application } public User setPassword(String password) { user.setPassword(password); conversation.end(); } } 27
  28. 28. Producer methods • Producer methods allow control over the production of a bean where: - the objects to be injected are not managed instances - the concrete type of the objects to be injected may vary at runtime - the objects require some custom initialization that is not performed by the bean constructor 28
  29. 29. Producer methods @SessionScoped public class Login { private User user; public void login() { user = ...; } @Produces User getUser() { return user; } } 29
  30. 30. Producer methods Producer method can a @SessionScoped scope (otherwise inherited from the declaring public class Login { component) private User user; @Produces @RequestScoped @LoggedIn Producer method can have User getUser() { return user; } a binding type @Produces String getWelcomeMessage(@Current Hello hello) { return hello.hello(user); You can inject parameters } 30
  31. 31. Producer methods public class Printer { @Current Hello hello; @Current User user; Much better, no public void hello() { dependency on Login! System.out.println( hello.hello( user.getName() ) ); } } 31
  32. 32. Producer Fields • Simpler alternative to Producer methods @SessionScoped Similar to outjection in Seam public class Login { @Produces @LoggedIn @RequestScoped private User user; public void login() { user = ...; } 32
  33. 33. Disposal Method • Clean up after a producer method public class UserDatabaseEntityManager { @Produces @UserDatabase EntityManager create(EntityManagerFactory emf) { return emf.createEntityManager(); Same binding types } Same API type void close(@Disposes @UserDatabase EntityManager em) { em.close(); } } 33
  34. 34. Java EE Resources • To inject Java EE resources, persistence contexts, web service references, remote EJB references, etc, we use a special kind of producer field declaration: public class PricesTopic { @Produces @Prices @Resource(name=quot;java:global/env/jms/Pricesquot;) Topic pricesTopic; } public class UserDatabasePersistenceContext { @Produces @UserDatabase @PersistenceContext EntityManager userDatabase; } 34
  35. 35. Events Event producers raise events that are then delivered to event observers by the Web Bean manager. - not only are event producers decoupled from observers; observers are completely decoupled from producers - observers can specify a combination of quot;selectorsquot; to narrow the set of event notifications they will receive - observers can be notified immediately, or can specify that delivery of the event should be delayed until the end of the current transaction 35
  36. 36. Event producer Inject an instance of Event. Additional binding types can be specified to narrow the event public class Hello { consumers called. API type specified as a parameter on Event @Casual Event<Greeting> casualHello; public void hello(String name) { casualHello.fire( new Greeting(quot;hello quot; + name) ); } “Fire” an event, the } producer will be notified 36
  37. 37. Event consumer Observer methods, take the API public class Printer { type and additional binding types void onHello(@Observes @Casual Greeting greeting, @Current User user) { System.out.println(user + “ “ + greeting); } } Additional parameters can be specified and will be injected by the container 37
  38. 38. Specialization • Allows a bean with a higher precedence deployment to completely replace a bean with a lower precedence - even producer methods, observer methods etc. @Mock A @Mock deployment type for testing @Specializes public class MockLogin extends Login { @Produces User getUser() { return new DummyUser(); } } 38
  39. 39. Road Map Background Concepts Status 39
  40. 40. JSR-299 • Public Review Draft 2 published • Currently working on EE6 integration • Web Beans “Book” (a less formal guide to JSR299) - http://www.seamframework.org/WebBeans • Send feedback to jsr-299-comments@jcp.org 40
  41. 41. Web Beans • The Reference implementation - Feature complete preview of second public review draft. Download it, try it out, give feedback! - http://seamframework.org/Download • Integrated into: - JBoss 5.1.0.CR1 and above - GlassFish V3 build 46 and above • Available as an addon for: - Tomcat 6.0.x - Jetty 6.1.x 41
  42. 42. Q&A http://in.relation.to/Bloggers/Pete http://www.seamframework.org/WebBeans http://jcp.org/en/jsr/detail?id=299 42
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×