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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
390
echoサーバーを書いてI/Oと仲良くなる話
kariyayo
3
880
Apexで複数環境のLambda関数をデプロイする話 #jawsug
kariyayo
1
2k
近況報告といろいろ作るのが楽しい話 #yokohama_north
kariyayo
0
920
目指せ3つ星インデックス #yokohama_north
kariyayo
2
880
Spring Boot と Swagger #渋谷java
kariyayo
4
5.8k
Gradleを使えるようになるために
kariyayo
0
120
Other Decks in Programming
See All in Programming
「人を評価する AI」の設計と実装
ryoyanara
0
260
Flow は今どうなっているか
mizdra
PRO
0
760
ALB ログから Trace を気合で繋げる技術
fohte
7
770
Introducing Stack Pull Request in GitHub
kkamegawa
0
110
Dockerfile CMD for Node.js
grazie1999
0
140
AIの中の人になってみる
htkym
0
140
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
120
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
280
プロポーザルを書いてもらう
pvcresin
0
590
VibeCodingからAgenticWorkflowへ
starfish719
0
940
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
1
2k
My Marp Sample
sinoue0108
0
130
Featured
See All Featured
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
310
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
480
Paper Plane (Part 1)
katiecoart
PRO
1
10k
Writing Fast Ruby
sferik
630
63k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
400
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
490
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
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ͷࣄଟ͗͢ʂܧঝ͕ෳࡶʂ
• ֤ΠϯλϑΣʔεͷׂΛͬ͘͟ΓѲ͢ΔͱಡΈ͘͢ͳΔ • ࢥͬͯͨΑΓ৭ʑͳػೳɺ֦ுϙΠϯτ͕ఏڙ͞Ε͍ͯͨ • ίʔυΛಡΜͩ͜ͱɺ͍͔ͭʹཱͭɾɾɾ͔ʂ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