Share
Embed
Transcript
127 slides
-
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してくれる -
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(); } } -
@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アノ テーションがついてるクラスを渡す -
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> を渡してる -
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ఆٛొͷྲྀΕ 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 -
ͭ·Γ 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インスタンスに 対していろいろ設定する -
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 -
ίϯϙʔωϯτεΩϟϯͷྲྀΕ 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 -
78 AnnotationConfigApplicationContext#new => AbstractApplicationContext#refresh ४උ͢Δ #FBO'BDUPSZΛ४උ͢Δ #FBO'BDUPSZ1PTU1SPDFTTPSΛݺͼग़͢
#FBO1PTU1SPDFTTPSΛొ͢Δ ϝοηʔδͷॳظԽΠϕϯτϦεφʔͷొͳͲ TJOHMFUPOείʔϓͷ#FBOΛੜ͢Δ $POUFYU3FGSFTIFE&WFOUͷൃߦͳͲ ここを見ていく -
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); } } -
• #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 メソッド -
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 メソッド -
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); -
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を呼ぶことになる -
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ΛऔಘͰ͖Δ -
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ͷࣄଟ͗͢ʂܧঝ͕ෳࡶʂ
• ֤ΠϯλϑΣʔεͷׂΛͬ͘͟ΓѲ͢ΔͱಡΈ͘͢ͳΔ • ࢥͬͯͨΑΓ৭ʑͳػೳɺ֦ுϙΠϯτ͕ఏڙ͞Ε͍ͯͨ • ίʔυΛಡΜͩ͜ͱɺ͍͔ͭʹཱͭɾɾɾ͔ʂ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