flex's di container

70
Flex3勉強会第73回@北陸 20090704 Flex’s DI Container DI Container徹底⽐較〜 yone098

Upload: masaaki-yonebayashi

Post on 05-Dec-2014

4.048 views

Category:

Documents


7 download

DESCRIPTION

FxUG@富山勉強会

TRANSCRIPT

Page 1: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

Flex’s DI Container〜DI Container徹底⽐較〜

yone098

Page 2: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

⾃⼰紹介名前⽶林 正明(よねばやし まさあき)

IDyone098

所属T2 Project http://t2framework.org/株式会社Abby 代表取締役社⻑

http://www.abby.co.jp

Page 3: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

⾃⼰紹介出⾝富⼭県富⼭市

宣伝絶賛社員募集中(恵⽐寿勤務)株式会社ヌーラボでも社員募集中

Page 4: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

⾃⼰紹介Flex歴Secret

OSST2 Project(ver0.6 AMF)Seasar2, Teeda, S2JSF

まとめI ❤ Toyama

Page 5: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

Agenda

What is DI Container?Flex’s DI ContainerPranaFramework

SpringActionScript

SmartyPants IOCswizframework

Summary

Page 6: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

What is DI Container?

Page 7: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

What’s DI Container?

DI ContainerDependency Injection依存性の注⼊

Component管理newしない

⼤きな連想配列HashMapのお化けをイメージ

Page 8: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

What’s DI Container?

Java DI ContainerSeasar2

http://www.seasar.org/

Springhttp://www.springsource.org/

Guicehttp://code.google.com/p/google‐guice/

Page 9: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

Flex’s DI Container

Page 10: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

Flex’s DI Container

Flex’s DI ContainerPranaFramework

http://www.pranaframework.org/

SmartyPants IOChttp://code.google.com/p/smartypants‐ioc/

swizframeworkhttp://code.google.com/p/swizframework/

Japanese container(coming soon)

Page 11: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

Flex’s DI Container

inspired

Flex DI Container Java DI Container

PranaFramework SpringSmartyPants IOC Guiceswizframework Spring

Page 12: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

Flex’s DI Container

LicenseFlex DI Container LicensePranaFramework ASL2.0SmartyPants IOC New BSD Licenseswizframework ASL2.0

Page 13: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

Prana FrameworkSpringActionscript

Page 14: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SpringActionscript

Prana Framework現在は,SpringExtensionsProject傘下

http://www.springsource.org/extensions/se‐springactionscript‐as

SpringをinspireCairngorm, PureMVC拡張⽤のMVCS architectureのUtility classを含む

Model‐View‐Controller‐Service

AOP Support(future)

Page 15: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

breakCairngorm

Page 16: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

Cairngorm

Cairngorm(けあんごーむ)Flex⽤clientサイドフレームワーク

http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm

View (mxmlからイベンドドリブンでViewHelperメソッドをコール)ViewHelper (VOを作成し開発者が定義するイベントを発生させる)ValueObject (画面入力値保持オブジェクト)Controller (イベント処理の受け口)Command (execute/onResult/onFaultを実装)ModelLocator (画面表示用のモデルを保持)BusinessDelegate (RemoteObject/HTTPService/WebService)Services (サービスの一元管理)

Page 17: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

breakPureMVC

Page 18: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

PureMVC

PureMVCFlex⽤clientサイドフレームワーク

http://puremvc.org

Cairngormの⽋点を⾒直して作られたMVCモデルModel

Proxyクラス/ValueObjectクラスView

MXML/MediatorクラスController

Façadeクラス/Commandクラス

Page 19: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

backSpringActionscript

Page 20: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SpringActionscript

buildtrunk co

https://src.springframework.org/svn/se‐springactionscript‐as/spring‐actionscript/trunk

mvn install(maven2 installed)MAVEN_OPTS=‐Xmx1024mpom.xmlの修正

<dependency><groupId>com.adobe.flexunit</groupId><artifactId>flexunit</artifactId><version>0.90</version><!‐‐0.9はリポジトリには存在しない‐‐><type>swc</type>

</dependency>

Page 21: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SpringActionscript

dependency依存ライブラリを追加Dependency library

as3commons‐lang.swc download

download

download

download

mvn installで生成

as3commons‐logging.swc

as3commons‐reflect.swc

flexunit.swc

Spring‐actionscript.swc

Page 22: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

build okSpringActionscript

Page 23: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

breakFlex with maven2

Page 24: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

flex with maven2

flexmojosFlex maven2 project

http://blog.flex‐mojos.info/

<repository><id>flex‐mojos‐repository</id><url>http://repository.sonatype.org/content/groups/flexgroup</url><releases><enabled>true</enabled>

</releases><snapshots><enabled>false</enabled>

</snapshots></repository>

Page 25: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

flex with maven2

AS3Commons Projecthttp://www.as3commons.org/

AS3Commons Reflectreflection API for ActionScript3.0Flash/Flex/AIR

http://www.as3commons.org/as3‐commons‐logging/

