JavaFX Dependency Injection With FxContainer
JavaFX Dependency Injection With FxContainer
Injection with
FxContainer
Presented by
Srikanth Shenoy
ObjectSource
Learn FxContainer in 10 minutes
Introduction
Who am I?
A hands-on architect
Experienced and very knowledgeable in Java and
Java EE
Authored a book on Struts
Several articles on Java EE for leading journals
Director of Enterprise Java Practice at
ObjectSource
Creator of FxObjects and FxContainer framework
Introduction
What is FxContainer? (Currently 1.0)
Open source IoC container written in JavaFX.
Meant specifically for Dependency Injection in
JavaFX applications
Very much Spring-like
Small footprint (< 75K)
Sequence, Collection Support
Mix Java and JavaFX wiring
Learn FxContainer in 20 slides! (10 minutes)
IoC Container Landscape
Spring
Supports XML and Annotations based DI
Supports Constructor & Setter Injection
Guice
Supports Annotations and API based DI
Supports Constructor & Setter Injection
PicoContainer and many more..
Why another IoC Container?
Problems with existing IoC Containers (in the
context of JavaFX)
JavaFX does not support annotations
Hence Guice leaves only programmatic DI option
Xml DI with Spring works, but minimal jars > 1 MB
Constructor Injection not supported in JavaFX
Setter Injection is unnatural for JavaFX style
JavaFX variables are written as public or public-init
Writing setXYZ() method for variables feels artificial
Nobody supports Sequence (the first class
JavaFX collection citizen)
Setter Injection
var finder = MovieFinder {
movieDao: MovieDao { }
}
So we created it
FxContainer is the ONLY IoC container that
provides Init Injection for JavaFX
FxContainer Core Concept
Based on JavaFX Reflection and Init Injection
FXLocal.Context ctx = FXLocal.getContext();
objValue.initVar(varMember, varValue);
objValue.initialize(); //Finally initialize the object
FxContainer Overview
Uses Setter Injection for Java objects
Uses Init Injection for JavaFX objects
Can mix both Java and JavaFX objects
Java objects can hold references to JavaFX
objects via interfaces
Very Spring Like in configuration
Powerful, Lightweight and Easy to use
FxContainer: Simple
Dependency Injection
<fxcontainer>
<fxobject name="movieFinder"
class="org.fxobjects.samples.fxcontainer.MovieFinderImpl">
<property name="someVar" value="Some random value"/>
<property name="javaHelper" ref="javaHelperObj"/>
<property name="jfxHelper" ref="jfxHelperVarObj"/>
</fxobject>
<fxobject name="movieLister"
class="org.fxobjects.samples.fxcontainer.MovieLister">
<property name="finder" ref="movieFinder"/>
</fxobject>
</fxcontainer>
FxContainer: Import XML
Good for organizing large XML into smaller
logical chunks
<fxcontainer>
<import resource="/org/fxobjects/samples/abc.xml"/>
<fxobject name="movieFinder"
class="org.fxobjects.samples.fxcontainer.MovieFinderImpl">
<property name="someVar" value="Some random value"/>
<property name="javaHelper" ref="javaHelperObj"/>
<property name="jfxHelper" ref="jfxHelperVarObj"/>
</fxobject>
</fxcontainer>
FxContainer: Import Properties
Good for Spring style ${ } substitutions
<fxcontainer>
<import resource="/org/fxobjects/samples/abc.properties"/>
<fxobject name="movieFinder"
class="org.fxobjects.samples.fxcontainer.MovieFinderImpl">
<property name="someVar" value=“${svr1Name} is ${svr1Status}"/>
<property name="javaHelper" ref=“${helperObj}"/>
<property name="jfxHelper" ref="jfxHelperVarObj"/>
</fxobject>
</fxcontainer>