flex's di container
DESCRIPTION
FxUG@富山勉強会TRANSCRIPT
Flex3勉強会第73回@北陸 2009‐07‐04
Flex’s DI Container〜DI Container徹底⽐較〜
yone098
Flex3勉強会第73回@北陸 2009‐07‐04
⾃⼰紹介名前⽶林 正明(よねばやし まさあき)
IDyone098
所属T2 Project http://t2framework.org/株式会社Abby 代表取締役社⻑
http://www.abby.co.jp
Flex3勉強会第73回@北陸 2009‐07‐04
⾃⼰紹介出⾝富⼭県富⼭市
宣伝絶賛社員募集中(恵⽐寿勤務)株式会社ヌーラボでも社員募集中
Flex3勉強会第73回@北陸 2009‐07‐04
⾃⼰紹介Flex歴Secret
OSST2 Project(ver0.6 AMF)Seasar2, Teeda, S2JSF
まとめI ❤ Toyama
Flex3勉強会第73回@北陸 2009‐07‐04
Agenda
What is DI Container?Flex’s DI ContainerPranaFramework
SpringActionScript
SmartyPants IOCswizframework
Summary
Flex3勉強会第73回@北陸 2009‐07‐04
What is DI Container?
Flex3勉強会第73回@北陸 2009‐07‐04
What’s DI Container?
DI ContainerDependency Injection依存性の注⼊
Component管理newしない
⼤きな連想配列HashMapのお化けをイメージ
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/
Flex3勉強会第73回@北陸 2009‐07‐04
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)
Flex3勉強会第73回@北陸 2009‐07‐04
Flex’s DI Container
inspired
Flex DI Container Java DI Container
PranaFramework SpringSmartyPants IOC Guiceswizframework Spring
Flex3勉強会第73回@北陸 2009‐07‐04
Flex’s DI Container
LicenseFlex DI Container LicensePranaFramework ASL2.0SmartyPants IOC New BSD Licenseswizframework ASL2.0
Flex3勉強会第73回@北陸 2009‐07‐04
Prana FrameworkSpringActionscript
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)
Flex3勉強会第73回@北陸 2009‐07‐04
breakCairngorm
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 (サービスの一元管理)
Flex3勉強会第73回@北陸 2009‐07‐04
breakPureMVC
Flex3勉強会第73回@北陸 2009‐07‐04
PureMVC
PureMVCFlex⽤clientサイドフレームワーク
http://puremvc.org
Cairngormの⽋点を⾒直して作られたMVCモデルModel
Proxyクラス/ValueObjectクラスView
MXML/MediatorクラスController
Façadeクラス/Commandクラス
Flex3勉強会第73回@北陸 2009‐07‐04
backSpringActionscript
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>
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
Flex3勉強会第73回@北陸 2009‐07‐04
build okSpringActionscript
Flex3勉強会第73回@北陸 2009‐07‐04
breakFlex with maven2
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>
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/
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
Flex3勉強会第73回@北陸 2009‐07‐04
backSpringActionscript
Flex3勉強会第73回@北陸 2009‐07‐04
SpringActionscript
Getting StartedSimple example
Step1
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>
Flex3勉強会第73回@北陸 2009‐07‐04
SpringActionscript
scopeprototype
getObject毎にinstance⽣成objectタグで指定<object scope=“prototype” …
singleton(default)何度getObjectしても同じinstanceobjectタグで指定<object scope=“singleton” …
Flex3勉強会第73回@北陸 2009‐07‐04
SpringActionscript
Getting StartedSimple example
Step2
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");
}
Flex3勉強会第73回@北陸 2009‐07‐04
SpringActionscript
applicationContext.xml<object><property><ref><constructor‐arg><arg><method‐invocation><param>
Flex3勉強会第73回@北陸 2009‐07‐04
SpringActionscript
Tips1applicationContext.xmlにBeanを定義しただけではswfにclass情報は埋め込まれない為に,明⽰的にclassを宣⾔するか,cssにclass情報を設定しないと実⾏時にエラー。特にinterfaceでgetObjectする際は注意
// 明⽰的に実装クラスを宣⾔しておくprivate var _includeClasses:Array = [CalcAdd, CalcMinus];
Flex3勉強会第73回@北陸 2009‐07‐04
SpringActionscript
Tips2明⽰的に宣⾔すると設定ファイルのみ書き換えて実装classの切り替えが出来ない><新しい実装クラスの度にコンパイル
CSSを利⽤するClassReference
/** bean情報をcssに */.prana {bean1:ClassReference("yone098.samples.CalcAdd");bean2:ClassReference("yone098.samples.CalcMinus");
}
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
Flex3勉強会第73回@北陸 2009‐07‐04
SpringActionscript
demo
with remoteObject AMFsample
Flex3勉強会第73回@北陸 2009‐07‐04
SmartyPanth IOC
Flex3勉強会第73回@北陸 2009‐07‐04
SmartyPants IOC
SmartyPants IOCgoogleCodeで開発
http://code.google.com/p/smartypants‐ioc/
Guiceをinspire⽇本語では嫌味なやーつ
依存ライブラリ無し設定ファイル無しAOP Support無し
Flex3勉強会第73回@北陸 2009‐07‐04
SmartyPants IOC
dependency依存ライブラリ無し
library
SmartyPantsIOC.swc サイトからdownload
使⽤したいprojectのライブラリに追加するだけ
Flex3勉強会第73回@北陸 2009‐07‐04
build okSmartyPants IOC
SmartyPants IOC
Flex3勉強会第73回@北陸 2009‐07‐04
SmartyPants IOC
Getting StartedSimple example
Step1
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();
}
Flex3勉強会第73回@北陸 2009‐07‐04
SmartyPants IOC
inject[Inject]メタデータタグで指定
Guiceの@Inject
GuiceのModule=getInjectorに渡すinstace
[Inject]public class InjectTest
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);
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();
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();
Flex3勉強会第73回@北陸 2009‐07‐04
SmartyPants IOC
Provider BindinguseProvider
Rule BindinguseRuleFor(interface, “named”)
Live rules[Bindable]メタデータタグuseBindableProperty(obj,“propertyName”)
Flex3勉強会第73回@北陸 2009‐07‐04
SmartyPants IOC
scopeprototype(default)
getInstance毎にinstance⽣成singleton何度getInstanceしても同じinstance[Singleton]メタデータタグで指定
[Singleton]public class SingletonClass
Flex3勉強会第73回@北陸 2009‐07‐04
SmartyPants IOC
IssueConstructor injectionは未実装
My IssueProviderRule Binding
Flex3勉強会第73回@北陸 2009‐07‐04
SmartyPants IOC
demo
with remoteObject AMFsample
Flex3勉強会第73回@北陸 2009‐07‐04
swizframework
Flex3勉強会第73回@北陸 2009‐07‐04
swizframework
swizframeworkgoogleCodeで開発
http://code.google.com/p/swizframework/
Springをinspire(Autowire)Flex4対応依存ライブラリ無し設定ファイルはmxmlAOP Support無し
Flex3勉強会第73回@北陸 2009‐07‐04
swizframework
buildtrunk/branches 0.6.2
Flex4が必須branches 0.6.1 co
mvn install(maven2 installed)特に問題なくbuild可能
Flex3勉強会第73回@北陸 2009‐07‐04
swizframework
dependency依存ライブラリ無しlibrary
swiz‐0.6.1.swc mvn installで⽣成サイトからdownloadswiz‐0.6.2.swc
使⽤したいprojectのライブラリに追加するだけソースを修正したい場合は、mvnで構築しても良い
Flex3勉強会第73回@北陸 2009‐07‐04
build okswizframework
swizframework
Flex3勉強会第73回@北陸 2009‐07‐04
swizframework
Getting StartedSimple example
Step1
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
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
Flex3勉強会第73回@北陸 2009‐07‐04
Getting StartedSimple example
swizframework
Step2
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
Flex3勉強会第73回@北陸 2009‐07‐04
inject[Autowire]メタデータタグで指定同⼀interfaceで複数登録時は,id指定
[Autowire]public class InjectTest
[Autowire(bean=“calcAdd”)]public var _calc:ICalc;
swizframework
Flex3勉強会第73回@北陸 2009‐07‐04
My IssueSwiz ControllerEvent Handling with CentralDispatcherDynamicMediators
swizframework
Flex3勉強会第73回@北陸 2009‐07‐04
demo
with remoteObject AMFsample
swizframework
Flex3勉強会第73回@北陸 2009‐07‐04
Summary
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
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
Flex3勉強会第73回@北陸 2009‐07‐04
Summary俳句
Flex3勉強会第73回@北陸 2009‐07‐04
⼀句
富⼭県ホームな感じが好きやちゃあ❤
Flex3勉強会第73回@北陸 2009‐07‐04
謝辞
御清聴ありがとうございました