AS3Commons Loggingreflection API for ActionScript3.0

http://www.as3commons.org/as3‐commons‐reflect/

Page 26: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

flex with maven2

AS3Commons Reflect Dependencies

GroupId ArtifactId type

Flex‐framework pom

swc

swc

swc

flexunit

as3commons‐logging

Flexmojos‐unittest‐support

com.adobe.flex.framework

com.adobe.flex.unit

org.as3commons

org.sonatype.flexmojos

Page 27: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

backSpringActionscript

Page 28: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SpringActionscript

Getting StartedSimple example

Step1

Page 29: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SpringActionscript

applicationContext.xmlRegist component

<?xml version="1.0"?><objects xmlns="http://www.pranaframework.org/objects"

xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance"xsi:schemaLocation="http://www.pranaframework.org/objects

http://www.pranaframework.org/schema/objects/prana‐objects‐0.6.xsd"><object id="singletonBean"class="yone098.samples.SingletonClass" scope="singleton" />

<object id="prototypeBean“class="yone098.samples.PrototypeClass" scope="prototype" />

<object id="calc" class="yone098.samples.CalcAdd" /></objects>

Page 30: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SpringActionscript

scopeprototype

getObject毎にinstance⽣成objectタグで指定<object scope=“prototype” …

singleton(default)何度getObjectしても同じinstanceobjectタグで指定<object scope=“singleton” …

Page 31: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SpringActionscript

Getting StartedSimple example

Step2

Page 32: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SpringActionscript

load config and lookup dependencyprivate var _appContext:XMLApplicationContext;private function onCreationComplete():void{

_appContext= new XMLApplicationContext("applicationContext.xml");_appContext.addEventListener(Event.COMPLETE, 

onApplicationContextComplete); // listen complete_appContext.load(); // load

}private function onApplicationContextComplete(event:Event):void{

var bean1:SingletonClass = _appContext.getObject("singletonBean");var bean2:SingletonClass = _appContext.getObject("singletonBean");

}

Page 33: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SpringActionscript

applicationContext.xml<object><property><ref><constructor‐arg><arg><method‐invocation><param>

Page 34: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SpringActionscript

Tips1applicationContext.xmlにBeanを定義しただけではswfにclass情報は埋め込まれない為に,明⽰的にclassを宣⾔するか,cssにclass情報を設定しないと実⾏時にエラー。特にinterfaceでgetObjectする際は注意

// 明⽰的に実装クラスを宣⾔しておくprivate var _includeClasses:Array = [CalcAdd, CalcMinus];

Page 35: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SpringActionscript

Tips2明⽰的に宣⾔すると設定ファイルのみ書き換えて実装classの切り替えが出来ない><新しい実装クラスの度にコンパイル

CSSを利⽤するClassReference

/** bean情報をcssに */.prana {bean1:ClassReference("yone098.samples.CalcAdd");bean2:ClassReference("yone098.samples.CalcMinus");

}

Page 36: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SpringActionscript

Tips3同⼀idでBeanを登録した場合,後の登録が有効登録してもエラーにはならない

<object id="calc" class="yone098.samples.CalcMinus" /><object id="calc" class="yone098.samples.CalcAdd" />

// id=calcをgetObjectするとCalcAddvar calc:ICalc = _appContext.getObject("calc");

main.mxml

applicationContext.xml

Page 37: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SpringActionscript

demo

with remoteObject AMFsample

Page 38: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SmartyPanth IOC

Page 39: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SmartyPants IOC

SmartyPants IOCgoogleCodeで開発

http://code.google.com/p/smartypants‐ioc/

Guiceをinspire⽇本語では嫌味なやーつ

依存ライブラリ無し設定ファイル無しAOP Support無し

Page 40: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SmartyPants IOC

dependency依存ライブラリ無し

library

SmartyPantsIOC.swc サイトからdownload

使⽤したいprojectのライブラリに追加するだけ

Page 41: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

build okSmartyPants IOC

SmartyPants IOC

Page 42: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SmartyPants IOC

Getting StartedSimple example

Step1

Page 43: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SmartyPants IOC

create Injector & lookup dependencyprivate var _injector:Injector;private function onCreationComplete():void{

// setup injector_injector = SmartyPants.getOrCreateInjectorFor(this);

}private function sample():void{

var bean1:SingletonClass = _injector.newRequest(this).forClass(SingletonClass).getInstance();

var bean2:SingletonClass = _injector.newRequest(this).forClass(SingletonClass).getInstance();

}

Page 44: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SmartyPants IOC

inject[Inject]メタデータタグで指定

Guiceの@Inject

GuiceのModule=getInjectorに渡すinstace

[Inject]public class InjectTest

Page 45: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SmartyPants IOC

Class BindingnewRule().whenAskedFor

useClassnamed(“xx”).useClassuseSingletonOf

// interfaceの実装をCalcAddに_injector.newRule().whenAskedFor(ICalc).useClass(CalcAdd);

// “calc”という名前でBinding_injector.newRule().whenAskedFor(ICalc).named("calc").useClass(CalcAdd);

