Slide 1

Slide 1 text

4QSJOH͸ Ͳ͏΍ͬͯ%*͍ͯ͠Δͷ͔ʁ ++6($$$GBMM CBUJ UXJUUFS!CBUJ@

Slide 2

Slide 2 text

4QSJOH$PSFͱ %*ίϯςφ

Slide 3

Slide 3 text

ຊࢿྉͰ࢖༻͢Δ4QSJOU'SBNFXPSLͷόʔδϣϯ͸Ͱ͢ 3

Slide 4

Slide 4 text

4QSJOH$PSF5FDIOPMPHJFT • 4QSJOH'SBNFXPSLͷυΩϡϝϯτΛݟͯΈΔ • ʮᶙ$PSF5FDIOPMPHJFTʯ 4

Slide 5

Slide 5 text

4QSJOH$PSF5FDIOPMPHJFT • 5IF*P$DPOUBJOFS • 3FTPVSDFT • 7BMJEBUJPO %BUB#JOEJOH BOE5ZQF$PODFSTJPO • 4QSJOH&YQSFTTJPO-BOHVBHF 4Q&- • "TQFDU0SJFOUFE1SPHSBNNJOHXJUI4QSJOH • 4QSJOH"01"1*T 5

Slide 6

Slide 6 text

4QSJOH$PSF5FDIOPMPHJFT • 5IF*P$DPOUBJOFS • 3FTPVSDFT • 7BMJEBUJPO %BUB#JOEJOH BOE5ZQF$PODFSTJPO • 4QSJOH&YQSFTTJPO-BOHVBHF 4Q&- • "TQFDU0SJFOUFE1SPHSBNNJOHXJUI4QSJOH • 4QSJOH"01"1*T 6 今日話すのはここ

Slide 7

Slide 7 text

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(); } }

Slide 8

Slide 8 text

@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の管理対象となるインスタンス)

Slide 9

Slide 9 text

@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 定義を探してくれる

Slide 10

Slide 10 text

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!"); } }

Slide 11

Slide 11 text

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なども同じ

Slide 12

Slide 12 text

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してくれる

Slide 13

Slide 13 text

4QSJOHͷίʔυΛಡΜͰΈͨ

Slide 14

Slide 14 text

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(); } }

Slide 15

Slide 15 text

#FBOఆٛͷొ࿥

Slide 16

Slide 16 text

@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アノ テーションがついてるクラスを渡す

Slide 17

Slide 17 text

17 AnnotationConfigApplicationContext#new public AnnotationConfigApplicationContext( Class>... annotatedClasses) { this(); register(annotatedClasses); refresh(); }

Slide 18

Slide 18 text

18 public AnnotationConfigApplicationContext( Class>... annotatedClasses) { this(); register(annotatedClasses); refresh(); } AnnotationConfigApplicationContext#new 引数なしのコンストラクタを呼ぶ

Slide 19

Slide 19 text

19 • ҎԼͷΠϯελϯεΛϑΟʔϧυʹอ࣋ • "OOPUBUFE#FBO%FpOJUJPO3FBEFS • $MBTT1BUI#FBO%FpOJUJPO4DBOOFS AnnotationConfigApplicationContext#new public AnnotationConfigApplicationContext() { this.reader = new AnnotatedBeanDefinitionReader(this); this.scanner = new ClassPathBeanDefinitionScanner(this); }

Slide 20

Slide 20 text

20 public AnnotationConfigApplicationContext( Class>... annotatedClasses) { this(); register(annotatedClasses); refresh(); } AnnotationConfigApplicationContext#new registerメソッドにClass を渡してる

Slide 21

Slide 21 text

#FBOఆٛొ࿥ͷྲྀΕ 21 AnnotationConfig ApplicationContext registerメソッド

Slide 22

Slide 22 text

#FBOఆٛొ࿥ͷྲྀΕ 22 AnnotationConfig ApplicationContext AnnotatedBean DefinitionReader registerメソッド

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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で 表現される

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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を保持する

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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 次はここを見ていく

Slide 30

Slide 30 text

30 AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register BeanDefinitionReaderUtils.registerBeanDefinition( definitionHolder, this.registry); • #FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ

Slide 31

Slide 31 text

31 AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register BeanDefinitionReaderUtils.registerBeanDefinition( definitionHolder, this.registry); • #FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ さっき作ったMyAppクラスのBean定義 を保持するBeanDefinitionHolder

