Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
SpringはどうやってDIしているのか? #jjug_ccc
Search
kariyayo
December 03, 2016
Programming
3.6k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SpringはどうやってDIしているのか? #jjug_ccc
kariyayo
December 03, 2016
More Decks by kariyayo
See All by kariyayo
MobX の話
kariyayo
0
380
echoサーバーを書いてI/Oと仲良くなる話
kariyayo
3
880
Apexで複数環境のLambda関数をデプロイする話 #jawsug
kariyayo
1
2k
近況報告といろいろ作るのが楽しい話 #yokohama_north
kariyayo
0
910
目指せ3つ星インデックス #yokohama_north
kariyayo
2
880
Spring Boot と Swagger #渋谷java
kariyayo
4
5.8k
Gradleを使えるようになるために
kariyayo
0
110
Other Decks in Programming
See All in Programming
Built Our Own Background Agent at LayerX
layerx
PRO
9
5k
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
470
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
460
5分で問診!Composer セキュリティ健康診断
codmoninc
0
900
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
180
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
210
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
170
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
590
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
190
「人を評価する AI」の設計と実装
ryoyanara
0
180
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
600
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
140
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
234
19k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
230
Unsuck your backbone
ammeep
672
58k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
730
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Color Theory Basics | Prateek | Gurzu
gurzu
0
410
Navigating Team Friction
lara
192
16k
Writing Fast Ruby
sferik
630
63k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.7k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.4k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Transcript
4QSJOH Ͳ͏ͬͯ%*͍ͯ͠Δͷ͔ʁ ++6($$$GBMM CBUJ UXJUUFS!CBUJ@
4QSJOH$PSFͱ %*ίϯςφ
ຊࢿྉͰ༻͢Δ4QSJOU'SBNFXPSLͷόʔδϣϯͰ͢ 3
4QSJOH$PSF5FDIOPMPHJFT • 4QSJOH'SBNFXPSLͷυΩϡϝϯτΛݟͯΈΔ • ʮᶙ$PSF5FDIOPMPHJFTʯ 4
4QSJOH$PSF5FDIOPMPHJFT • 5IF*P$DPOUBJOFS • 3FTPVSDFT • 7BMJEBUJPO %BUB#JOEJOH BOE5ZQF$PODFSTJPO •
4QSJOH&YQSFTTJPO-BOHVBHF 4Q&- • "TQFDU0SJFOUFE1SPHSBNNJOHXJUI4QSJOH • 4QSJOH"01"1*T 5
4QSJOH$PSF5FDIOPMPHJFT • 5IF*P$DPOUBJOFS • 3FTPVSDFT • 7BMJEBUJPO %BUB#JOEJOH BOE5ZQF$PODFSTJPO •
4QSJOH&YQSFTTJPO-BOHVBHF 4Q&- • "TQFDU0SJFOUFE1SPHSBNNJOHXJUI4QSJOH • 4QSJOH"01"1*T 6 今日話すのはここ
4QSJOHͷ%* 7 @Configuration @ComponentScan public class MyApp { public static
void main(String[] args) { ApplicationContext c = new AnnotationConfigApplicationContext(MyApp.class); HelloWorldService helloWorldService = c.getBean(HelloWorldService.class); helloWorldService.helloWorld(); } }
@Configuration @ComponentScan public class MyApp { public static void main(String[]
args) { ApplicationContext c = new AnnotationConfigApplicationContext(MyApp.class); HelloWorldService helloWorldService = c.getBean(HelloWorldService.class); helloWorldService.helloWorld(); } } 4QSJOHͷ%* 8 @Configurationアノテーションがついてるクラス がBeanの設定を行うクラス (Bean = Springの管理対象となるインスタンス)
@Configuration @ComponentScan public class MyApp { public static void main(String[]
args) { ApplicationContext c = new AnnotationConfigApplicationContext(MyApp.class); HelloWorldService helloWorldService = c.getBean(HelloWorldService.class); helloWorldService.helloWorld(); } } 4QSJOHͷ%* 9 @ComponentScanアノテーションをつ けると、同パッケージ配下からBean 定義を探してくれる
10 @Component public class PrintService { public void print(String s)
{ System.out.println(s); } } @Component public class HelloWorldService { private PrintService printService; @AutoWired public HelloWorldService(PrintService printService) { this.printService = printService; } public void helloWorld() { printService.print("Hello, World!"); } }
11 @Component public class PrintService { public void print(String s)
{ System.out.println(s); } } @Component public class HelloWorldService { private PrintService printService; @AutoWired public HelloWorldService(PrintService printService) { this.printService = printService; } public void helloWorld() { printService.print("Hello, World!"); } } @Componentアノテーションがついて るとスキャンの対象となるBean定義 @Controllerや@Serviceなども同じ
12 @Component public class PrintService { public void print(String s)
{ System.out.println(s); } } @Component public class HelloWorldService { private PrintService printService; @AutoWired public HelloWorldService(PrintService printService) { this.printService = printService; } public void helloWorld() { printService.print("Hello, World!"); } } @AutoWireアノテーションをつけると BeanをDIしてくれる
4QSJOHͷίʔυΛಡΜͰΈͨ
14 • ͖ͬ͞ͷίʔυΛಡΜͰ͍͘ MyApp#main @Configuration @ComponentScan public class MyApp {
public static void main(String[] args) { ApplicationContext c = new AnnotationConfigApplicationContext(MyApp.class); HelloWorldService helloWorldService = c.getBean(HelloWorldService.class); helloWorldService.helloWorld(); } }
#FBOఆٛͷొ
@Configuration @ComponentScan public class MyApp { public static void main(String[]
args) { ApplicationContext c = new AnnotationConfigApplicationContext(MyApp.class); HelloWorldService helloWorldService = c.getBean(HelloWorldService.class); helloWorldService.helloWorld(); } } 16 MyApp#main コンストラクタにConfigurationアノ テーションがついてるクラスを渡す
17 AnnotationConfigApplicationContext#new public AnnotationConfigApplicationContext( Class<?>... annotatedClasses) { this(); register(annotatedClasses); refresh();
}
18 public AnnotationConfigApplicationContext( Class<?>... annotatedClasses) { this(); register(annotatedClasses); refresh(); }
AnnotationConfigApplicationContext#new 引数なしのコンストラクタを呼ぶ
19 • ҎԼͷΠϯελϯεΛϑΟʔϧυʹอ࣋ • "OOPUBUFE#FBO%FpOJUJPO3FBEFS • $MBTT1BUI#FBO%FpOJUJPO4DBOOFS AnnotationConfigApplicationContext#new public AnnotationConfigApplicationContext()
{ this.reader = new AnnotatedBeanDefinitionReader(this); this.scanner = new ClassPathBeanDefinitionScanner(this); }
20 public AnnotationConfigApplicationContext( Class<?>... annotatedClasses) { this(); register(annotatedClasses); refresh(); }
AnnotationConfigApplicationContext#new registerメソッドにClass<MyApp> を渡してる
#FBOఆٛొͷྲྀΕ 21 AnnotationConfig ApplicationContext registerメソッド
#FBOఆٛొͷྲྀΕ 22 AnnotationConfig ApplicationContext AnnotatedBean DefinitionReader registerメソッド
23 BOOPUBUFE$MBTT͔Β"OOPUBUFE(FOFSJD#FBO%FpOJUJPOΛੜ !$POEJUJPOBMΞϊςʔγϣϯͰ#FBOొͷεΩοϓΛఆ "OOPUBUJPO#FBO/BNF(FOFSBUPSͰ#FBOͷ໊લΛܾΊΔ "OOPUBUFE(FOFSJD#FBO%FpOJUJPOΛ#FBO%FpOJUJPO)PMEFSͰแΉ
ඞཁͰ͋Ε4DPQFE1SPYZʹؔ͢ΔॲཧΛ͢Δ #FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register
24 BOOPUBUFE$MBTT͔Β"OOPUBUFE(FOFSJD#FBO%FpOJUJPOΛੜ !$POEJUJPOBMΞϊςʔγϣϯͰ#FBOొͷεΩοϓΛఆ "OOPUBUJPO#FBO/BNF(FOFSBUPSͰ#FBOͷ໊લΛܾΊΔ "OOPUBUFE(FOFSJD#FBO%FpOJUJPOΛ#FBO%FpOJUJPO)PMEFSͰแΉ
ඞཁͰ͋Ε4DPQFE1SPYZʹؔ͢ΔॲཧΛ͢Δ #FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register Bean定義はBeanDefinitionで 表現される
25 BOOPUBUFE$MBTT͔Β"OOPUBUFE(FOFSJD#FBO%FpOJUJPOΛੜ !$POEJUJPOBMΞϊςʔγϣϯͰ#FBOొͷεΩοϓΛఆ "OOPUBUJPO#FBO/BNF(FOFSBUPSͰ#FBOͷ໊લΛܾΊΔ "OOPUBUFE(FOFSJD#FBO%FpOJUJPOΛ#FBO%FpOJUJPO)PMEFSͰแΉ
ඞཁͰ͋Ε4DPQFE1SPYZʹؔ͢ΔॲཧΛ͢Δ #FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register ConditionalアノテーションとConditionイ ンタフェースでBean登録をスキップできる http://docs.spring.io/spring/docs/current/spring-framework-reference/ htmlsingle/#beans-java-conditional
26 BOOPUBUFE$MBTT͔Β"OOPUBUFE(FOFSJD#FBO%FpOJUJPOΛੜ !$POEJUJPOBMΞϊςʔγϣϯͰ#FBOొͷεΩοϓΛఆ "OOPUBUJPO#FBO/BNF(FOFSBUPSͰ#FBOͷ໊લΛܾΊΔ "OOPUBUFE(FOFSJD#FBO%FpOJUJPOΛ#FBO%FpOJUJPO)PMEFSͰแΉ
ඞཁͰ͋Ε4DPQFE1SPYZʹؔ͢ΔॲཧΛ͢Δ #FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register 今回はAnnotationBeanNameGeneratorに よって決められる。 http://docs.spring.io/spring/docs/current/spring-framework-reference/ htmlsingle/#beans-scanning-name-generator
27 BOOPUBUFE$MBTT͔Β"OOPUBUFE(FOFSJD#FBO%FpOJUJPOΛੜ !$POEJUJPOBMΞϊςʔγϣϯͰ#FBOొͷεΩοϓΛఆ "OOPUBUJPO#FBO/BNF(FOFSBUPSͰ#FBOͷ໊લΛܾΊΔ "OOPUBUFE(FOFSJD#FBO%FpOJUJPOΛ#FBO%FpOJUJPO)PMEFSͰแΉ
ඞཁͰ͋Ε4DPQFE1SPYZʹؔ͢ΔॲཧΛ͢Δ #FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register BeanDefinitionHolderはBean名と BeanDefinitionを保持する
28 BOOPUBUFE$MBTT͔Β"OOPUBUFE(FOFSJD#FBO%FpOJUJPOΛੜ !$POEJUJPOBMΞϊςʔγϣϯͰ#FBOొͷεΩοϓΛఆ "OOPUBUJPO#FBO/BNF(FOFSBUPSͰ#FBOͷ໊લΛܾΊΔ "OOPUBUFE(FOFSJD#FBO%FpOJUJPOΛ#FBO%FpOJUJPO)PMEFSͰแΉ
ඞཁͰ͋Ε4DPQFE1SPYZʹؔ͢ΔॲཧΛ͢Δ #FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register AnnotationScopeMetadataResolverで@Scope アノテーションのproxyModeを読み取る http://docs.spring.io/spring/docs/current/spring-framework-reference/ htmlsingle/#beans-java-scoped-proxy
29 BOOPUBUFE$MBTT͔Β"OOPUBUFE(FOFSJD#FBO%FpOJUJPOΛੜ !$POEJUJPOBMΞϊςʔγϣϯͰ#FBOొͷεΩοϓΛఆ "OOPUBUJPO#FBO/BNF(FOFSBUPSͰ#FBOͷ໊લΛܾΊΔ "OOPUBUFE(FOFSJD#FBO%FpOJUJPOΛ#FBO%FpOJUJPO)PMEFSͰแΉ
ඞཁͰ͋Ε4DPQFE1SPYZʹؔ͢ΔॲཧΛ͢Δ #FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register 次はここを見ていく
30 AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register BeanDefinitionReaderUtils.registerBeanDefinition( definitionHolder, this.registry); •
#FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ
31 AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register BeanDefinitionReaderUtils.registerBeanDefinition( definitionHolder, this.registry); •
#FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ さっき作ったMyAppクラスのBean定義 を保持するBeanDefinitionHolder
32 AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register BeanDefinitionReaderUtils.registerBeanDefinition( definitionHolder, this.registry); •
#FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ this.registryって何?
33 public AnnotationConfigApplicationContext() { this.reader = new AnnotatedBeanDefinitionReader(this); this.scanner =
new ClassPathBeanDefinitionScanner(this); } AnnotationBeanDefinitionReaderの this.registryに、 AnnotationConfigApplicationContextが 代入される
34 AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register BeanDefinitionReaderUtils.registerBeanDefinition( definitionHolder, this.registry); •
#FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ this.registryは AnnotationConfigApplicationContext
#FBOఆٛొͷྲྀΕ 35 AnnotationConfig ApplicationContext AnnotatedBean DefinitionReader registerメソッド
#FBOఆٛొͷྲྀΕ 36 AnnotationConfig ApplicationContext AnnotatedBean DefinitionReader AnnotatedGeneric BeanDefinition <ੜ> Bean定義を表現するクラス
#FBOఆٛొͷྲྀΕ 37 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry AnnotatedBean DefinitionReader
AnnotatedGeneric BeanDefinition <ੜ> AnnotationConfigApplicationContextは BeanDefinitionRegistryのサブクラス
#FBOఆٛొͷྲྀΕ 38 AnnotationConfig ApplicationContext GenericApplication Context BeanDefinition Registry AnnotatedBean DefinitionReader
AnnotatedGeneric BeanDefinition <ੜ> BeanDefinition ReaderUtils registerBeanDefinitionメソッド beanDefinitionHolderとregistryが引数
39 …=> AnnotatedBeanDefinitionReader#register => #registerBean => BeanDefinitionReaderUtils#registerBeanDefinition String beanName =
definitionHolder.getBeanName(); registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition()); registryにBeanの名前と Bean定義を登録する
ͭ·Γ 40 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry AnnotatedBean DefinitionReader
AnnotatedGeneric BeanDefinition <ੜ> 1 N BeanDefinitionReaderUtils 経由で登録される BeanDefinitionR eaderUtils
ͭ·Γ 41 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry AnnotatedBean DefinitionReader
AnnotatedGeneric BeanDefinition <ੜ> 1 N 登録処理は registerBeanDefinitionメソッド BeanDefinitionR eaderUtils
42 this.beanFactory.registerBeanDefinition(beanName, beanDefinition); …=> BeanDefinitionReaderUtils#registerBeanDefinition => GenericApplicationContext#registerBeanDefinition this.beanFactoryは、 DefaultListableBeanFactoryインスタンスで 初期化されている
%FGBVMU-JTUBCMF#FBO'BDUPSZ
%FGBVMU-JTUBCMF#FBO'BDUPSZͷܧঝ 44
%FGBVMU-JTUBCMF#FBO'BDUPSZͷܧঝ 45
ͭ·Γ 46 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry AnnotatedBean DefinitionReader
AnnotatedGeneric BeanDefinition <ੜ> 1 N BeanDefinitionR eaderUtils 登録するのは registerBeanDefinitionメソッド
ͭ·Γ 47 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry AnnotatedBean DefinitionReader
AnnotatedGeneric BeanDefinition <ੜ> 1 N DefaultListable BeanFactory registerBeanDefinitionメソッドに 委譲 BeanDefinitionR eaderUtils
ͭ·Γ 48 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry AnnotatedBean DefinitionReader
AnnotatedGeneric BeanDefinition <ੜ> 1 N DefaultListable BeanFactory BeanDefinitionはインスタンス変数の ConcurrentHashMapに保存される BeanDefinitionR eaderUtils
public AnnotationConfigApplicationContext( Class<?>... annotatedClasses) { this(); register(annotatedClasses); refresh(); } ͜͜·ͰΛཧ
49 • ͕͜͜ऴΘͬͨ • .Z"QQΫϥεͷ#FBOఆٛΛొͨ͠
͜͜·ͰΛཧ 50 AnnotationConfig ApplicationContext Generic ApplicationContext AnnotatedBean DefinitionReader DefaultListable BeanFactory
BeanDefinition ReaderUtils Class<MyApp> BeanDefinition Holder BeanDefinition Concurrent HashMap BeanDefinition BeanDefinition
࣍ίϯϙʔωϯτεΩϟϯ
52 public AnnotationConfigApplicationContext( Class<?>... annotatedClasses) { this(); register(annotatedClasses); refresh(); }
AnnotationConfigApplicationContext#new • ࣍ͬͪ͜ • SFGSFTIϝιουΫϥεͰ͋Δ"CTUSBDU"QQMJDBUJPO$POUFYUͰ࣮ ͞Ε͍ͯΔ
53 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢
#FBO1PTU1SPDFTTPSΛొ͢Δ ϝοηʔδͷॳظԽΠϕϯτϦεφʔͷొͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ
54 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢
#FBO1PTU1SPDFTTPSΛొ͢Δ ϝοηʔδͷॳظԽΠϕϯτϦεφʔͷొͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ ログを出力したりインスタンス 変数を初期化したり
55 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢
#FBO1PTU1SPDFTTPSΛొ͢Δ ϝοηʔδͷॳظԽΠϕϯτϦεφʔͷొͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ さっきも出てきた DefaultListableBeanFactoryインスタンスに 対していろいろ設定する
%FGBVMU-JTUBCMF#FBO'BDUPSZͷܧঝ 56
57 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢
#FBO1PTU1SPDFTTPSΛొ͢Δ ϝοηʔδͷॳظԽΠϕϯτϦεφʔͷొͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ 次はここ
58 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢
#FBO1PTU1SPDFTTPSΛొ͢Δ ϝοηʔδͷॳظԽΠϕϯτϦεφʔͷొͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ PostProcessorRegistrationDelegate に委譲する
59 …=> AbstractApplicationContext#refresh => PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors J #FBO%FpOJUJPO3FHJTUSZ1PTU1SPDFTTPSΛ࣮ͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO%FpOJUJPO3FHJTUSZΛ࣮ߦ JJ #FBO%FpOJUJPO3FHJTUSZ1PTU1SPDFTTPSΛ࣮ͨ͠Ϋϥεͷ
QPTU1SPDFTT#FBO'BDUPSZΛ࣮ߦ JJJ #FBO'BDUPSZ1PTU1SPDFTTPSΛ࣮ͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO'BDUPSZΛ࣮ߦ
60 J #FBO%FpOJUJPO3FHJTUSZ1PTU1SPDFTTPSΛ࣮ͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO%FpOJUJPO3FHJTUSZΛ࣮ߦ JJ #FBO%FpOJUJPO3FHJTUSZ1PTU1SPDFTTPSΛ࣮ͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO'BDUPSZΛ࣮ߦ JJJ #FBO'BDUPSZ1PTU1SPDFTTPSΛܧঝͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO'BDUPSZΛ࣮ߦ
Springフレームワーク内部用? 今回のケースだと実は ConfigurationClassPostProcessorが 既に登録されている …=> AbstractApplicationContext#refresh => PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
61 J #FBO%FpOJUJPO3FHJTUSZ1PTU1SPDFTTPSΛܧঝͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO%FpOJUJPO3FHJTUSZΛ࣮ߦ JJ #FBO%FpOJUJPO3FHJTUSZ1PTU1SPDFTTPSΛܧঝͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO'BDUPSZΛ࣮ߦ JJJ #FBO'BDUPSZ1PTU1SPDFTTPSΛܧঝͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO'BDUPSZΛ࣮ߦ
Springフレームワーク内部用? 今回のケースだと実は ConfigurationClassPostProcessorが 既に登録されている AnnotatedBeanDefinitionReaderのコンストラクタで AnnotationConfigUtils.registerAnnotationConfigP rocessorsを呼び出しBean定義を登録してる …=> AbstractApplicationContext#refresh => PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
62 J #FBO%FpOJUJPO3FHJTUSZ1PTU1SPDFTTPSΛܧঝͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO%FpOJUJPO3FHJTUSZΛ࣮ߦ JJ #FBO%FpOJUJPO3FHJTUSZ1PTU1SPDFTTPSΛܧঝͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO'BDUPSZΛ࣮ߦ JJJ #FBO'BDUPSZ1PTU1SPDFTTPSΛܧঝͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO'BDUPSZΛ࣮ߦ
自前のBeanFactoryPostProcessor 今回は定義していない …=> AbstractApplicationContext#refresh => PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
63 ͭ·Γࠓճͷέʔεͩͱ$POpHVSBUJPO$MBTT1PTU1SPDFTTPSͷ ᶃ QPTU1SPDFTT#FBO%FpOJUJPO3FHJTUSZ ᶄ QPTU1SPDFTT#FBO'BDUPSZ ͕࣮ߦ͞ΕΔɻ …=> AbstractApplicationContext#refresh =>
PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
64 ͭ·Γࠓճͷέʔεͩͱ$POpHVSBUJPO$MBTT1PTU1SPDFTTPSͷ ᶃ QPTU1SPDFTT#FBO%FpOJUJPO3FHJTUSZ ᶄ QPTU1SPDFTT#FBO'BDUPSZ ͕࣮ߦ͞ΕΔɻコンポーネントスキャンしてBean定義 を登録する …=> AbstractApplicationContext#refresh
=> PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
ίϯϙʔωϯτεΩϟϯͷྲྀΕ 65 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry DefaultListable BeanFactory
ίϯϙʔωϯτεΩϟϯͷྲྀΕ 66 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry DefaultListable BeanFactory
ConfigurationClass PostProcessor BeanFactoryPostProcessor として呼び出される
ίϯϙʔωϯτεΩϟϯͷྲྀΕ 67 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry DefaultListable BeanFactory
ConfigurationClass PostProcessor ClassPathScanningCandidate ComponentProvider ݺͼग़͠
ίϯϙʔωϯτεΩϟϯͷྲྀΕ 68 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinitionR egistry DefaultListable BeanFactory
ConfigurationClassP ostProcessor .classϑΝΠϧ ClassPathScanningCandidate ComponentProvider ݺͼग़͠ ୳͢ PathMatchingResourcePatternResolver を使ってclassファイルを探す File#listFilesを使って探索する
ίϯϙʔωϯτεΩϟϯͷྲྀΕ 69 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinitionR egistry DefaultListable BeanFactory
ConfigurationClassP ostProcessor .classϑΝΠϧ ClassPathScanningCandidate ComponentProvider ݺͼग़͠ ୳͢&ղੳ ClassReaderと AnnotationMetadataReadingVisitorを使っ てclassファイルのバイトコードを解析する
ίϯϙʔωϯτεΩϟϯͷྲྀΕ 70 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry DefaultListable BeanFactory
ConfigurationClass PostProcessor .classϑΝΠϧ ScannedBean Definition ClassPathScanningCandidate ComponentProvider ݺͼग़͠ ୳͢&ղੳ ੜ Beanとなるクラスのみ
ίϯϙʔωϯτεΩϟϯͷྲྀΕ 71 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry DefaultListable BeanFactory
ConfigurationClassP ostProcessor .classϑΝΠϧ ScannedBean Definition ClassPathScanningCandidate ComponentProvider ݺͼग़͠ ୳͢&ղੳ ੜ 1 N BeanDefinitionReaderUtilsに よって登録される 最初のBean定義の登録と同じ
72 ͭ·Γࠓճͷέʔεͩͱ$POpHVSBUJPO$MBTT1PTU1SPDFTTPSͷ ᶃ QPTU1SPDFTT#FBO%FpOJUJPO3FHJTUSZ ᶄ QPTU1SPDFTT#FBO'BDUPSZ ͕࣮ߦ͞ΕΔɻコンポーネントスキャンが終わった …=> AbstractApplicationContext#refresh =>
PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
73 ͭ·Γࠓճͷέʔεͩͱ$POpHVSBUJPO$MBTT1PTU1SPDFTTPSͷ ᶃ QPTU1SPDFTT#FBO%FpOJUJPO3FHJTUSZ ᶄ QPTU1SPDFTT#FBO'BDUPSZ ͕࣮ߦ͞ΕΔɻ ConfigurationClassEnhancer#enhance でMyAppをCGLIBのサブクラス化 AOPでプロキシ化する時にCGLIBを使う
…=> AbstractApplicationContext#refresh => PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
74 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢
#FBO1PTU1SPDFTTPSΛొ͢Δ ϝοηʔδͷॳظԽΠϕϯτϦεφʔͷొͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ 終わり
75 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢
#FBO1PTU1SPDFTTPSΛొ͢Δ ϝοηʔδͷॳظԽΠϕϯτϦεφʔͷొͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ PostProcessorRegistrationDelegateを 使ってbeanFactoryに登録する http://docs.spring.io/spring/docs/current/spring-framework- reference/htmlsingle/#beans-factory-extension-bpp
76 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢
#FBO1PTU1SPDFTTPSΛొ͢Δ ϝοηʔδͷॳظԽΠϕϯτϦεφʔͷొͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ メッセージの初期化 http://docs.spring.io/spring/docs/current/spring-framework- reference/htmlsingle/#context-functionality-messagesource イベントリスナー http://docs.spring.io/spring/docs/current/spring-framework- reference/htmlsingle/#context-functionality-events
࣍#FBOΛੜ
78 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢
#FBO1PTU1SPDFTTPSΛొ͢Δ ϝοηʔδͷॳظԽΠϕϯτϦεφʔͷొͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ ここを見ていく
79 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh • TJOHMFUPOείʔϓͷ#FBOΛੜ finishBeanFactoryInitialization(beanFactory); beanFactory.preInstantiateSingletons(); beanFactoryはDefaultListableBeanFactory
80 • ͬ͘͟Γͱ͜Μͳײ͡ • #FBO໊͔Β#FBOఆٛΛϚʔδͨ͠#FBO%FpOJUJPOΛऔಘ͢Δ IUUQEPDTTQSJOHJPTQSJOHEPDTDVSSFOUTQSJOHGSBNFXPSLSFGFSFODFIUNMTJOHMFCFBOT SFGFMFNFOU • நΫϥεͰͳ͘ɺTJOHMFUPOείʔϓͰɺ-B[Z*OJUͰͳ͍ͷʹ ରͯ͠HFU#FBOϝιουΛݺͿ
IUUQEPDTTQSJOHJPTQSJOHEPDTDVSSFOUTQSJOHGSBNFXPSLSFGFSFODFIUNMTJOHMFCFBOT GBDUPSZMB[ZJOJU for (String beanName : this.beanDefinitionNames) { RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { getBean(beanName); } }
"CTUSBDU#FBO'BDUPSZ HFU#FBO
• #FBOఆٛͷEFQFOETPOଐੑΛղܾ IUUQEPDTTQSJOHJPTQSJOHEPDTDVSSFOUTQSJOHGSBNFXPSLSFGFSFODFIUNMTJOHMFCFBOT GBDUPSZEFQFOETPO String[] dependsOn = mbd.getDependsOn(); if (dependsOn
!= null) { AbstractBeanFactory#getBean
• #FBOΛੜ͢Δͱ͜Ζʂ • είʔϓʹԠͯ͡ذ • ࠓճTJOHMFUPOείʔϓͷ߹Λݟ͍ͯ͘ // Create bean instance.
if (mbd.isSingleton()) { } else if (mbd.isPrototype()) { } else { } AbstractBeanFactory#getBean
HFU#FBOͷྲྀΕ 84 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory
AbstractAutowireCapable BeanFactory getBeanメソッド
HFU#FBOͷྲྀΕ 85 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory
AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry getSingleton メソッド
%FGBVMU-JTUBCMF#FBO'BDUPSZͷܧঝ 86
87 DefaultSingletonBeanRegistry#getSingleton • TJOHMFUPOείʔϓͷ#FBOΛੜࡁΈ͔Ͳ͏͔ΛௐΔ • ੜࡁΈͷ߹ͦΕΛฦ͚ͩ͢ synchronized (this.singletonObjects) { Object
singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { // Beanを生成する処理 } return (singletonObject != NULL_OBJECT ? singletonObject : null); }
HFU#FBOͷྲྀΕ 88 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory
AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry getSingleton メソッド
HFU#FBOͷྲྀΕ 89 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory
AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry createBean メソッド
%FGBVMU-JTUBCMF#FBO'BDUPSZͷܧঝ 90
91 AbstractAutowireCapableBeanFactory#createBean J #FBO%FpOJUJPOͱ#FBO໊͔Β#FBOͷ$MBTTΠϯελϯεΛऔಘ JJ $MBTTΠϯελϯε͔Β#FBOΛੜ • ίϯετϥΫλΠϯδΣΫγϣϯ JJJ ੜͨ͠#FBOʹରͯ͠ɺϑΟʔϧυɾηολʔΠϯδΣΫγϣϯ
JW ੜͨ͠#FBOʹରͯ͠ɺ#FBO1PTU1SPDFTTPSͱJOJUNFUIPEͷॲཧ
92 AbstractAutowireCapableBeanFactory#createBean J #FBO%FpOJUJPOͱ#FBO໊͔Β#FBOͷ$MBTTΠϯελϯεΛऔಘ JJ $MBTTΠϯελϯε͔Β#FBOΛੜ • ίϯετϥΫλΠϯδΣΫγϣϯ JJJ ੜͨ͠#FBOʹରͯ͠ɺϑΟʔϧυɾηολʔΠϯδΣΫγϣϯ
JW ੜͨ͠#FBOʹରͯ͠ɺ#FBO1PTU1SPDFTTPSͱJOJUNFUIPEͷॲཧ
HFU#FBOͷྲྀΕ 93 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory
AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry createBean メソッド
HFU#FBOͷྲྀΕ 94 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory
AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry resolveBeanClass メソッド
HFU#FBOͷྲྀΕ 95 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListableB eanFactory Abstract BeanFactory
AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry @ConfigurationのBean定義についてはClassイ ンスタンスを返すだけ コンポーネントスキャンしたBean定義について はClassインスタンスを生成する必要がある
HFU#FBOͷྲྀΕ 96 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory
AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry ClassLoaderインスタンス を保持してる
HFU#FBOͷྲྀΕ 97 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListableBea nFactory Abstract BeanFactory
AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry ClassLoaderとBeanDefinitionが 持つクラス名を引数で渡し、Class インスタンスを取得する ClassLoader#loadClass ClassUtils
98 AbstractAutowireCapableBeanFactory#createBean J #FBO%FpOJUJPOͱ#FBO໊͔Β#FBOͷ$MBTTΠϯελϯεΛऔಘ JJ $MBTTΠϯελϯε͔Β#FBOΛੜ • ίϯετϥΫλΠϯδΣΫγϣϯ JJJ ੜͨ͠#FBOʹରͯ͠ɺϑΟʔϧυɾηολʔΠϯδΣΫγϣϯ
JW ੜͨ͠#FBOʹରͯ͠ɺ#FBO1PTU1SPDFTTPSͱJOJUNFUIPEͷॲཧ
99 @Component public class PrintService { public void print(String s)
{ System.out.println(s); } } @Component public class HelloWorldService { private PrintService printService; @AutoWired public HelloWorldService(PrintService printService) { this.printService = printService; } public void helloWorld() { printService.print("Hello, World!"); } }
100 AbstractAutowireCapableBeanFactory#createBean • ίϯετϥΫλҾͷ$POTUSVDUPSΠϯελϯεΛऔಘ͢Δ෦ • ࠓճͷαϯϓϧͩͱ)FMMP8PSME4FSWJDFͷ#FBOఆٛʹରͯ͠ɺ 1SJOU4FSWJDFΫϥεͷ$POTUSVDUPSΠϯελϯεΛऔಘ͢Δ • Ұ෦ͷ#FBO1PTU1SPDFTTPSΛ༻ͯ͠औಘ͢Δ •
4NBSU*OTUBOUJBUJPO"XBSF#FBO1PTU1SPDFTTPSΛܧঝͨ͠ #FBO1PTU1SPDFTTPS • ࠓճ"VUPXJSF"OOPUBUJPO#FBO1PTU1SPDFTTPS͕֘ Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors( beanClass, beanName);
101 AbstractAutowireCapableBeanFactory#createBean • #FBO%FpOJUJPOͱऔಘͨ͠$POTUSVDUPSΠϯελϯεΛͬͯίϯε τϥΫλΠϯδΣΫγϣϯ͢Δ෦ • ࠓճͷαϯϓϧͩͱɺҎԼΛͬͯίϯετϥΫλΠϯδΣΫγϣ ϯ͢Δ • )FMMP8PSME4FSWJDFͷ#FBO%FpOJUJPO
• 1SJOU4FSWJDFͷ$POTUSVDUPSΠϯελϯε new ConstructorResolver(this) .autowireConstructor(beanName, mbd, ctors, explicitArgs);
102 Abstract BeanFactory AbstractAutowireCapable BeanFactory Constructor Resolver getBean ここがBean生成のスタート HelloWorldServiceのBeanを
生成しようとしてる
103 Abstract BeanFactory AbstractAutowireCapable BeanFactory Constructor Resolver getBean HelloWorldServiceにPrintService をコンストラクタインジェクショ
ンをしようとしてるとこ
104 Abstract BeanFactory AbstractAutowireCapable BeanFactory Constructor Resolver DefaultListable BeanFactory getBean
PrintServiceのBeanを取得するた めにresolveDependencyメソッド を呼ぶ
105 Abstract BeanFactory AbstractAutowireCapable BeanFactory Constructor Resolver DefaultListable BeanFactory getBean
Bean生成のため再帰的に getBeanを呼ぶことになる
106 Abstract BeanFactory AbstractAutowireCapable BeanFactory Constructor Resolver DefaultListable BeanFactory getBean
PrintServiceのBeanが 返ってくる
107 Abstract BeanFactory AbstractAutowireCapable BeanFactory Constructor Resolver SimpleInstantiation Strategy DefaultListable
BeanFactory BeanUtils getBean Constructor#newInstanceと PrintServiceのBeanを使って HelloWorldServiceのBeanを生成
108 Abstract BeanFactory AbstractAutowireCapable BeanFactory Constructor Resolver SimpleInstantiation Strategy DefaultListable
BeanFactory BeanUtils getBean Constructor#newInstanceと PrintServiceのBeanを使って HelloWorldServiceのBeanを生成 コンストラクタインジェクション!
109 AbstractAutowireCapableBeanFactory#createBean J #FBO%FpOJUJPOͱ#FBO໊͔Β#FBOͷ$MBTTΠϯελϯεΛऔಘ JJ $MBTTΠϯελϯε͔Β#FBOΛੜ • ίϯετϥΫλΠϯδΣΫγϣϯ JJJ ੜͨ͠#FBOʹରͯ͠ɺϑΟʔϧυɾηολʔΠϯδΣΫγϣϯ
JW ੜͨ͠#FBOʹରͯ͠ɺ#FBO1PTU1SPDFTTPSͱJOJUNFUIPEͷॲཧ populateBeanメソッド 内で実施してる initializeBeanメソッド 内で実施してる
HFU#FBOͷྲྀΕΛཧ 110 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory
AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry createBean
HFU#FBOͷྲྀΕΛཧ 111 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory
AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry Beanの出来上がり!
HFU#FBOͷྲྀΕΛཧ 112 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory
AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry 出来上がったBeanを後で使えるよう に取っておく
HFU#FBOͷྲྀΕΛཧ 113 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory
AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry getBeanメソッド終了!
114 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢
#FBO1PTU1SPDFTTPSΛొ͢Δ ͦͷଞΖΖ TJOHMFUPOείʔϓͷ#FBOΛੜ͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ 終わり
115 public AnnotationConfigApplicationContext( Class<?>... annotatedClasses) { this(); register(annotatedClasses); refresh(); }
AnnotationConfigApplicationContext#new • ͍ͭʹ"OOPUBUJPO$POpH"QQMJDBUJPO$POUFYUͷίϯετϥΫλ͕ऴ Θͬͨɾɾɾ
@Configuration @ComponentScan public class MyApp { public static void main(String[]
args) { ApplicationContext c = new AnnotationConfigApplicationContext(MyApp.class); HelloWorldService helloWorldService = c.getBean(HelloWorldService.class); helloWorldService.helloWorld(); } } ࠷ॳͷίʔυ 116 • "QQMJDBUJPO$POUFYUʂ
@Configuration @ComponentScan public class MyApp { public static void main(String[]
args) { ApplicationContext c = new AnnotationConfigApplicationContext(MyApp.class); HelloWorldService helloWorldService = c.getBean(HelloWorldService.class); helloWorldService.helloWorld(); } } ࠷ॳͷίʔυ 117 • "QQMJDBUJPO$POUFYUͷHFU#FBOɺ͖ͬ͞ग़͖ͯͨ "CTUSBDU#FBO'BDUPSZHFU#FBOΛݺΜͰΔ͚ͩ • ੜࡁΈͷTJOHMFUPOείʔϓͷ#FBOΛऔಘͰ͖Δ
;Γ͔͑ͬͯΈΔ
• ;Γ͔͑ͬͯΈΔ • #FBOఆٛͷొ • ίϯϙʔωϯτεΩϟϯ • #FBOੜʢ ίϯετϥΫλΠϯδΣΫγϣϯʣ 119
• #FBOఆٛͷొ • "OOPUBUFE#FBO%FpOJUJPO3FBEFSͷίϯετϥΫλͰϑϨʔϜ ϫʔΫͰ͏#FBOఆ͕ٛొ͞ΕΔ • "OOPUBUFE#FBO%FpOJUJPO3FBEFSͰ!$POpHVSBUJPO͕͍ͭͯ ΔΫϥεͷ#FBOఆٛΛ#FBO%FpOJUJPOʹม͢Δ • #FBO%FpOJUJPO͕࠷ऴతʹอଘ͞ΕΔॴɺ
%FGBVMU-JTUBCMF#FBO'BDUPSZͷΠϯελϯεม 120
• ίϯϙʔωϯτεΩϟϯ • $POpHVSBUJPO$MBTT1PTU1SPDFTTPSQPTU1SPDFTT#FBO%FpOJ UJPO3FHJTUSZ͔Β࢝·Δ • ʢ"OOPUBUFE#FBO%FpOJUJPO3FBEFSͷίϯετϥΫλͰ#FBO ొ͞ΕͯΔʣ 121
• #FBOੜʢ ίϯετϥΫλΠϯδΣΫγϣϯʣ • "CTUSBDU#FBO'BDUPSZHFU#FBO͔Β࢝·Δ • "VUPXJSFE"OOPUBUJPO#FBO1PTU1SPDFTTPSͰίϯετϥΫλ ΠϯδΣΫγϣϯͷҾΛղܾ • ʢ"OOPUBUFE#FBO%FpOJUJPO3FBEFSͷίϯετϥΫλͰ#FBO
ొ͞ΕͯΔʣ 122
• #FBO%FpOJUJPO3FBEFS • #FBO%FpOJUJPOΛੜ • $POpHVSBUJPO$MBTT1PTU1SPDFTTPSΛొ • "VUPXJSFE"OOPUBUJPO#FBO1PTU1SPDFTTPSΛొ • %FGBVMU-JTUBCMF'BDUPSZ
• #FBO%FpOJUJPOΛอ࣋ • #FBOੜ 123
• ͋Εʁ • #FBO%FpOJUJPO3FBEFSͱ%FGBVMU-JTUBCMF#FBO'BDUPSZ͑͋͞Ε ಈ͘Μ͡Όͳ͍ʁ • ʢ"QQMJDBUJPO$POUFYU͍Βͳ͘ͳ͍ʁʣ • ࣮ࡍɺࢼͯ͠ΈͨΒಈ͍ͨ 124
125 // 準備 DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); AnnotatedBeanDefinitionReader reader
= new AnnotatedBeanDefinitionReader(beanFactory); // 明示的にaddBeanPostProcessorしないとAbstractBeanFactoryの // フラグ(hasInstantiationAwareBeanPostProcessors)が立たなかった beanFactory.addBeanPostProcessor( beanFactory.getBean(AutowiredAnnotationBeanPostProcessor.class)); // Bean定義の登録 reader.register(MyApp.class); // コンポーネントスキャン ConfigurationClassPostProcessor bpp = beanFactory.getBean(ConfigurationClassPostProcessor.class); bpp.setEnvironment(new StandardEnvironment()); bpp.postProcessBeanDefinitionRegistry(beanFactory); // Beanの取得 beanFactory.getBean(HelloWorldService.class).helloWorld();
;Γ͔͑ͬͯΈΔ 126 • %*ʹؔ͢ΔΞϨίϨΛΔͷʹඞཁͳͷɺ#FBO'BDUPSZͱ #FBO%FpOJUJPO3FBEFSͩͬͨ • IUUQEPDTTQSJOHJPTQSJOHEPDTDVSSFOUTQSJOHGSBNFXPSLSFGFSFODFIUNMTJOHMF DPOUFYUJOUSPEVDUJPODUYWTCFBOGBDUPSZ • %FGBVMU-JTUBCMF#FBO'BDUPSZͷࣄଟ͗͢ʂܧঝ͕ෳࡶʂ
• ֤ΠϯλϑΣʔεͷׂΛͬ͘͟ΓѲ͢ΔͱಡΈ͘͢ͳΔ • ࢥͬͯͨΑΓ৭ʑͳػೳɺ֦ுϙΠϯτ͕ఏڙ͞Ε͍ͯͨ • ίʔυΛಡΜͩ͜ͱɺ͍͔ͭʹཱͭɾɾɾ͔ʂ
;Γ͔͑ͬͯΈΔ 127 • %*ʹؔ͢ΔΞϨίϨΛΔͷʹඞཁͳͷɺ#FBO'BDUPSZͱ #FBO%FpOJUJPO3FBEFSͩͬͨ • IUUQEPDTTQSJOHJPTQSJOHEPDTDVSSFOUTQSJOHGSBNFXPSLSFGFSFODFIUNMTJOHMF DPOUFYUJOUSPEVDUJPODUYWTCFBOGBDUPSZ • %FGBVMU-JTUBCMF#FBO'BDUPSZͷࣄଟ͗͢ʂܧঝ͕ෳࡶʂ
• ֤ΠϯλϑΣʔεͷׂΛͬ͘͟ΓѲ͢ΔͱಡΈ͘͢ͳΔ • ࢥͬͯͨΑΓ৭ʑͳػೳɺ֦ுϙΠϯτ͕ఏڙ͞Ε͍ͯͨ • ίʔυΛಡΜͩ͜ͱɺ͍͔ͭʹཱͭɾɾɾ͔ʂ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