// singleton_injector.newRule().whenAskedFor(ICalc).useSingletonOf(CalcAdd);

Page 46: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SmartyPants IOC

Class Binding Tips1namedでclass bindingしたinterfaceは, getInstanceの際にbindしたnamed指定で取得しないとエラー。

// namedで”foo”指定でbind_injector.newRule().whenAskedFor(ICalc).named("foo").useClass(CalcAdd);// bindした名前と異なるのでエラーvar calc:ICalc = _injector.newRequest(this).forClass(ICalc).named(“abc").getInstance();// 名前を指定しないとエラーvar calc:ICalc = _injector.newRequest(this).forClass(ICalc).getInstance();// 正しくgetInstance可能_injector.newRequest(this).forClass(ICalc).named("foo").getInstance();

Page 47: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SmartyPants IOC

Class Binding Tips2同⼀interfaceで複数実装classを登録した場合,後の登録が有効登録してもエラーにはならない

// 同⼀interfaceでnamed指定無しで複数登録_injector.newRule().whenAskedFor(ICalc).useClass(CalcAdd);_injector.newRule().whenAskedFor(ICalc).useClass(CalcMinus);

// getInstance => CalcMinusvar calc:ICalc =

_injector.newRequest(this).forClass(ICalc).getInstance();

Page 48: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SmartyPants IOC

Provider BindinguseProvider

Rule BindinguseRuleFor(interface, “named”)

Live rules[Bindable]メタデータタグuseBindableProperty(obj,“propertyName”)

Page 49: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SmartyPants IOC

scopeprototype(default)

getInstance毎にinstance⽣成singleton何度getInstanceしても同じinstance[Singleton]メタデータタグで指定

[Singleton]public class SingletonClass

Page 50: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SmartyPants IOC

IssueConstructor injectionは未実装

My IssueProviderRule Binding

Page 51: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

SmartyPants IOC

demo

with remoteObject AMFsample

Page 52: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

swizframework

Page 53: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

swizframework

swizframeworkgoogleCodeで開発

http://code.google.com/p/swizframework/

Springをinspire(Autowire)Flex4対応依存ライブラリ無し設定ファイルはmxmlAOP Support無し

Page 54: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

swizframework

buildtrunk/branches 0.6.2

Flex4が必須branches 0.6.1 co

mvn install(maven2 installed)特に問題なくbuild可能

Page 55: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

swizframework

dependency依存ライブラリ無しlibrary

swiz‐0.6.1.swc mvn installで⽣成サイトからdownloadswiz‐0.6.2.swc

使⽤したいprojectのライブラリに追加するだけソースを修正したい場合は、mvnで構築しても良い

Page 56: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

build okswizframework

swizframework

Page 57: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

swizframework

Getting StartedSimple example

Step1

Page 58: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

Beans.xmlRegist component

<?xml version="1.0" encoding="utf‐8"?><BeanLoader xmlns:component="yone098.samples.*"

xmlns:mx="http://www.adobe.com/2006/mxml"><component:Sample1 id="sample1"/><component:Sample2 id="sample2"/>

</BeanLoader>

swizframework

Page 59: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

scopeprototype

getBean毎にinstance⽣成factory:Prototypeのsingleton属性で指定<factory:Prototype singleton=“false” class=“…

singleton(default)何度getBeanしても同じinstance何も指定しない(default)factory:Prototypeのsingleton属性で指定<factory:Prototype singleton=“true” class=“…

swizframework

Page 60: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

Getting StartedSimple example

swizframework

Step2

Page 61: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

load config and lookup dependencyprivate function sample():void{

// load configSwiz.loadBeans([Beans]);

// getBeanvar bean1:Sample1 = 

Swiz.getBean("sample1") as Sample1;}

swizframework

Page 62: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

inject[Autowire]メタデータタグで指定同⼀interfaceで複数登録時は,id指定

[Autowire]public class InjectTest

[Autowire(bean=“calcAdd”)]public var _calc:ICalc;

swizframework

Page 63: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

My IssueSwiz ControllerEvent Handling with CentralDispatcherDynamicMediators

swizframework

Page 64: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

demo

with remoteObject AMFsample

swizframework

Page 65: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

Summary

Page 66: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

get instance

configration

summary

DI Container getInstance

SpringActionscript getObject(cast無し)

SmartyPants IOC getInstance(cast無し)

getBean(cast必要)swizframework

DI Container configration

SpringActionscript applicationContext.xml(任意)

SmartyPants IOC 無しmxmlswizframework

Page 67: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

Default scope

Constructor injection

summary

DI Container Default scope

SpringActionscript singleton

SmartyPants IOC prototype

singletonswizframework

DI Container Constructor injection

SpringActionscript constructor‐arg

SmartyPants IOC future

無しswizframework

Page 68: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

Summary俳句

Page 69: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

⼀句

富⼭県ホームな感じが好きやちゃあ❤

Page 70: Flex's DI Container

Flex3勉強会第73回@北陸 2009‐07‐04

謝辞

御清聴ありがとうございました