Slide 32

Slide 32 text

32 AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register BeanDefinitionReaderUtils.registerBeanDefinition( definitionHolder, this.registry); • #FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ this.registryって何?

Slide 33

Slide 33 text

33 public AnnotationConfigApplicationContext() { this.reader = new AnnotatedBeanDefinitionReader(this); this.scanner = new ClassPathBeanDefinitionScanner(this); } AnnotationBeanDefinitionReaderの this.registryに、 AnnotationConfigApplicationContextが 代入される

Slide 34

Slide 34 text

34 AnnotationConfigApplicationContext#new => #register => AnnotatedBeanDefinitionReader#register BeanDefinitionReaderUtils.registerBeanDefinition( definitionHolder, this.registry); • #FBO%FpOJUJPO3FBEFS6UJMTSFHJTUFS#FBO%FpOJUJPOʹॲཧΛҕৡ͢Δ this.registryは AnnotationConfigApplicationContext

Slide 35

Slide 35 text

#FBOఆٛొ࿥ͷྲྀΕ 35 AnnotationConfig ApplicationContext AnnotatedBean DefinitionReader registerメソッド

Slide 36

Slide 36 text

#FBOఆٛొ࿥ͷྲྀΕ 36 AnnotationConfig ApplicationContext AnnotatedBean DefinitionReader AnnotatedGeneric BeanDefinition <ੜ੒> Bean定義を表現するクラス

Slide 37

Slide 37 text

#FBOఆٛొ࿥ͷྲྀΕ 37 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry AnnotatedBean DefinitionReader AnnotatedGeneric BeanDefinition <ੜ੒> AnnotationConfigApplicationContextは BeanDefinitionRegistryのサブクラス

Slide 38

Slide 38 text

#FBOఆٛొ࿥ͷྲྀΕ 38 AnnotationConfig ApplicationContext GenericApplication Context BeanDefinition Registry AnnotatedBean DefinitionReader AnnotatedGeneric BeanDefinition <ੜ੒> BeanDefinition ReaderUtils registerBeanDefinitionメソッド beanDefinitionHolderとregistryが引数

Slide 39

Slide 39 text

39 …=> AnnotatedBeanDefinitionReader#register => #registerBean
 => BeanDefinitionReaderUtils#registerBeanDefinition String beanName = definitionHolder.getBeanName(); registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition()); registryにBeanの名前と Bean定義を登録する

Slide 40

Slide 40 text

ͭ·Γ 40 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry AnnotatedBean DefinitionReader AnnotatedGeneric BeanDefinition <ੜ੒> 1 N BeanDefinitionReaderUtils 経由で登録される BeanDefinitionR eaderUtils

Slide 41

Slide 41 text

ͭ·Γ 41 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry AnnotatedBean DefinitionReader AnnotatedGeneric BeanDefinition <ੜ੒> 1 N 登録処理は registerBeanDefinitionメソッド BeanDefinitionR eaderUtils

Slide 42

Slide 42 text

42 this.beanFactory.registerBeanDefinition(beanName, beanDefinition); …=> BeanDefinitionReaderUtils#registerBeanDefinition
 => GenericApplicationContext#registerBeanDefinition this.beanFactoryは、 DefaultListableBeanFactoryインスタンスで 初期化されている

Slide 43

Slide 43 text

%FGBVMU-JTUBCMF#FBO'BDUPSZ

Slide 44

Slide 44 text

%FGBVMU-JTUBCMF#FBO'BDUPSZͷܧঝ 44

Slide 45

Slide 45 text

%FGBVMU-JTUBCMF#FBO'BDUPSZͷܧঝ 45

Slide 46

Slide 46 text

ͭ·Γ 46 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry AnnotatedBean DefinitionReader AnnotatedGeneric BeanDefinition <ੜ੒> 1 N BeanDefinitionR eaderUtils 登録するのは registerBeanDefinitionメソッド

Slide 47

Slide 47 text

ͭ·Γ 47 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry AnnotatedBean DefinitionReader AnnotatedGeneric BeanDefinition <ੜ੒> 1 N DefaultListable BeanFactory registerBeanDefinitionメソッドに 委譲 BeanDefinitionR eaderUtils

Slide 48

Slide 48 text

