You are on page 1of 21

JavaFX Dependency Injection with FxContainer

Presented by Srikanth Shenoy ObjectSource Learn FxContainer in 10 minutes


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

0)       Open source IoC container written in JavaFX. Collection Support Mix Java and JavaFX wiring  Learn FxContainer in 20 slides! (10 minutes) .Introduction  What is FxContainer? (Currently 1. Meant specifically for Dependency Injection in JavaFX applications Very much Spring-like Small footprint (< 75K) Sequence.

. .IoC Container Landscape  Spring   Supports XML and Annotations based DI Supports Constructor & Setter Injection Supports Annotations and API based DI Supports Constructor & Setter Injection  Guice    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 { } }  Dependency Injection with any other IoC container needs a setter like this (Not Good) public class MovieFinder { public-init movieDao:MovieDao. public function setMovieDao(dao:MovieDao) { this.movieDao = dao.

create()     Called automatically in every UI Called immediately after init and post init No time to call setter methods If create() depends on objects injected by setter injection.Side effects of Setter Injection   Init and Post-Init code that depends on public-init variables will not work Classic Example – CustomNode. then it will fail !! .

A Different Kind of Injection Constructor Injection is DURING memory allocation  Setter Injection is AFTER memory allocation and object initialization  JavaFX needs something in between the two  We call it Init injection  A DI based on Init Injection does not exist  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.MovieFinder"). //Finally initialize the object .getVariable("movieDao"). FXObjectValue objValue = clzType. //initialize the variable. varValue).fxobjects. //allocate memory //get the variable-type FXVarMember varMember = clzType.getContext().initVar(varMember. Basis for FxContainer Init Injection objValue.allocate().initialize().Context ctx = FXLocal. //get the class FXClassType clzType = ctx. //create the variable-value FXValue varValue = ctx. objValue.mirrorOf(Some String or object).findClass("org.

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 .

samples.samples.fxcontainer.fxobjects.fxobjects.FxContainer: Simple Dependency Injection <fxcontainer> <fxobject name="movieFinder" class="org.fxcontainer.MovieLister"> <property name="finder" ref="movieFinder"/> </fxobject> </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.

MovieFinderImpl"> <property name="someVar" value="Some random value"/> <property name="javaHelper" ref="javaHelperObj"/> <property name="jfxHelper" ref="jfxHelperVarObj"/> </fxobject> </fxcontainer> .xml"/> <fxobject name="movieFinder" class="org.samples.FxContainer: Import XML  Good for organizing large XML into smaller logical chunks <fxcontainer> <import resource="/org/fxobjects/samples/abc.fxobjects.fxcontainer.

properties"/> <fxobject name="movieFinder" class="org.fxcontainer.samples.MovieFinderImpl"> <property name="someVar" value=“${svr1Name} is ${svr1Status}"/> <property name="javaHelper" ref=“${helperObj}"/> <property name="jfxHelper" ref="jfxHelperVarObj"/> </fxobject> </fxcontainer>  value and ref can be substituted .FxContainer: Import Properties  Good for Spring style ${ } substitutions <fxcontainer> <import resource="/org/fxobjects/samples/abc.fxobjects.

fxcontainer.e on demand) There is no order of initialization (Although load order can be specified for eagerly loaded objects) Init-method is called after all properties are injected <fxcontainer> <fxobject name="movieFinder" class="org.fxobjects.MovieFinderImpl“ lazyinit=“false” load-order=“1” init-method=“someMethod”> .FxContainer: Wired Object Attributes  Wired Objects in FxContainer have the following defaults (can be overridden)     Every wired object is singleton Every wired object is lazily initialized (i. </fxobject> </fxcontainer> .samples..

MovieFinderImpl"> <property name="movieCodes">  Primitive Sequence <sequence> <entry value=“1" /> <entry value="2" /> </sequence> </property> <property name="movies">  Object Sequence <sequence> <entry ref="movie1"/> <entry ref="movie2"/> </sequence> </property> </fxobject> </fxcontainer> .samples.FxContainer: Sequences <fxcontainer> <fxobject name="movieFinder" class="org.fxcontainer.fxobjects.

samples.MovieFinderImpl"> <property name="movieList">  Object LIST <list> (or <set>) <entry ref="movie1"/> <entry ref="movie2"/> </list> </property> <property name="movieCodes">  Primitive LIST <list valueClass=“java.fxobjects.fxcontainer.Integer”> <entry value=“1" /> <entry value="2" /> </list> </property> </fxobject> </fxcontainer> .lang.FxContainer: Lists and Sets <fxcontainer> <fxobject name="movieFinder" class="org.

. BigDecimal etc.FxObjects Lists and Sets (Contd.)   Lists and Sets have to be initialized in their parents with a new …. Needed for Java and JavaFX objects when   value attribute is specified in xml AND List is not parameterized (always the case in JavaFX) .(). String. valueClass attribute    Optional in most cases Reason: One cannot tell from the xml value attributed if a list is Integer.

(since they cannot be parameterized) and .String” valueClass=“java.samples.FxContainer: Maps <fxcontainer> <fxobject name="movieFinder" class="org.lang.Integer”> <entry key=“Terminator 1” value=“1" /> <entry value=“Terminator 2" /> </map> </property> </fxobject> </fxcontainer> keyClass and valueClass are needed for Maps in JavaFX with key and value specified.fxcontainer.MovieFinderImpl"> <property name="movieMap">  Object MAP <map> <entry keyRef=“stage1” valueRef="movie1"/> </map> </property> <property name="movieCodes">  Primitive MAP <map keyClass=“java.lang.fxobjects.

jar and fxobjects-util. var mvLister:MovieLister = container.getFxObject("movieLister") as MovieLister.xml“ } var container:FxContainer = loader.FxContainer: Startup  Spring Like var loader = ClasspathXmlContainerLoader { resourceLocation: "/org/fxobjects/samples/my.jar in classpath .load().   FxContainer can be used the IoC container with FxObjects or any other JavaFX application independently Just include 2 jars – fxcontainer.

FxObjects & FxContainer: Roadmap .

extend. redistribute.    Download. FxContainer is a subproject of FxObjects Not a single person open source project  FxObjects and FxContainer developed and supported by ObjectSource (    Project site – https://fxobjects/dev. concerns. comments Contribute code .objectsource. OEM Discussion Forums on project site Participation welcome   Post ideas.