This document discusses CDI (JSR-299), Weld, and the future of Seam. It begins with an introduction and agenda. It then covers key CDI concepts and terminology such as loose coupling, strong typing, qualifiers, alternatives, scopes, and producer methods. It explains how CDI provides a unified approach to managing beans in Java EE and integrates with other technologies like JSF. It also discusses how the Weld project implements CDI and how Seam is evolving in relation to CDI and Weld.
JSR-299 (CDI), Weld & the Future of Seam (JavaOne 2010)Dan Allen
Introduces JSR-299, the new Java standard for contextual lifecycle management, dependency injection (CDI) and event notification. Covers the core programming model, explains its relationship to EJB 3.1 and JSF 2.0, and clarifies how it unifies and enhances the Java EE platform as a whole (extending to JPA, JAX-RS and JMS). You are then introduced to Weld, the JSR-299 Reference Implementation, and its Servlet container and Java SE extensions. Finally, looks ahead at how a modularized Seam 3 ties into this new foundation as a set of portable CDI extensions.
A 30 slide CDI (Context and Dependency Injection for the Java EE Platform) presentation Jens Augustsson from Redpill Linpro did in Copenhagen March 23 2011
Throwing complexity over the wall: Rapid development for enterprise Java (Jav...Dan Allen
For many, development of enterprise Java has long been an arduous undertaking. We're of the opinion that application programmers should be free to focus on their business logic only.
In this session, we'll cover:
• What makes us most productive?
• What tasks should we be programming; more importantly, what shouldn't we?
• What is a component model, and what does it buy us?
• How is this stuff usable in the real world?
We'll discuss how testing relates to the features of the Java EE 6 stack. By the end, we'll have introduced a pair of simple and powerful frameworks that render the testing of real enterprise components as natural as calling "add" on a CS101 Calculator.java.
Moving to Java EE 6 and CDI and away from the clutterDan Allen
Java EE 6 standards and technologies, such as JSR 299 - Contexts & Dependency Injection, significantly reduce complexity, increase developer productivity and insure your freedom from vendor lock-in.
This Red Hat webinar explains how Java EE 6 can be even simpler than using proprietary legacy frameworks, and take much less time.
JSR-299 (CDI), Weld & the Future of Seam (JavaOne 2010)Dan Allen
Introduces JSR-299, the new Java standard for contextual lifecycle management, dependency injection (CDI) and event notification. Covers the core programming model, explains its relationship to EJB 3.1 and JSF 2.0, and clarifies how it unifies and enhances the Java EE platform as a whole (extending to JPA, JAX-RS and JMS). You are then introduced to Weld, the JSR-299 Reference Implementation, and its Servlet container and Java SE extensions. Finally, looks ahead at how a modularized Seam 3 ties into this new foundation as a set of portable CDI extensions.
A 30 slide CDI (Context and Dependency Injection for the Java EE Platform) presentation Jens Augustsson from Redpill Linpro did in Copenhagen March 23 2011
Throwing complexity over the wall: Rapid development for enterprise Java (Jav...Dan Allen
For many, development of enterprise Java has long been an arduous undertaking. We're of the opinion that application programmers should be free to focus on their business logic only.
In this session, we'll cover:
• What makes us most productive?
• What tasks should we be programming; more importantly, what shouldn't we?
• What is a component model, and what does it buy us?
• How is this stuff usable in the real world?
We'll discuss how testing relates to the features of the Java EE 6 stack. By the end, we'll have introduced a pair of simple and powerful frameworks that render the testing of real enterprise components as natural as calling "add" on a CS101 Calculator.java.
Moving to Java EE 6 and CDI and away from the clutterDan Allen
Java EE 6 standards and technologies, such as JSR 299 - Contexts & Dependency Injection, significantly reduce complexity, increase developer productivity and insure your freedom from vendor lock-in.
This Red Hat webinar explains how Java EE 6 can be even simpler than using proprietary legacy frameworks, and take much less time.
DDD&Scalaで作られたプロダクトはその後どうなったか?(Current state of products made with DDD & Scala)MicroAd, Inc.(Engineer)
ScalaMatsuri2023登壇スライド
https://scalamatsuri.org/ja/program/J1681614000
DDD&Scalaで作られたプロダクトはその後どうなったか?
Current state of products made with DDD & Scala
#ScalaMatsuri
Revolutionizing the Data Abstraction Layer with IBM Optim pureQuery and DB2Vladimir Bacvanski, PhD
Vladimir Bacvanski and Dan Galvin
Looking for a more flexible and efficient way for Java programs to access the database? Join us as we explore how you can
bridge the gap between Java and relational databases. Enhance your Java environment with access layer generation, data
access best practices, traceability between Java packages and SQL statements, improved impact analysis and more. And most importantly, see how new technology can improve not only new development, but existing applications as well. Be prepared to
see designs and code samples!
Haj 4344-java se 9 and the application server-1Kevin Sutter
Our presentation at InterConnect 2017 about Java SE 9 and our direct experiences with using it as our Java runtime for the WebSphere Liberty application server.
OSGi Community Event 2015
OSGi is a widely used modularity framework for Java, with rapid growth in the enterprise space. Since Java EE6, Contexts and Dependency Injection (CDI) also becomes very popular. One of the significant changes in Java EE7 is that CDI is now enabled by default. Uniting two powerful programming modes, CDI and dynamic services in OSGi, will make OSGi technology even more powerful. OSGi Alliance is working towards standardizing the specification of CDI Integration into OSGi. This session will explain how CDI Integration in OSGi works.
DDD&Scalaで作られたプロダクトはその後どうなったか?(Current state of products made with DDD & Scala)MicroAd, Inc.(Engineer)
ScalaMatsuri2023登壇スライド
https://scalamatsuri.org/ja/program/J1681614000
DDD&Scalaで作られたプロダクトはその後どうなったか?
Current state of products made with DDD & Scala
#ScalaMatsuri
Revolutionizing the Data Abstraction Layer with IBM Optim pureQuery and DB2Vladimir Bacvanski, PhD
Vladimir Bacvanski and Dan Galvin
Looking for a more flexible and efficient way for Java programs to access the database? Join us as we explore how you can
bridge the gap between Java and relational databases. Enhance your Java environment with access layer generation, data
access best practices, traceability between Java packages and SQL statements, improved impact analysis and more. And most importantly, see how new technology can improve not only new development, but existing applications as well. Be prepared to
see designs and code samples!
Haj 4344-java se 9 and the application server-1Kevin Sutter
Our presentation at InterConnect 2017 about Java SE 9 and our direct experiences with using it as our Java runtime for the WebSphere Liberty application server.
OSGi Community Event 2015
OSGi is a widely used modularity framework for Java, with rapid growth in the enterprise space. Since Java EE6, Contexts and Dependency Injection (CDI) also becomes very popular. One of the significant changes in Java EE7 is that CDI is now enabled by default. Uniting two powerful programming modes, CDI and dynamic services in OSGi, will make OSGi technology even more powerful. OSGi Alliance is working towards standardizing the specification of CDI Integration into OSGi. This session will explain how CDI Integration in OSGi works.
The Spring Data project provides sophisticated support for NoSQL datastores. The MongoDB module consists of a namespace to easily setup MongoDB access, a template class to provide a nice API to persist and query objects as well as sophisticated support to build repositories accessing entities stored in a MongoDB. The talk will introduce the Spring Data MongoDB support.
Spark SQL Adaptive Execution Unleashes The Power of Cluster in Large Scale wi...Databricks
Spark SQL is a very effective distributed SQL engine for OLAP and widely adopted in Baidu production for many internal BI projects. However, Baidu has also been facing many challenges for large scale including tuning the shuffle parallelism for thousands of jobs, inefficient execution plan, and handling data skew. In this talk, we will explore Intel and Baidu’s joint efforts to address challenges in large scale and offer an overview of an adaptive execution mode we implemented for Baidu’s Big SQL platform which is based on Spark SQL. At runtime, adaptive execution can change the execution plan to use a better join strategy and handle skewed join automatically. It can also change the number of reducer to better fit the data scale. In general, adaptive execution decreases the effort involved in tuning SQL query parameters and improves the execution performance by choosing a better execution plan and parallelism at runtime.
We’ll also share our experience of using adaptive execution in Baidu’s production cluster with thousands of server, where adaptive execution helps to improve the performance of some complex queries by 200%. After further analysis we found that several special scenarios in Baidu data analysis can benefit from the optimization of choosing better join type. We got 2x performance improvement in the scenario where the user wanted to analysis 1000+ advertisers’ cost from both web and mobile side and each side has a full information table with 10 TB parquet file per-day. Now we are writing probe jobs to detect more scenarios from current daily jobs of our users. We are also considering to expose the strategy interface based on the detailed metrics collected form adaptive execution mode for the upper users.
최근 국내와 글로벌 서비스에서 MongoDB를 사용하는 사례가 급증하고 있습니다. 다만 전통적인 RDBMS에 비해, 아직 지식과 경험의 축적이 적게 되어 있어 손쉬운 접근과 트러블 슈팅등에 문제가 있는 것도 사실입니다. 이 세션에서는 MongoDB 와 AWS의 DocumentDB의 Architecure를 간단히 살펴보고 MongoDB 및 DocumentDB의 비교를 진행하며 특히 MongoDB와 DocumentDB를 사용할때 주의해야할 중요 포인트에 대해서 알아봅니다.
DevOps and Testing slides at DASA ConnectKari Kakkonen
My and Rik Marselis slides at 30.5.2024 DASA Connect conference. We discuss about what is testing, then what is agile testing and finally what is Testing in DevOps. Finally we had lovely workshop with the participants trying to find out different ways to think about quality and testing in different parts of the DevOps infinity loop.
Accelerate your Kubernetes clusters with Varnish CachingThijs Feryn
A presentation about the usage and availability of Varnish on Kubernetes. This talk explores the capabilities of Varnish caching and shows how to use the Varnish Helm chart to deploy it to Kubernetes.
This presentation was delivered at K8SUG Singapore. See https://feryn.eu/presentations/accelerate-your-kubernetes-clusters-with-varnish-caching-k8sug-singapore-28-2024 for more details.
Elevating Tactical DDD Patterns Through Object CalisthenicsDorra BARTAGUIZ
After immersing yourself in the blue book and its red counterpart, attending DDD-focused conferences, and applying tactical patterns, you're left with a crucial question: How do I ensure my design is effective? Tactical patterns within Domain-Driven Design (DDD) serve as guiding principles for creating clear and manageable domain models. However, achieving success with these patterns requires additional guidance. Interestingly, we've observed that a set of constraints initially designed for training purposes remarkably aligns with effective pattern implementation, offering a more ‘mechanical’ approach. Let's explore together how Object Calisthenics can elevate the design of your tactical DDD patterns, offering concrete help for those venturing into DDD for the first time!
Essentials of Automations: Optimizing FME Workflows with ParametersSafe Software
Are you looking to streamline your workflows and boost your projects’ efficiency? Do you find yourself searching for ways to add flexibility and control over your FME workflows? If so, you’re in the right place.
Join us for an insightful dive into the world of FME parameters, a critical element in optimizing workflow efficiency. This webinar marks the beginning of our three-part “Essentials of Automation” series. This first webinar is designed to equip you with the knowledge and skills to utilize parameters effectively: enhancing the flexibility, maintainability, and user control of your FME projects.
Here’s what you’ll gain:
- Essentials of FME Parameters: Understand the pivotal role of parameters, including Reader/Writer, Transformer, User, and FME Flow categories. Discover how they are the key to unlocking automation and optimization within your workflows.
- Practical Applications in FME Form: Delve into key user parameter types including choice, connections, and file URLs. Allow users to control how a workflow runs, making your workflows more reusable. Learn to import values and deliver the best user experience for your workflows while enhancing accuracy.
- Optimization Strategies in FME Flow: Explore the creation and strategic deployment of parameters in FME Flow, including the use of deployment and geometry parameters, to maximize workflow efficiency.
- Pro Tips for Success: Gain insights on parameterizing connections and leveraging new features like Conditional Visibility for clarity and simplicity.
We’ll wrap up with a glimpse into future webinars, followed by a Q&A session to address your specific questions surrounding this topic.
Don’t miss this opportunity to elevate your FME expertise and drive your projects to new heights of efficiency.
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf91mobiles
91mobiles recently conducted a Smart TV Buyer Insights Survey in which we asked over 3,000 respondents about the TV they own, aspects they look at on a new TV, and their TV buying preferences.
A tale of scale & speed: How the US Navy is enabling software delivery from l...sonjaschweigert1
Rapid and secure feature delivery is a goal across every application team and every branch of the DoD. The Navy’s DevSecOps platform, Party Barge, has achieved:
- Reduction in onboarding time from 5 weeks to 1 day
- Improved developer experience and productivity through actionable findings and reduction of false positives
- Maintenance of superior security standards and inherent policy enforcement with Authorization to Operate (ATO)
Development teams can ship efficiently and ensure applications are cyber ready for Navy Authorizing Officials (AOs). In this webinar, Sigma Defense and Anchore will give attendees a look behind the scenes and demo secure pipeline automation and security artifacts that speed up application ATO and time to production.
We will cover:
- How to remove silos in DevSecOps
- How to build efficient development pipeline roles and component templates
- How to deliver security artifacts that matter for ATO’s (SBOMs, vulnerability reports, and policy evidence)
- How to streamline operations with automated policy checks on container images
A tale of scale & speed: How the US Navy is enabling software delivery from l...
CDI, Weld and the future of Seam
1. CDI (JSR-299), Weld and
the future of Seam
Dan Allen
Senior Software Engineer
JBoss by Red Hat
2. Who am I?
● Author of Seam in Action, Manning 2008
● Seam Community Liaison
● Weld, Seam & Arquillian project member
● JSR-314 (JSF 2) EG representative
● Open Source advocate
mojavelinux
2 CDI (JSR-299), Weld and the future of Seam | Dan Allen
3. Agenda
● Terminology
● Why JSR-299?
● JSR-299 themes
● Brief tour of programming model
● Weld
● Seam
3 CDI (JSR-299), Weld and the future of Seam | Dan Allen
4. Technology terminology
● CDI (JSR-299)
● Contexts & dependency injection for Java EE
● Weld
● JSR-299 Reference Implementation & TCK
● Extended CDI support (Servlets, Java SE)
● CDI enhancements for extension writers
● Maven archetypes for CDI and Java EE
● Seam 3
● Portable extensions for Java EE
● Integrations with non-Java EE technologies
4 CDI (JSR-299), Weld and the future of Seam | Dan Allen
5. Stated goal of JSR-299
Web tier Transactional tier
(JSF) (EJB)
5 CDI (JSR-299), Weld and the future of Seam | Dan Allen
6. Why reinvest?
Java EE 5
6
Seam 2 CDI (JSR-299), Weld and the future of Seam | Dan Allen
7. What CDI provides
● Services for Java EE components
● Lifecycle management of stateful beans bound to
well-defined contexts (including conversation context)
● A type-safe approach to dependency injection
● Interaction via an event notification facility
● Reduced coupling between interceptors and beans
● Decorators, which intercept specific bean instances
● Unified EL integration (bean names)
● SPI for developing extensions for the Java EE platform
● Java EE architecture flexible, portable, extensible
7 CDI (JSR-299), Weld and the future of Seam | Dan Allen
8. What CDI provides
● Services for Java EE components
● Lifecycle management of stateful beans bound to
well-defined contexts (including conversation context)
● A type-safe approach to dependency injection
● Interaction via an event notification facility
● Reduced coupling between interceptors and beans
● Decorators, which intercept specific bean instances
● Unified EL integration (bean names)
● SPI for developing extensions for the Java EE platform
● Java EE architecture flexible, portable, extensible
8 CDI (JSR-299), Weld and the future of Seam | Dan Allen
9. CDI: The big picture
● Fill in
● Catalyze
● Evolve
9 CDI (JSR-299), Weld and the future of Seam | Dan Allen
10. Why injection?
● Weakest aspect of Java EE 5
● Fixed set of injectable resources
● @EJB
● @PersistenceContext, @PersistenceUnit
● @Resource (e.g., DataSource, UserTransaction)
● Name-based injection is fragile
● Not “refactor friendly”
● Requires special tooling to validate
10 CDI (JSR-299), Weld and the future of Seam | Dan Allen
11. JSR-299 theme
@Produces @WishList
Loose coupling... List<Product> getWishList()
Event<Order>
@InterceptorBinding
@Inject @UserDatabase EntityManager
@Observes
@Qualifier ...with strong typing
11 CDI (JSR-299), Weld and the future of Seam | Dan Allen
12. Loose coupling
●
Decouple server and client
● Using well-defined types and “qualifiers”
● Allows server implementation to vary
●
Decouple lifecycle of collaborating components
● Automatic contextual lifecycle management
● Stateful components interact like services
●
Decouple orthogonal concerns (AOP)
● Interceptors & decorators
●
Decouple message producer from consumer
● Events
12 CDI (JSR-299), Weld and the future of Seam | Dan Allen
13. Strong typing
● Type-based injection
● Eliminate reliance on string-based names
● Compiler can detect typing errors
● No special authoring tools required
● Casting mostly eliminated
● Semantic code errors detected at application startup
● Tooling can detect ambiguous dependencies
13 CDI (JSR-299), Weld and the future of Seam | Dan Allen
14. Leverage and extend Java’s type system
@Annotation <TypeParam>
This information is pretty useful!
Type
14 CDI (JSR-299), Weld and the future of Seam | Dan Allen
15. Who's bean is it anyway?
● Everyone throwing around this term “bean”
● JSF
● EJB
● Seam
● Spring
● Guice
● CDI
● Need a “unified bean definition”
15 CDI (JSR-299), Weld and the future of Seam | Dan Allen
16. Managed bean specification
● Common bean definition
● Instances are managed Managed
by the container Beans
● Common services
● Interceptors
● Resource injections
● Lifecycle callbacks JSF EJB CDI JAX-RS
● Foundation spec
How managed beans evolved: http://www.infoq.com/news/2009/11/weld10
16 CDI (JSR-299), Weld and the future of Seam | Dan Allen
17. CDI bean ingredients
● Auto-discovered
● Set of bean types
● Set of qualifiers
● Scope
● Bean EL name (optional)
● Set of interceptor bindings
● Alternative classification
● Bean implementation class
17 CDI (JSR-299), Weld and the future of Seam | Dan Allen
18. Welcome to CDI, managed beans!
public class Welcome {
public String buildPhrase(String city) {
return "Welcome to " + city + "!";
}
}
18 CDI (JSR-299), Weld and the future of Seam | Dan Allen
19. Welcome to CDI, EJB 3.1 session beans!
@Stateless public class Welcome {
public String buildPhrase(String city) {
return "Welcome to " + city + "!";
}
}
19 CDI (JSR-299), Weld and the future of Seam | Dan Allen
20. When is a bean recognized?
● Bean archive (WAR) ● Bean archive (JAR)
beans.xml can be empty!
20 CDI (JSR-299), Weld and the future of Seam | Dan Allen
21. Injection 101
public class Greeter {
@Inject Welcome w;
public void welcome() { @Default qualifier implied
@Default qualifier implied
System.out.println(
w.buildPhrase("Reston"));
}
}
21 CDI (JSR-299), Weld and the future of Seam | Dan Allen
22. Where can it be injected?
● Field
● Method parameter
● Constructor*
● Initializer
● Producer
● Observer
22 CDI (JSR-299), Weld and the future of Seam | Dan Allen
23. What can be injected?
Managed bean
Object returned by producer
EJB session bean (local or remote)
Java EE resource (DataSource, JMS destination, etc)
JTA UserTransaction
Persistence unit or context
Security principle
Bean Validation factory
Web service reference
Additional resources introduced through SPI
23 CDI (JSR-299), Weld and the future of Seam | Dan Allen
24. The bean vs “the other implementation”
● Multiple implementations of same interface
● One implementation extends another
public class Welcome {
public String buildPhrase(String city) {
return "Welcome to " + city + "!";
}
}
public class TranslatingWelcome extends Welcome {
@Inject GoogleTranslator translator;
public String buildPhrase(String city) {
return translator.translate(
"Welcome to " + city + "!");
}
}
24 CDI (JSR-299), Weld and the future of Seam | Dan Allen
25. Quiz: Now which implementation gets injected?
public class Greeter {
private Welcome welcome;
@Inject
void init(Welcome welcome) {
this.welcome = welcome;
}
...
}
It's ambiguous!
25 CDI (JSR-299), Weld and the future of Seam | Dan Allen
26. Settling an ambiguous resolution
● Qualifier
● Alternative
● Hide bean types
26 CDI (JSR-299), Weld and the future of Seam | Dan Allen
27. qualifier
n. an annotation used to resolve an API
implementation variant at an injection point
27 CDI (JSR-299), Weld and the future of Seam | Dan Allen
28. Defining a qualifier
● A qualifier is an annotation
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Translating {}
28 CDI (JSR-299), Weld and the future of Seam | Dan Allen
29. Qualifying an implementation
● Adding a qualifier annotation:
● makes type more specific
● assigns semantic meaning
@Translating
public class TranslatingWelcome extends Welcome {
@Inject GoogleTranslator translator;
public String buildPhrase(String city) {
return translator.translate(
"Welcome to " + city + "!");
}
}
29 CDI (JSR-299), Weld and the future of Seam | Dan Allen
30. Qualifier as a “binding type”
30 CDI (JSR-299), Weld and the future of Seam | Dan Allen
31. Using a specific implementation
● Qualified implementation must be requested explicitly
● Akin to the factory method pattern
● Resolves ambiguity at injection point!
public class Greeter {
private Welcome welcome; No reference to implementation class!
No reference to implementation class!
@Inject
void init(@Translating Welcome welcome) {
this.welcome = welcome
}
public void welcomeVisitors() {
System.out.println(
welcome.buildPhrase("Reston"));
}
}
31 CDI (JSR-299), Weld and the future of Seam | Dan Allen
32. Alternative bean
● Swap replacement implementation per deployment
● Replaces bean and its producer methods and fields
● Disabled by default
● Must be activated in /META-INF/beans.xml
Put simply: an override
32 CDI (JSR-299), Weld and the future of Seam | Dan Allen
33. Defining an alternative
@Alternative
public class TranslatingWelcome extends Welcome {
@Inject GoogleTranslator translator;
public String buildPhrase(String city) {
return translator.translate(
"Welcome to " + city + "!");
}
}
33 CDI (JSR-299), Weld and the future of Seam | Dan Allen
34. Substituting the alternative
● Implementation must be activated using beans.xml
<beans>
<alternatives>
<class>com.acme.TranslatingWelcome</class>
</alternatives>
</beans>
34 CDI (JSR-299), Weld and the future of Seam | Dan Allen
35. Assigning a bean name
@Named("greeter")
public class Greeter {
private Welcome welcome;
@Inject
void init(Welcome welcome) {
this.welcome = welcome;
}
public void welcomeVisitors() {
System.out.println(
welcome.buildPhrase("Reston"));
}
}
35 CDI (JSR-299), Weld and the future of Seam | Dan Allen
36. Assigning a bean name by convention
@Named
public class Greeter {
private Welcome welcome; Bean name is decapitalized
Bean name is decapitalized
simple class name
simple class name
@Inject
void init(Welcome welcome) {
this.welcome = welcome;
}
public void welcomeVisitors() {
System.out.println(
welcome.buildPhrase("Reston"));
}
}
36 CDI (JSR-299), Weld and the future of Seam | Dan Allen
37. Welcome to CDI, JSF!
● Use the bean directly in the JSF view
<h:form>
<h:commandButton value="Welcome visitors"
action="#{greeter.welcomeVisitors}"/>
</h:form>
37 CDI (JSR-299), Weld and the future of Seam | Dan Allen
38. JSF
managed JSP
beans
CDI Facelets
38 CDI (JSR-299), Weld and the future of Seam | Dan Allen
39. Stashing the bean in a context
● Bean saved for the duration of a request
@RequestScoped
@Named("greeter")
public class Greeter {
private Welcome welcome;
private String city; // getter and setter hidden
@Inject
void init(Welcome welcome) {
this.welcome = welcome
}
public void welcomeVisitors() {
System.out.println(welcome.buildPhrase(city));
}
}
39 CDI (JSR-299), Weld and the future of Seam | Dan Allen
40. Collapsing layers with state management
● Now it’s possible for bean to hold state
<h:form>
<h:inputText value="#{greeter.city}"/>
<h:commandButton value="Welcome visitors"
action="#{greeter.welcomeVisitors}"/>
</h:form>
● Satisfies initial goal of JSR-299
● ...in fact, integrates JSF and any managed bean
40 CDI (JSR-299), Weld and the future of Seam | Dan Allen
41. Scope types and contexts
● Absence of scope - @Dependent
● Bound to lifecycle of bean holding reference
● Servlet scopes
● @ApplicationScoped
● @RequestScoped
● @SessionScoped
● JSF conversation scope - @ConversationScoped
● Custom scopes
● Define scope type annotation (e.g., @FlashScoped)
● Implement the context API in an extension
41 CDI (JSR-299), Weld and the future of Seam | Dan Allen
42. Scope transparency
● Scopes not visible to client
● No coupling between scope and use of type
● Scoped beans are proxied for thread safety
42 CDI (JSR-299), Weld and the future of Seam | Dan Allen
43. Conversation context
● Request <= Conversation << Session
●
● Boundaries demarcated by application
● Optimistic transaction
● Conversation-scoped persistence context
● No fear of exceptions on lazy fetch operations
43 CDI (JSR-299), Weld and the future of Seam | Dan Allen
44. Controlling the conversation
@ConversationScoped
public class BookingAgent {
@Inject @BookingDatabase EntityManager em;
@Inject Conversation conversation;
private Hotel selected;
private Booking booking;
public void select(Hotel h) {
selected = em.find(Hotel.class, h.getId());
conversation.begin();
}
...
44 CDI (JSR-299), Weld and the future of Seam | Dan Allen
45. Controlling the conversation
...
public boolean confirm() {
if (!isValid()) {
return false;
}
em.persist(booking);
conversation.end();
return true;
}
}
45 CDI (JSR-299), Weld and the future of Seam | Dan Allen
46. producer method
n. a method whose return value produces
an injectable object
46 CDI (JSR-299), Weld and the future of Seam | Dan Allen
47. Producer method examples
@Produces @RequestScoped
public FacesContext getFacesContext() { From non-bean
From non-bean
return FacesContext.getInstance();
}
@Produces
public PaymentProcessor getPaymentProcessor(
@Synchronous PaymentProcessor sync,
Runtime selection
Runtime selection
@Asynchronous PaymentProcessor async) {
return isSynchronous() ? sync : async;
}
@Produces @SessionScoped @WishList Custom setup
Custom setup
public List<Product> getWishList() {
return em.createQuery("...").getResultList();
}
47 CDI (JSR-299), Weld and the future of Seam | Dan Allen
48. Bridging Java EE resources
● Use producer field to expose Java EE resource
@Stateless
public class UserEntityManagerProducer {
@Produces @UserRepository
@PersistenceContext(unitName = "userPU")
EntityManager em;
}
@Stateless
public class PricesTopicProducer {
@Produces @Prices
@Resource(name = "java:global/env/jms/Prices")
Topic pricesTopic;
}
48 CDI (JSR-299), Weld and the future of Seam | Dan Allen
49. Injecting resource in type-safe way
● String-based resource names are hidden
public class UserManager {
@Inject @UserRepository EntityManager userEm;
...
}
public class StockDisplay {
@Inject @Prices Topic pricesTopic;
...
}
49 CDI (JSR-299), Weld and the future of Seam | Dan Allen
50. Rethinking interceptors
@Interceptors(
SecurityInterceptor.class,
TransactionInterceptor.class,
LoggingInterceptor.class
)
@Stateful public class BusinessComponent {
...
}
Um, what's the point?
50 CDI (JSR-299), Weld and the future of Seam | Dan Allen
51. Interceptor wiring in JSR-299 (1)
● Define an interceptor binding type
@InterceptorBinding
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Secure {}
51 CDI (JSR-299), Weld and the future of Seam | Dan Allen
52. Interceptor wiring in JSR-299 (2)
● Marking the interceptor implementation
@Secure
@Interceptor
public class SecurityInterceptor {
@AroundInvoke
public Object aroundInvoke(InvocationContext ctx)
throws Exception {
// ...enforce security...
ctx.proceed();
}
}
52 CDI (JSR-299), Weld and the future of Seam | Dan Allen
53. Interceptor wiring in JSR-299 (3)
● Applying interceptor with proper semantics
@Secure
public class AccountManager {
public boolean transfer(Account a, Account b) {
...
}
}
53 CDI (JSR-299), Weld and the future of Seam | Dan Allen
54. Multiple interceptors
● Application developer only concerned about semantics
@Transactional
public class AccountManager {
@Secure
public boolean transfer(Account a, Account b) {
...
}
}
54 CDI (JSR-299), Weld and the future of Seam | Dan Allen
55. Enabling and ordering interceptors
● Bean archive has no enabled interceptors by default
● Interceptors activated in beans.xml of bean archive
● Referenced by binding type
● Ordering is per-module
● Declared in module in which the interceptor is used
<beans>
<interceptors>
<class>com.acme.SecurityInterceptor</class>
<class>com.acme.TransactionInterceptor</class>
</interceptors>
</beans>
Interceptors applied in order listed
Interceptors applied in order listed
55 CDI (JSR-299), Weld and the future of Seam | Dan Allen
56. Composite interceptor bindings
● Interceptor binding types can be meta-annotations
public
@Secure
@Transactional
@InterceptorBinding Order does not matter
Order does not matter
@Retention(RUNTIME)
@Target(TYPE)
@interface BusinessOperation {}
56 CDI (JSR-299), Weld and the future of Seam | Dan Allen
57. Multiple interceptors (but you won’t know it)
● Interceptors inherited from composite binding types
public
@BusinessOperation
class AccountManager {
public boolean transfer(Account a, Account b) {
...
}
}
57 CDI (JSR-299), Weld and the future of Seam | Dan Allen
58. Wrap up annotations using stereotypes
● Common architectural patterns – recurring roles
● A stereotype packages:
● A default scope
● A set of interceptor bindings
● The ability to that beans are named
● The ability to specify that beans are alternatives
58 CDI (JSR-299), Weld and the future of Seam | Dan Allen
59. Annotation jam!
● Without stereotypes, annotations pile up
public
@Secure
@Transactional
@RequestScoped
@Named
class AccountManager {
public boolean transfer(Account a, Account b) {
...
}
}
59 CDI (JSR-299), Weld and the future of Seam | Dan Allen
60. Defining a stereotype
● Stereotypes are annotations that group annotations
public
@Secure
@Transactional
@RequestScoped
@Named
@Stereotype
@Retention(RUNTIME)
@Target(TYPE)
@interface BusinessComponent {}
60 CDI (JSR-299), Weld and the future of Seam | Dan Allen
61. Using a stereotype
● Stereotypes give a clear picture, keep things simple
public
@BusinessComponent
class AccountManager {
public boolean transfer(Account a, Account b) {
...
}
}
61 CDI (JSR-299), Weld and the future of Seam | Dan Allen
62. Events
● Completely decouple action and reactions
● Selectors tune which event notifications are received
● Can be observed:
● immediately,
● after transaction completion or
● asynchronously (via extension)
62 CDI (JSR-299), Weld and the future of Seam | Dan Allen
63. Firing an event Event instance with
Event instance with
type-safe payload
type-safe payload
public class GroundController {
@Inject @Landing Event<Flight> flightLanding;
public void clearForLanding(String flightNum) {
flightLanding.fire(new Flight(flightNum));
}
}
63 CDI (JSR-299), Weld and the future of Seam | Dan Allen
64. An event observer
Takes event API type with
Takes event API type with
public class GateServices { additional binding type
additional binding type
public void onIncomingFlight(
@Observes @Landing Flight flight,
Greeter greeter,
CateringService cateringService) {
Gate gate = ...;
flight.setGate(gate);
cateringService.dispatch(gate);
greeter.welcomeVisitors();
}
}
Additional parameters are
Additional parameters are
injected by the container
injected by the container
64 CDI (JSR-299), Weld and the future of Seam | Dan Allen
65. Weld: JSR-299 Reference Implementation
● Developed under Seam project umbrella
● Version 1.0.1 available
● Bundled in JBoss AS 6 & GlassFish V3
● Support for Tomcat, Jetty & Java SE
● CDI enhancements & utilities for extension writers
● Maven archetypes for CDI & Java EE
65 CDI (JSR-299), Weld and the future of Seam | Dan Allen
66. Seam’s mission statement
To provide a fully integrated development
platform for building rich Internet applications
based upon the Java EE environment.
66 CDI (JSR-299), Weld and the future of Seam | Dan Allen
67. Seam 3: Key themes
● Portability
● Portable extensions run on any CDI implementation
● Modularity (i.e., Seam à la carte)
● Module per integration
● Individual module leads
● Independent release cycles
● “Stack” releases
● Strong tooling
● Java compiler
● JBoss Tools
67 CDI (JSR-299), Weld and the future of Seam | Dan Allen
68. Seam's new modular ecosystem
68 CDI (JSR-299), Weld and the future of Seam | Dan Allen
69. What's on the menu so far?
● Drools ● JavaScript Remoting
● JMS ● Security
● Faces ● Servlet
● International ● Wicket
● Persistence ● XML configuration
...and more
http://sfwk.org/Seam3
69 CDI (JSR-299), Weld and the future of Seam | Dan Allen
70. XML-based configuration
<beans ...
xmlns:app="java:urn:com.acme">
<app:TranslatingWelcome>
<app:Translating/>
<app:defaultLocale>en-US</app:defaultLocale>
</app:TranslatingWelcome>
</beans>
● Define, specialize or override beans
● Add annotations (qualifiers, interceptor bindings, ...)
● Assign initial property values
70 CDI (JSR-299), Weld and the future of Seam | Dan Allen
71. End-to-end testing for Java EE
● SeamTest replacement
● ShrinkWrap
● Fluent API for creating Java archives
JavaArchive archive =
ShrinkWrap.create("archive.jar", JavaArchive.class)
.addClasses(MyClass.class, MyOtherClass.class)
.addResource("mystuff.properties");
● Arquillian
● Integration test harness
● Pluggable container support (embedded or remote)
● Supports injection into test class
● Tests can be run from IDE or build script
71 CDI (JSR-299), Weld and the future of Seam | Dan Allen
72. 72 CDI (JSR-299), Weld and the future of Seam | Dan Allen
73. Summary
● JSR-299 provides a set of services for Java EE
● Bridges JSF and EJB
● Offers loose coupling with strong typing
● Catalyzed managed bean & interceptor specifications
● Extensive SPI for third-party integration with Java EE
● Weld: JSR-299 Reference Implementation
● Seam 3: Portable extensions for Java EE
73 CDI (JSR-299), Weld and the future of Seam | Dan Allen
74. How do I get started with CDI or Java EE 6?
● Seam 3 project
http://seamframework.org/Seam3
● Weld Maven archetypes for CDI and Java EE
http://tinyurl.com/goweld
● Weld reference guide
http://tinyurl.com/weld-reference-101
● CDI JavaDoc
http://docs.jboss.org/cdi/api/latest/
● Any Java EE 6 container!
74 CDI (JSR-299), Weld and the future of Seam | Dan Allen