ͭ·Γ 48 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry AnnotatedBean DefinitionReader AnnotatedGeneric BeanDefinition <ੜ੒> 1 N DefaultListable BeanFactory BeanDefinitionはインスタンス変数の ConcurrentHashMapに保存される BeanDefinitionR eaderUtils

Slide 49

Slide 49 text

public AnnotationConfigApplicationContext( Class>... annotatedClasses) { this(); register(annotatedClasses); refresh(); } ͜͜·ͰΛ੔ཧ 49 • ͕͜͜ऴΘͬͨ • .Z"QQΫϥεͷ#FBOఆٛΛొ࿥ͨ͠

Slide 50

Slide 50 text

͜͜·ͰΛ੔ཧ 50 AnnotationConfig ApplicationContext Generic ApplicationContext AnnotatedBean DefinitionReader DefaultListable BeanFactory BeanDefinition ReaderUtils Class BeanDefinition Holder BeanDefinition Concurrent HashMap BeanDefinition BeanDefinition

Slide 51

Slide 51 text

࣍͸ίϯϙʔωϯτεΩϟϯ

Slide 52

Slide 52 text

52 public AnnotationConfigApplicationContext( Class>... annotatedClasses) { this(); register(annotatedClasses); refresh(); } AnnotationConfigApplicationContext#new • ࣍͸ͬͪ͜ • SFGSFTIϝιου͸਌ΫϥεͰ͋Δ"CTUSBDU"QQMJDBUJPO$POUFYUͰ࣮ ૷͞Ε͍ͯΔ

Slide 53

Slide 53 text

53 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢ #FBO1PTU1SPDFTTPSΛొ࿥͢Δ ϝοηʔδͷॳظԽ΍ΠϕϯτϦεφʔͷొ࿥ͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ੒͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ

Slide 54

Slide 54 text

54 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢ #FBO1PTU1SPDFTTPSΛొ࿥͢Δ ϝοηʔδͷॳظԽ΍ΠϕϯτϦεφʔͷొ࿥ͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ੒͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ ログを出力したりインスタンス 変数を初期化したり

Slide 55

Slide 55 text

55 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢ #FBO1PTU1SPDFTTPSΛొ࿥͢Δ ϝοηʔδͷॳظԽ΍ΠϕϯτϦεφʔͷొ࿥ͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ੒͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ さっきも出てきた DefaultListableBeanFactoryインスタンスに 対していろいろ設定する

Slide 56

Slide 56 text

%FGBVMU-JTUBCMF#FBO'BDUPSZͷܧঝ 56

Slide 57

Slide 57 text

57 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢ #FBO1PTU1SPDFTTPSΛొ࿥͢Δ ϝοηʔδͷॳظԽ΍ΠϕϯτϦεφʔͷొ࿥ͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ੒͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ 次はここ

Slide 58

Slide 58 text

58 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢ #FBO1PTU1SPDFTTPSΛొ࿥͢Δ ϝοηʔδͷॳظԽ΍ΠϕϯτϦεφʔͷొ࿥ͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ੒͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ PostProcessorRegistrationDelegate に委譲する

Slide 59

Slide 59 text

59 …=> AbstractApplicationContext#refresh => PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors J #FBO%FpOJUJPO3FHJTUSZ1PTU1SPDFTTPSΛ࣮૷ͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO%FpOJUJPO3FHJTUSZΛ࣮ߦ JJ #FBO%FpOJUJPO3FHJTUSZ1PTU1SPDFTTPSΛ࣮૷ͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO'BDUPSZΛ࣮ߦ JJJ #FBO'BDUPSZ1PTU1SPDFTTPSΛ࣮૷ͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO'BDUPSZΛ࣮ߦ

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

62 J #FBO%FpOJUJPO3FHJTUSZ1PTU1SPDFTTPSΛܧঝͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO%FpOJUJPO3FHJTUSZΛ࣮ߦ JJ #FBO%FpOJUJPO3FHJTUSZ1PTU1SPDFTTPSΛܧঝͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO'BDUPSZΛ࣮ߦ JJJ #FBO'BDUPSZ1PTU1SPDFTTPSΛܧঝͨ͠Ϋϥεͷ QPTU1SPDFTT#FBO'BDUPSZΛ࣮ߦ 自前のBeanFactoryPostProcessor 今回は定義していない …=> AbstractApplicationContext#refresh => PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors

Slide 63

Slide 63 text

