nanocontainer - paul hammant · ioc framework) years before dependency injection was coined. he’s...

42
NanoContainer Scripted Dependency Injection by Paul Hammant Aslak Hellesoy, one of its lead developers.

Upload: others

Post on 22-Sep-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

NanoContainerScripted Dependency Injection

by Paul Hammant Aslak Hellesoy, one of its lead developers.

Page 2: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

• Paul has was active with Avalon (the first IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years.

• Aslak is famous for XDoclet, Middlegen, Damage Control, QDox and eXtreme ideas like Ashcroft.

The Presenter(s)

Page 3: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Quick facts and givens• We started

PicoContainer and NanoContainer in 2003

• NanoContainer essentially extends PicoContainer (think russian dolls)

• We recommend Constructor Dependency Injection (CDI) over Setter (SDI)

• You should already know why singletons in large enterprise apps are bad

• You might also be tired of writing XML to anyone’s specification

• PicoContainer has no meta-data, NanoContainer is ‘open’ to multiple meta implementations

Page 4: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Firstly:IoC Crash Course

Containers control Components

Page 5: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Container Instantiated

Container

Page 6: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Phase 1: Registration

Container

Page 7: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Circle registered (needs Star)

Container

Page 8: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Star registered

Container

Page 9: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Circle and Star sourcepublic class Circle

public Circle(Star star) {

}

}

public class Star {

}

you cou

ld have

guessed

this

Page 10: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Phase 2: Instantiation

Container

Page 11: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Star instantiated

Container

Page 12: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Circle instantiated,referring to Star

Container

Page 13: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Container often disposed of

Page 14: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

IoC Crash Course

Container hierarchies:Scoping of dependencies

Page 15: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Registration

Parent Container

D

Child Container

Page 16: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Instantiation

Parent Container

Child Container

Page 17: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

All Done

Page 18: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

IoC Recap

• Containers instantiate registered components

• Component dependencies are satisfied by their container

• Components shouldn’t reference their containers

• Life-cycle (start/stop) and configuration are also controlled by the container

• Hierarchies blah blah

Page 19: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Introducing NanoContainer

via (simplified) code examples..

Page 20: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

PicoContainer - the only wayMutablePicoContainer pico

= new DefaultPicoContainer();

pico.register(Map.class,

HashMap.class);

pico.register(NeedsMap.class);

Object nm

= pico.getInstance(NeedsMap.class);

Page 21: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

NanoContainer - in codeNanoContainer nano

= new DefaultNanoContainer();

nano.register(“java.util.Map.class”,

“java.util.HashMap.class”);

nano.register(“my.NeedsMap.class”);

Object nm

= nano.getInstance(“my.NeedsMap.class”);

Page 22: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

XML NanoContainer

<container>

<component key=“java.util.Map”

class=“java.util.HashMap”/>

<component class= “my.NeedsMap”/>

</container>

Page 23: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Groovy NanoContainer

container {

component(key:“java.util.Map”,

class:“java.util.HashMap”)

component(class:“my.NeedsMap”)

}

Page 24: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Groovy is a language though

container {

component(key:java.util.Map,

class:java.util.HashMap)

component(class:my.NeedsMap)

}

* can re

ference

classes

in class

path

or class

loader...

Page 25: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Comps from diff classloaderscontainer {

classLoader {

classPathElement(path:“foo.jar”)

component(key:java.util.Map,

class:“FooMap”)

}

component(class:my.NeedsMap)

}

Page 26: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Permissions toocontainer { classLoader { classPathElement(path:“foo.jar”) { grant(new SocketPermission (“google.com:80”)) } component(class:“FooMap”) } component(class:my.NeedsMap)}

only if u

sing a

security

manager

Page 27: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Containers hierarchies

container { container { component(class:my.NeedsMap) } component(class:FooMap) component(class:CantRequireNeedsMap)}

Page 28: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Implementation hiding

container(class:ImplHidingContainer) { component(key:Map, class:FooMap) component( class:NeedsMapButCantCastToFooMap)}

Page 29: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

NanoContainer Recap

• Java, XML, Groovy

• un shown were JavaScript, Jython, Beanshell

• Implementation hiding

• Container Hierarchies

• Standalone or embedded (all markups/langs)

XML is like the

Groovy one,

but hurts your eyes

some more cos of

the <angle brackets/>

you can image the others..

.. they’re less declarative

Page 30: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

A different view of the classloader hierarchy...

Page 31: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

NanoContainer Booting

• NanoContainer-Boot started via a main method.

Java libraries

Boot

ClassLoaderparentage Creates

Page 32: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

NanoContainer Booting

• Boot creates a tree of two classloaders, ensures it is not part of that tree.

Java libraries

Boot

ClassLoaderparentage Creates

PicoContainer

NanoContainer, Groovy, ASM, Antlr

Page 33: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

NanoContainer Booting

• Boot hands control to NanoContainer, effectively taking itself out of the picture

Java libraries

ClassLoaderparentage Creates

PicoContainer

NanoContainer, Groovy, ASM, Antlr

Page 34: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

NanoContainer Booting

• NanoContainer (and Groovy etc) create more of the classloader hierarchy, keeping itself out of the resulting classloader tree

Java libraries

Boot

ClassLoaderparentage Creates

PicoContainer

NanoContainer, Groovy, ASM, Antlr

Comp1

Comp2 Comp3

Page 35: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

NanoContainer Booting

• From the point of view of the component, NanoContainer, Groovy (etc) and Boot are invisible

Java libraries

ClassLoaderparentage Creates

PicoContainer

Comp1

Comp2 Comp3

Page 36: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Related NanoContainer Components

• NanoWar - some bindings to web frameworks (Struts, Webwork plus ‘NanoWeb’ our own tiny one)

• Hibernate bindings ( 2 & 3 )

• Remoting, etc.Yup, all this

in

development

since 2003

Page 37: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

What Next?

Page 38: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

In-lined Web-appscontainer { component(BizBean) webContainer(host:“*”, port:80) { context(“foo/”) { servlet(“bar.xyz”, class:BarServletNeedsBizBean) } }}

No web.xml

obviously

Page 39: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Tieringtier(name:“persistence”) { exposedComponent(PersistenceFoo) component(FooSerializer) component(FooRepicator) tier(name:“biz”) { component(BizBeanUsingFoo) component(BizBean2) }}

Page 40: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Publishingpublication { soapPublisher(host:“*”, port:8080) container { component(my.ZipCodeServiceImpl) { publish(name:“zipCodeService”) } component(NeedsZipServices) }}

Page 41: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Subscriptionsubscription { soapSubscriber(host:“beatle”, port:8080) container { remoteComponent (key:my.ZipCodeServiceme, name:“zipCodeService”) component(AlsoNeedsZipServices) }}

Page 42: NanoContainer - Paul Hammant · IoC framework) years before Dependency Injection was coined. He’s written many (stupid) IoC OSS tools over six years. • Aslak is famous for XDoclet,

Spring vs Pico/Nano

• Could use Pico and Nano for some usages Spring is used for.

• Spring is more comprehensive for J2EE though (we’re chasing it).

• You can use Pico and Nano with Spring.

• Pico/Nano has an audience amongst specialist embedders.