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
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
100
Other Decks in Programming
See All in Programming
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
Lessons from Spec-Driven Development
simas
PRO
0
220
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
210
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
560
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
350k
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
290
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.5k
Webフレームワークの ベンチマークについて
yusukebe
0
180
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
910
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
120
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
190
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
390
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
170
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
950
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Design in an AI World
tapps
1
250
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
300
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
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ͷࣄଟ͗͢ʂܧঝ͕ෳࡶʂ
• ֤ΠϯλϑΣʔεͷׂΛͬ͘͟ΓѲ͢ΔͱಡΈ͘͢ͳΔ • ࢥͬͯͨΑΓ৭ʑͳػೳɺ֦ுϙΠϯτ͕ఏڙ͞Ε͍ͯͨ • ίʔυΛಡΜͩ͜ͱɺ͍͔ͭʹཱͭɾɾɾ͔ʂ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