63 ͭ·Γࠓճͷέʔεͩͱ$POpHVSBUJPO$MBTT1PTU1SPDFTTPSͷ ᶃ QPTU1SPDFTT#FBO%FpOJUJPO3FHJTUSZ ᶄ QPTU1SPDFTT#FBO'BDUPSZ ͕࣮ߦ͞ΕΔɻ …=> AbstractApplicationContext#refresh => PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors

Slide 64

Slide 64 text

64 ͭ·Γࠓճͷέʔεͩͱ$POpHVSBUJPO$MBTT1PTU1SPDFTTPSͷ ᶃ QPTU1SPDFTT#FBO%FpOJUJPO3FHJTUSZ ᶄ QPTU1SPDFTT#FBO'BDUPSZ ͕࣮ߦ͞ΕΔɻコンポーネントスキャンしてBean定義 を登録する …=> AbstractApplicationContext#refresh => PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors

Slide 65

Slide 65 text

ίϯϙʔωϯτεΩϟϯͷྲྀΕ 65 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry DefaultListable BeanFactory

Slide 66

Slide 66 text

ίϯϙʔωϯτεΩϟϯͷྲྀΕ 66 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry DefaultListable BeanFactory ConfigurationClass PostProcessor BeanFactoryPostProcessor として呼び出される

Slide 67

Slide 67 text

ίϯϙʔωϯτεΩϟϯͷྲྀΕ 67 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry DefaultListable BeanFactory ConfigurationClass PostProcessor ClassPathScanningCandidate ComponentProvider ݺͼग़͠

Slide 68

Slide 68 text

ίϯϙʔωϯτεΩϟϯͷྲྀΕ 68 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinitionR egistry DefaultListable BeanFactory ConfigurationClassP ostProcessor .classϑΝΠϧ ClassPathScanningCandidate ComponentProvider ݺͼग़͠ ୳͢ PathMatchingResourcePatternResolver を使ってclassファイルを探す File#listFilesを使って探索する

Slide 69

Slide 69 text

ίϯϙʔωϯτεΩϟϯͷྲྀΕ 69 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinitionR egistry DefaultListable BeanFactory ConfigurationClassP ostProcessor .classϑΝΠϧ ClassPathScanningCandidate ComponentProvider ݺͼग़͠ ୳͢&ղੳ ClassReaderと AnnotationMetadataReadingVisitorを使っ てclassファイルのバイトコードを解析する

Slide 70

Slide 70 text

ίϯϙʔωϯτεΩϟϯͷྲྀΕ 70 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry DefaultListable BeanFactory ConfigurationClass PostProcessor .classϑΝΠϧ ScannedBean Definition ClassPathScanningCandidate ComponentProvider ݺͼग़͠ ୳͢&ղੳ ੜ੒ Beanとなるクラスのみ

Slide 71

Slide 71 text

ίϯϙʔωϯτεΩϟϯͷྲྀΕ 71 AnnotationConfig ApplicationContext Generic ApplicationContext BeanDefinition Registry DefaultListable BeanFactory ConfigurationClassP ostProcessor .classϑΝΠϧ ScannedBean Definition ClassPathScanningCandidate ComponentProvider ݺͼग़͠ ୳͢&ղੳ ੜ੒ 1 N BeanDefinitionReaderUtilsに よって登録される 最初のBean定義の登録と同じ

Slide 72

Slide 72 text

72 ͭ·Γࠓճͷέʔεͩͱ$POpHVSBUJPO$MBTT1PTU1SPDFTTPSͷ ᶃ QPTU1SPDFTT#FBO%FpOJUJPO3FHJTUSZ ᶄ QPTU1SPDFTT#FBO'BDUPSZ ͕࣮ߦ͞ΕΔɻコンポーネントスキャンが終わった …=> AbstractApplicationContext#refresh => PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors

Slide 73

Slide 73 text

73 ͭ·Γࠓճͷέʔεͩͱ$POpHVSBUJPO$MBTT1PTU1SPDFTTPSͷ ᶃ QPTU1SPDFTT#FBO%FpOJUJPO3FHJTUSZ ᶄ QPTU1SPDFTT#FBO'BDUPSZ ͕࣮ߦ͞ΕΔɻ ConfigurationClassEnhancer#enhance でMyAppをCGLIBのサブクラス化 AOPでプロキシ化する時にCGLIBを使う …=> AbstractApplicationContext#refresh => PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors

Slide 74

Slide 74 text

74 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢ #FBO1PTU1SPDFTTPSΛొ࿥͢Δ ϝοηʔδͷॳظԽ΍ΠϕϯτϦεφʔͷొ࿥ͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ੒͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ 終わり

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

࣍͸#FBOΛੜ੒

Slide 78

Slide 78 text

78 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢ #FBO1PTU1SPDFTTPSΛొ࿥͢Δ ϝοηʔδͷॳظԽ΍ΠϕϯτϦεφʔͷొ࿥ͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ੒͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ ここを見ていく

Slide 79

Slide 79 text

79 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh • TJOHMFUPOείʔϓͷ#FBOΛੜ੒ finishBeanFactoryInitialization(beanFactory); beanFactory.preInstantiateSingletons(); beanFactoryはDefaultListableBeanFactory

Slide 80

Slide 80 text

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); } }

Slide 81

Slide 81 text

"CTUSBDU#FBO'BDUPSZ HFU#FBO

Slide 82

Slide 82 text

• #FBOఆٛͷEFQFOETPOଐੑΛղܾ IUUQEPDTTQSJOHJPTQSJOHEPDTDVSSFOUTQSJOHGSBNFXPSLSFGFSFODFIUNMTJOHMFCFBOT GBDUPSZEFQFOETPO String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { AbstractBeanFactory#getBean

Slide 83

Slide 83 text

• #FBOΛੜ੒͢Δͱ͜Ζʂ • είʔϓʹԠͯ͡෼ذ • ࠓճ͸TJOHMFUPOείʔϓͷ৔߹Λݟ͍ͯ͘ // Create bean instance. if (mbd.isSingleton()) { } else if (mbd.isPrototype()) { } else { } AbstractBeanFactory#getBean

Slide 84

Slide 84 text

HFU#FBOͷྲྀΕ 84 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory AbstractAutowireCapable BeanFactory getBeanメソッド

Slide 85

Slide 85 text

HFU#FBOͷྲྀΕ 85 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry getSingleton メソッド

Slide 86

Slide 86 text

%FGBVMU-JTUBCMF#FBO'BDUPSZͷܧঝ 86

Slide 87

Slide 87 text

87 DefaultSingletonBeanRegistry#getSingleton • TJOHMFUPOείʔϓͷ#FBOΛੜ੒ࡁΈ͔Ͳ͏͔Λௐ΂Δ • ੜ੒ࡁΈͷ৔߹͸ͦΕΛฦ͚ͩ͢ synchronized (this.singletonObjects) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { // Beanを生成する処理 } return (singletonObject != NULL_OBJECT ? singletonObject : null); }

Slide 88

Slide 88 text

HFU#FBOͷྲྀΕ 88 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry getSingleton メソッド

Slide 89

Slide 89 text

HFU#FBOͷྲྀΕ 89 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry createBean メソッド

Slide 90

Slide 90 text

%FGBVMU-JTUBCMF#FBO'BDUPSZͷܧঝ 90

Slide 91

Slide 91 text

91 AbstractAutowireCapableBeanFactory#createBean J #FBO%FpOJUJPOͱ#FBO໊͔Β#FBOͷ$MBTTΠϯελϯεΛऔಘ JJ $MBTTΠϯελϯε͔Β#FBOΛੜ੒ • ίϯετϥΫλΠϯδΣΫγϣϯ JJJ ੜ੒ͨ͠#FBOʹରͯ͠ɺϑΟʔϧυɾηολʔΠϯδΣΫγϣϯ JW ੜ੒ͨ͠#FBOʹରͯ͠ɺ#FBO1PTU1SPDFTTPSͱJOJUNFUIPEͷॲཧ

Slide 92

Slide 92 text

92 AbstractAutowireCapableBeanFactory#createBean J #FBO%FpOJUJPOͱ#FBO໊͔Β#FBOͷ$MBTTΠϯελϯεΛऔಘ JJ $MBTTΠϯελϯε͔Β#FBOΛੜ੒ • ίϯετϥΫλΠϯδΣΫγϣϯ JJJ ੜ੒ͨ͠#FBOʹରͯ͠ɺϑΟʔϧυɾηολʔΠϯδΣΫγϣϯ JW ੜ੒ͨ͠#FBOʹରͯ͠ɺ#FBO1PTU1SPDFTTPSͱJOJUNFUIPEͷॲཧ

Slide 93

Slide 93 text

HFU#FBOͷྲྀΕ 93 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry createBean メソッド

Slide 94

Slide 94 text

HFU#FBOͷྲྀΕ 94 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry resolveBeanClass メソッド

Slide 95

Slide 95 text

HFU#FBOͷྲྀΕ 95 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListableB eanFactory Abstract BeanFactory AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry @ConfigurationのBean定義についてはClassイ ンスタンスを返すだけ コンポーネントスキャンしたBean定義について はClassインスタンスを生成する必要がある

Slide 96

Slide 96 text

HFU#FBOͷྲྀΕ 96 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry ClassLoaderインスタンス を保持してる

Slide 97

Slide 97 text

HFU#FBOͷྲྀΕ 97 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListableBea nFactory Abstract BeanFactory AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry ClassLoaderとBeanDefinitionが 持つクラス名を引数で渡し、Class インスタンスを取得する ClassLoader#loadClass ClassUtils

Slide 98

Slide 98 text

98 AbstractAutowireCapableBeanFactory#createBean J #FBO%FpOJUJPOͱ#FBO໊͔Β#FBOͷ$MBTTΠϯελϯεΛऔಘ JJ $MBTTΠϯελϯε͔Β#FBOΛੜ੒ • ίϯετϥΫλΠϯδΣΫγϣϯ JJJ ੜ੒ͨ͠#FBOʹରͯ͠ɺϑΟʔϧυɾηολʔΠϯδΣΫγϣϯ JW ੜ੒ͨ͠#FBOʹରͯ͠ɺ#FBO1PTU1SPDFTTPSͱJOJUNFUIPEͷॲཧ

Slide 99

Slide 99 text

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!"); } }

Slide 100

Slide 100 text

100 AbstractAutowireCapableBeanFactory#createBean • ίϯετϥΫλҾ਺ͷ$POTUSVDUPSΠϯελϯεΛऔಘ͢Δ෦෼ • ࠓճͷαϯϓϧͩͱ)FMMP8PSME4FSWJDFͷ#FBOఆٛʹରͯ͠ɺ 1SJOU4FSWJDFΫϥεͷ$POTUSVDUPSΠϯελϯεΛऔಘ͢Δ • Ұ෦ͷ#FBO1PTU1SPDFTTPSΛ࢖༻ͯ͠औಘ͢Δ • 4NBSU*OTUBOUJBUJPO"XBSF#FBO1PTU1SPDFTTPSΛܧঝͨ͠ #FBO1PTU1SPDFTTPS • ࠓճ͸"VUPXJSF"OOPUBUJPO#FBO1PTU1SPDFTTPS͕֘౰ Constructor>[] ctors = determineConstructorsFromBeanPostProcessors( beanClass, beanName);

Slide 101

Slide 101 text

101 AbstractAutowireCapableBeanFactory#createBean • #FBO%FpOJUJPOͱऔಘͨ͠$POTUSVDUPSΠϯελϯεΛ࢖ͬͯίϯε τϥΫλΠϯδΣΫγϣϯ͢Δ෦෼ • ࠓճͷαϯϓϧͩͱɺҎԼΛ࢖ͬͯίϯετϥΫλΠϯδΣΫγϣ ϯ͢Δ • )FMMP8PSME4FSWJDFͷ#FBO%FpOJUJPO • 1SJOU4FSWJDFͷ$POTUSVDUPSΠϯελϯε new ConstructorResolver(this) .autowireConstructor(beanName, mbd, ctors, explicitArgs);

Slide 102

Slide 102 text

102 Abstract BeanFactory AbstractAutowireCapable BeanFactory Constructor Resolver getBean ここがBean生成のスタート HelloWorldServiceのBeanを 生成しようとしてる

Slide 103

Slide 103 text

103 Abstract BeanFactory AbstractAutowireCapable BeanFactory Constructor Resolver getBean HelloWorldServiceにPrintService をコンストラクタインジェクショ ンをしようとしてるとこ

Slide 104

Slide 104 text

104 Abstract BeanFactory AbstractAutowireCapable BeanFactory Constructor Resolver DefaultListable BeanFactory getBean PrintServiceのBeanを取得するた めにresolveDependencyメソッド を呼ぶ

Slide 105

Slide 105 text

105 Abstract BeanFactory AbstractAutowireCapable BeanFactory Constructor Resolver DefaultListable BeanFactory getBean Bean生成のため再帰的に getBeanを呼ぶことになる

Slide 106

Slide 106 text

106 Abstract BeanFactory AbstractAutowireCapable BeanFactory Constructor Resolver DefaultListable BeanFactory getBean PrintServiceのBeanが 返ってくる

Slide 107

Slide 107 text

107 Abstract BeanFactory AbstractAutowireCapable BeanFactory Constructor Resolver SimpleInstantiation Strategy DefaultListable BeanFactory BeanUtils getBean Constructor#newInstanceと PrintServiceのBeanを使って HelloWorldServiceのBeanを生成

Slide 108

Slide 108 text

108 Abstract BeanFactory AbstractAutowireCapable BeanFactory Constructor Resolver SimpleInstantiation Strategy DefaultListable BeanFactory BeanUtils getBean Constructor#newInstanceと PrintServiceのBeanを使って HelloWorldServiceのBeanを生成 コンストラクタインジェクション!

Slide 109

Slide 109 text

109 AbstractAutowireCapableBeanFactory#createBean J #FBO%FpOJUJPOͱ#FBO໊͔Β#FBOͷ$MBTTΠϯελϯεΛऔಘ JJ $MBTTΠϯελϯε͔Β#FBOΛੜ੒ • ίϯετϥΫλΠϯδΣΫγϣϯ JJJ ੜ੒ͨ͠#FBOʹରͯ͠ɺϑΟʔϧυɾηολʔΠϯδΣΫγϣϯ JW ੜ੒ͨ͠#FBOʹରͯ͠ɺ#FBO1PTU1SPDFTTPSͱJOJUNFUIPEͷॲཧ populateBeanメソッド 内で実施してる initializeBeanメソッド 内で実施してる

Slide 110

Slide 110 text

HFU#FBOͷྲྀΕΛ੔ཧ 110 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry createBean

Slide 111

Slide 111 text

HFU#FBOͷྲྀΕΛ੔ཧ 111 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry Beanの出来上がり!

Slide 112

Slide 112 text

HFU#FBOͷྲྀΕΛ੔ཧ 112 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry 出来上がったBeanを後で使えるよう に取っておく

Slide 113

Slide 113 text

HFU#FBOͷྲྀΕΛ੔ཧ 113 AnnotationConfig ApplicationContext Generic ApplicationContext DefaultListable BeanFactory Abstract BeanFactory AbstractAutowireCapable BeanFactory DefaultSingleton BeanRegistry getBeanメソッド終了!

Slide 114

Slide 114 text

114 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢ #FBO1PTU1SPDFTTPSΛొ࿥͢Δ ͦͷଞ΋Ζ΋Ζ TJOHMFUPOείʔϓͷ#FBOΛੜ੒͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ 終わり

Slide 115

Slide 115 text

115 public AnnotationConfigApplicationContext( Class>... annotatedClasses) { this(); register(annotatedClasses); refresh(); } AnnotationConfigApplicationContext#new • ͍ͭʹ"OOPUBUJPO$POpH"QQMJDBUJPO$POUFYUͷίϯετϥΫλ͕ऴ Θͬͨɾɾɾ

Slide 116

Slide 116 text

@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׬੒ʂ

Slide 117

Slide 117 text

@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ΛऔಘͰ͖Δ

Slide 118

Slide 118 text

;Γ͔͑ͬͯΈΔ

Slide 119

Slide 119 text

• ;Γ͔͑ͬͯΈΔ • #FBOఆٛͷొ࿥ • ίϯϙʔωϯτεΩϟϯ • #FBOੜ੒ʢίϯετϥΫλΠϯδΣΫγϣϯʣ 119

Slide 120

Slide 120 text

• #FBOఆٛͷొ࿥ • "OOPUBUFE#FBO%FpOJUJPO3FBEFSͷίϯετϥΫλͰϑϨʔϜ ϫʔΫͰ࢖͏#FBOఆ͕ٛొ࿥͞ΕΔ • "OOPUBUFE#FBO%FpOJUJPO3FBEFSͰ!$POpHVSBUJPO͕͍ͭͯ ΔΫϥεͷ#FBOఆٛΛ#FBO%FpOJUJPOʹม׵͢Δ • #FBO%FpOJUJPO͕࠷ऴతʹอଘ͞ΕΔ৔ॴ͸ɺ %FGBVMU-JTUBCMF#FBO'BDUPSZͷΠϯελϯεม਺ 120

Slide 121

Slide 121 text

• ίϯϙʔωϯτεΩϟϯ • $POpHVSBUJPO$MBTT1PTU1SPDFTTPSQPTU1SPDFTT#FBO%FpOJ UJPO3FHJTUSZ͔Β࢝·Δ • ʢ"OOPUBUFE#FBO%FpOJUJPO3FBEFSͷίϯετϥΫλͰ#FBO ొ࿥͞ΕͯΔʣ 121

Slide 122

Slide 122 text

• #FBOੜ੒ʢίϯετϥΫλΠϯδΣΫγϣϯʣ • "CTUSBDU#FBO'BDUPSZHFU#FBO͔Β࢝·Δ • "VUPXJSFE"OOPUBUJPO#FBO1PTU1SPDFTTPSͰίϯετϥΫλ ΠϯδΣΫγϣϯͷҾ਺Λղܾ • ʢ"OOPUBUFE#FBO%FpOJUJPO3FBEFSͷίϯετϥΫλͰ#FBO ొ࿥͞ΕͯΔʣ 122

Slide 123

Slide 123 text

• #FBO%FpOJUJPO3FBEFS • #FBO%FpOJUJPOΛੜ੒ • $POpHVSBUJPO$MBTT1PTU1SPDFTTPSΛొ࿥ • "VUPXJSFE"OOPUBUJPO#FBO1PTU1SPDFTTPSΛొ࿥ • %FGBVMU-JTUBCMF'BDUPSZ • #FBO%FpOJUJPOΛอ࣋ • #FBOੜ੒ 123

Slide 124

Slide 124 text

• ͋Εʁ • #FBO%FpOJUJPO3FBEFSͱ%FGBVMU-JTUBCMF#FBO'BDUPSZ͑͋͞Ε ͹ಈ͘Μ͡Όͳ͍ʁ • ʢ"QQMJDBUJPO$POUFYU͍Βͳ͘ͳ͍ʁʣ • ࣮ࡍɺࢼͯ͠ΈͨΒಈ͍ͨ 124

Slide 125

Slide 125 text

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();

Slide 126

Slide 126 text

;Γ͔͑ͬͯΈΔ 126 • %*ʹؔ͢ΔΞϨίϨΛ΍Δͷʹඞཁͳͷ͸ɺ#FBO'BDUPSZͱ #FBO%FpOJUJPO3FBEFSͩͬͨ • IUUQEPDTTQSJOHJPTQSJOHEPDTDVSSFOUTQSJOHGSBNFXPSLSFGFSFODFIUNMTJOHMF DPOUFYUJOUSPEVDUJPODUYWTCFBOGBDUPSZ • %FGBVMU-JTUBCMF#FBO'BDUPSZͷ࢓ࣄଟ͗͢ʂܧঝ͕ෳࡶʂ • ֤ΠϯλϑΣʔεͷ໾ׂΛͬ͘͟Γ೺Ѳ͢ΔͱಡΈ΍͘͢ͳΔ • ࢥͬͯͨΑΓ΋৭ʑͳػೳɺ֦ுϙΠϯτ͕ఏڙ͞Ε͍ͯͨ • ίʔυΛಡΜͩ͜ͱ͸ɺ͍͔ͭ໾ʹཱͭɾɾɾ͔΋ʂ

Slide 127

Slide 127 text

;Γ͔͑ͬͯΈΔ 127 • %*ʹؔ͢ΔΞϨίϨΛ΍Δͷʹඞཁͳͷ͸ɺ#FBO'BDUPSZͱ #FBO%FpOJUJPO3FBEFSͩͬͨ • IUUQEPDTTQSJOHJPTQSJOHEPDTDVSSFOUTQSJOHGSBNFXPSLSFGFSFODFIUNMTJOHMF DPOUFYUJOUSPEVDUJPODUYWTCFBOGBDUPSZ • %FGBVMU-JTUBCMF#FBO'BDUPSZͷ࢓ࣄଟ͗͢ʂܧঝ͕ෳࡶʂ • ֤ΠϯλϑΣʔεͷ໾ׂΛͬ͘͟Γ೺Ѳ͢ΔͱಡΈ΍͘͢ͳΔ • ࢥͬͯͨΑΓ΋৭ʑͳػೳɺ֦ுϙΠϯτ͕ఏڙ͞Ε͍ͯͨ • ίʔυΛಡΜͩ͜ͱ͸ɺ͍͔ͭ໾ʹཱͭɾɾɾ͔΋ʂ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