æ¥ã®Habrã¯éããŠããããã§ãã ãWhy I Hate Springããšããèšäºã®ç¿»èš³è ãšã³ã¡ã³ããŒã¿ãŒã«æè¬ããŸããã¿ã€ãã«ã®åŒ·ãåŠå®çãªã¡ãã»ãŒãžã«ãããããããå€ãã®èå³æ·±ãè°è«ãåŒãèµ·ãããŸããããŸããç§ã®æåŸã®èšäº2017幎ã®Springã®æžãæ¹ã«çããŠãããŸãã ã ååã®èšäºãžã®ã³ã¡ã³ãã®ãããã§ããã®èšäºãç»å ŽããŸããã
ä»åã¯ãSpringãã¬ãŒã ã¯ãŒã¯ã®æ·±intoã«é£ã³èŸŒã¿ããã®éæ³ãå ¬éããåºæ¬çãªWebã¢ããªã±ãŒã·ã§ã³ãå éšããã©ã®ããã«èŠãããã確èªããã©ã®ãããªã¿ã¹ã¯ãšSpring Bootãããã解決ããããç解ããŸãã
åã®èšäºãžã®ã³ã¡ã³ãã§ãäœäººãã®äººã ã¯ãæ¥ã®Hello Worldã®äŸã¯ãŸã ããŸã瀺åçã§ã¯ãªããšææããŸããã Springã¯ãç¹ã«Spring Bootã䜿çšãããšãã·ã³ãã«ããšå šèœã®æèŠãäžããŸããããã¬ãŒã ã¯ãŒã¯ã®åºæ¬ãšå èãç解ããŠããªããšããã°ã®ã¹ã¿ãã¯ãã¬ãŒã¹ãååŸãã倧ããªå±éºã«ã€ãªãããŸãã ããŠãäœãèµ·ããŠããã®ããšããå®å šãªéæ³ã®æèŠãå°ãã§ãææããããã«ãä»æ¥ã¯ã¢ããªã±ãŒã·ã§ã³ãåã®èšäºããåãäžãããã¬ãŒã ã¯ãŒã¯å ã§ã©ã®ããã«äœãèµ·ãã£ãŠããã®ããããŒãããããã¯ããŠããåé¡ãåæããŸãã 察象èªè ã¯ãŸã åå¿è ã®éçºè ã§ãããJavaãšSpringã®çµéšãšåºæ¬çãªç¥èããããŸãã ãã ããçµéšè±å¯ãªSpringãŠãŒã¶ãŒã«ãšã£ãŠã¯ãå éšã§äœãèµ·ããŠãããã«ã€ããŠã®ç¥èãæŽæ°ããããšã¯èå³æ·±ããããããŸããã
ããŒã³ã³ã»ãã
ãã³
Springã®æãåºæ¬çãªæŠå¿µã§ã«ããŒãç Žãå§ããŸãããã Beanã¯ãæãäžè¬çãªãªããžã§ã¯ãã«ãããŸããã å¯äžã®éãã¯ãSpringã«ãã£ãŠç®¡çãããDIã³ã³ããå ã«ååšãããªããžã§ã¯ããBeanã§åŒã³åºãã®ãäžè¬çã§ããããšã§ãã Springã®ã»ãšãã©ãã¹ãŠã¯Beanã§ã-ãµãŒãã¹ãã³ã³ãããŒã©ãŒããªããžããªãŒãå®éãã¢ããªã±ãŒã·ã§ã³å šäœã¯Beanã®ã»ããã§æ§æãããŠããŸãã ãããã¯ãç»é²ãäŸåé¢ä¿ãšããŠåä¿¡ããããã·ãã³ããæ¿¡ããªã©ã«ã§ããŸãã
DIã³ã³ãã
Springã®éèŠãã€åºæ¬çãªã¡ã«ããºã ã å€èŠ³ã¯éåžžã«ã·ã³ãã«ã§ãããå éšã«ã¯äŸåé¢ä¿ã埮調æŽããããã®å€ãã®ã¡ã«ããºã ãçšæãããŠããŸãã åºæ¬çã«ãSpringã¢ããªã±ãŒã·ã§ã³ã¯ãDIã³ã³ãããä»ããŠæ¥ç¶ãããBeanã®ã³ã¬ã¯ã·ã§ã³ã§ãã
å€ãã®å ŽåãSpringã«ã€ããŠè°è«ãããšãã軜éã®DIã³ã³ããïŒGuiceãªã©ïŒã«ç°¡åã«çœ®ãæããããšãã§ããåãããã«ãªããŸãããããç°¡åã§ã·ã³ãã«ã«ãªããšããè°è«ããããŸãã ãããŠãããã§ç解ããããšã¯éåžžã«éèŠã§ã-Spring DIã®äŸ¡å€ã¯ããã®å¯çšæ§ã®äºå®ã§ã¯ãªãããã®åºæ¬çãªæ§è³ªã«ãããŸãã å®éãSpringãšã³ã·ã¹ãã ã®ãã¹ãŠã®ã©ã€ãã©ãªã¯ããã®ã³ã³ããïŒSpringèªäœãå«ãïŒã«Beanãç»é²ããã ãã§ããäŸåé¢ä¿ã®æ³šå
¥ãéããŠãã¢ããªã±ãŒã·ã§ã³éçºè
ã¯å¿
èŠãªã³ã³ããŒãã³ããååŸã§ããŸãã ç°¡åãªäŸïŒ Spring Security OAuthã䜿çšããå Žåã application.properties
ã§OAuthãã©ã¡ãŒã¿ãŒãæ§æapplication.properties
ãšãSpring Securityã¯OAuth2RestTemplate
ãæäŸããŸãããããã³ãŒãã«æ¿å
¥ããã ãã§ãã å€éšAPIãåŒã³åºããšããã®Beanã¯OAuthããŒã¯ã³ãååŸããå Žæãšæ¹æ³ãæŽæ°ããæ¹æ³ããªã¯ãšã¹ãã«è¿œå ããå Žæãªã©ãèªèããŸãã ãããã£ãŠãããã§ã®DIã®äŸ¡å€ã¯ããããç§ãã¡ã®ã³ãŒããšSpring Securityã®éã®åãªãéä¿¡ã¡ã«ããºã ã§ãããšããããšã§ãã ãŸããDIå®è£
ãGuiceã«çœ®ãæããã ãã§ã¯ãSpring Securityãããã䜿çšãå§ããããšããããŸããã ãŸãããã®æ°ããDIã§ãã¹ãŠã®Springã©ã€ãã©ãªãšçµ±åãããŠããªãå Žåããã®äŸ¡å€ã¯å€§å¹
ã«äœäžããŸãã
DIã³ã³ããã«ã€ããŠè°è«ãããšãã«å€ãã®äººãèŠéããã1ã€ã®éåžžã«éèŠãªç¹ã¯ãäŸåæ§æ³šå ¥ã䜿çšããŠãã åã³ã³ããŒãã³ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããããšãæå³ããªãããšã§ãã ããã¯éåžžã«åçŽãªã¢ã€ãã¢ã§ããããã®åçŽãã®ããã«ãå¿ ãããæçœã§ã¯ãªãããšãäœåºŠãèŠãŠããŸããã ããã«ãã€ã³ã¿ãŒãã§ãŒã¹ã1ã€ããå®è£ ãããŠããªãå Žåãã€ã³ã¿ãŒãã§ãŒã¹ãäœæããããšã¯æªãç¿æ £ãšèŠãªãããŸãã ããªãã¡ ã¯ã©ã¹èªäœã¯DIãªããžã§ã¯ãã§ããå¯èœæ§ããããŸãã ããã«ãã€ã³ã¿ãŒãã§ãŒã¹ããªããŠãããã¹ãã§æ¿¡ããã®ãé²ãããšã¯ã§ããŸããã ããšãã°ãMockitoã¯ããŠã§ããã¯ã©ã¹ãååŸããæ¹æ³ãç¥ã£ãŠããŸãã
ã³ã³ããã¹ã
ApplicationContext
ã€ã³ã¿ãŒãã§ã€ã¹ã«ãã£ãŠæ瀺ãããŸãã å®éãSpringã¢ããªã±ãŒã·ã§ã³ãã®ãã®ã§ãã ã³ã³ããã¹ãã¯ãã¢ããªã±ãŒã·ã§ã³å
ã§çºçããããŸããŸãªã€ãã³ãã«å¿çããŠãBeanã®ã©ã€ããµã€ã¯ã«ãå¶åŸ¡ããæ©èœãæäŸããŸãïŒããšãã°ãã·ã³ã°ã«ãã³ãšããŠäœæãããããªã¯ãšã¹ãããšã«äœæããŸãïŒã
æ§æ
ãã®ãããã¢ããªã±ãŒã·ã§ã³ãBeanã®ã»ããã§ããå Žåããããæ©èœãããã«ã¯ããã®ã»ãããèšè¿°ããå¿ èŠããããŸãã
æ§æã¯ã䜿çšå¯èœãªBeanã®åãªã説æã§ãã Springã¯ãã¢ããªã±ãŒã·ã§ã³ã圢æããBeanã®ã»ãããèšè¿°ããããã®ããã€ãã®ãªãã·ã§ã³ãæäŸããŸãã å±¥æŽãªãã·ã§ã³ã¯ãäžé£ã®xmlãã¡ã€ã«ã䜿çšããŸã ã æè¿ã§ã¯ã Javaã¢ãããŒã·ã§ã³ãããã«åã£ãŠä»£ãããŸããã Spring Bootã¯æ³šéã«åºã¥ããŠæ§ç¯ãããŠãããååãšããŠãã»ãšãã©ã®ææ°ã®ã©ã€ãã©ãªã¯æ³šéã䜿çšããŠæ§æããããšãã§ããŸãã 第3äžä»£ã§ã¯ã Beanæ§æã¯æ©èœçãªBeanç»é²ã¢ãããŒãã«ãªããŸãããããã¯ãè¿ã ç»å ŽããSpring 5ã®éèŠãªæ°æ©èœã®1ã€ã§ãã
å žåçãªæ§æã¯ã©ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
@Configuration class PaymentsServiceConfiguration { @Bean public PaymentProvider paymentProvider() { return new PayPalPaymentProvider(); } @Bean public PaymentService paymentService(PaymentProvider paymentProvider) { return new PaymentService(paymentProvider); } }
ãã®æ§æã¯2ã€ã®ãã³ãå®çŸ©ãã2çªç®ã®ãã³ã¯æåã®ãã³ã«äŸåããŸãã ãããŠããã§ãSpringãPaymentProvider
ãŸãPaymentProvider
ã€ã³ã¹ã¿ã³ã¹ãèŠæ±ãããšãSpringã¯ã³ã³ããã¹ãå
ã§ãããèŠã€ããŠæäŸããŸãã
èšå®ã¯1ã€ã®å·šå€§ãªãã¡ã€ã«ã§èšè¿°ããå¿
èŠã¯ãããŸãããè€æ°ã®ãã¡ã€ã«ã«åå²ãã @Import
ã¢ãããŒã·ã§ã³ã䜿çšããŠããããçµåã§ããŸãã
ã³ã³ããŒãã³ãã¹ãã£ã³
Spring Frameworkã®ããªãéèŠãªã³ã³ããŒãã³ãã§ãããã¢ããªã±ãŒã·ã§ã³æ§æãç°¡çŽ åãããã1ã€ã®ã¢ãããŒãã§ãã ã¢ã€ãã¢ã¯éåžžã«ã·ã³ãã«ã§ãMyCoolComponent
ã¯ã©ã¹ãMyCoolComponent
ãšããååã®Beanãç»é²ããå¿
èŠãããããšãããã£ãŠããå Žåãæ¯å@Bean MyCoolComponent myCoolComponent(dependencies...) { return new MyCoolComponent(dependencies...); }
@Bean MyCoolComponent myCoolComponent(dependencies...) { return new MyCoolComponent(dependencies...); }
ïŒ ç®çã®ã¯ã©ã¹ã«åºã¥ããŠãSpringã«èªåçã«ç»é²ããŠãã³ãäœæãããªãã®ã¯ãªãã§ããïŒ ãã®ã¿ã¹ã¯ã¯ãã³ã³ããŒãã³ããã¹ãã£ã³ããããšã§è§£æ±ºãããŸãã ããªãã¡ ã¯ã©ã¹ã次ã®ããã«å®£èšãããš
@Component class MyCoolComponent { MyCoolComponent(dependencies...) { } }
ã³ã³ããŒãã³ãã¹ãã£ã³ãæå¹ã«ããŸãmyCoolComponent
ã¯ãã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒãšãã¹ãŠã®äŸåé¢ä¿ã䜿çšããŠã myCoolComponent
ãšããååã®Beanãäœæããã³ç»é²ããŸãã
ã³ã³ããŒãã³ãã®ã¹ãã£ã³ã«ã¯æ³šæããå¿ èŠããããŸãã å®éãã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããã¹ããæé»çã«å€æŽããŸãã ããšãã°ãã€ã³ã¿ãŒãã§ã€ã¹ãš2ã€ã®å®è£ ããããããããã«@Component
ãæå®ãããŠããå Žåãã€ã³ã¿ãŒãã§ã€ã¹ã«äŸåé¢ä¿ãæ¿å ¥ããããšãããšãSpringã¯èŠæ±ãæºãã2ã€ã®BeanããããšããäŸå€ãã¹ããŒããŸãã
ãŸãšã
èŠããŠããã¹ãããšïŒ ApplicationContext
ã€ã³ã¿ãŒãã§ãŒã¹ã«ãã£ãŠèšè¿°ãããSpringã¢ããªã±ãŒã·ã§ã³ã¯ãDIã³ã³ãããŒã«ãã£ãŠç®¡çããããªããžã§ã¯ãïŒ Bean ïŒã®ã³ã¬ã¯ã·ã§ã³ã§ãã Beanã®ã»ããã¯ãæ§æã¯ã©ã¹ïŒ @Configuration
ã¢ãããŒã·ã§ã³ïŒã䜿çšããŠæ§æãããã€ã³ããŒãïŒ @Import
ã¢ãããŒã·ã§ã³ïŒã䜿çšããŠçµåã§ããŸãã
æ¥ã®ããŒã
次ã®éšåã«é²ã¿ãŸãã MySQLããŒã¿ããŒã¹ãžã®æ¥ç¶ãèšå®ããå¿
èŠããããšããŸãã Hibernate㧠Spring Data JPAããããã€ããŒãšããŠäœ¿çšããå Žåã¯ãããã€ãã®Beanãæ§æããå¿
èŠããããŸãEntityManagerFactory
ïŒã¡ã€ã³JPAã¯ã©ã¹ïŒãJDBCãã©ã€ããŒãä»ããŠããŒã¿ããŒã¹ã«çŽæ¥æ¥ç¶ããããã®DataSource
ãªã© ããããäžæ¹ã§ãæ¯åå®è¡ããå®éã«ã¯åãããšãå®è¡ããå Žåãèªååããªãã®ã¯ãªãã§ããïŒ ããŒã¿ããŒã¹ãžã®æ¥ç¶æååãæå®ããMySQLãã©ã€ããŒãžã®äŸåé¢ä¿ãè¿œå ããå ŽåãMySQLãæäœããããã«å¿
èŠãªãã¹ãŠã®Beanãèªåçã«äœæããŠã¿ãŸãããïŒ ãããSpring Bootã®æ©èœã§ãã åºæ¬çã«ã Spring Bootã¯ãã³ã³ããã¹ãã§å¿
èŠãªBeanãäœæããæ§æã¯ã©ã¹ã®åãªãã³ã¬ã¯ã·ã§ã³ã§ãã åæ§ã«ãæã§äœæããããšãã§ããŸããBootããããèªååããŸãã
èªåèšå®
Spring Bootã®éèŠãªæŠå¿µã¯èªåæ§æã§ãã åºæ¬çã«ãã¢ããªã±ãŒã·ã§ã³å ã®ç¹å®ã®Beanãäœæããã³ç»é²ããæ§æã¯ã©ã¹ã®ã»ããã«ãããŸããã æŠã㊠ã Embedded Servlet Containerèªäœã§ãããèšå®å¯èœãªå¥ã®Beanã«ãããŸããïŒ èªåæ§æã«ã€ããŠç¥ã£ãŠããå¿ èŠãããããã€ãã®éèŠãªãã€ã³ãïŒ
-
@EnableAutoConfiguration
ã¢ãããŒã·ã§ã³ã«å«ãŸãã - æåŸã«ãªããŸããã ãã«ã¹ã¿ã Beanãç»é²ããåŸ
- ã¯ã©ã¹ãã¹ã§äœ¿çšå¯èœãªã¯ã©ã¹ã
application.properties
ããããã£ãªã©ã«åºã¥ããŠãæ§æã«é¢ãã決å®ãè¡ããŸãã - èªåèšå®ã®ããŸããŸãªåŽé¢ããªã³ãŸãã¯ãªãã«ããŠãéšåçã«é©çšã§ããŸãïŒããšãã°ãMySQL + JPAã®ã¿ã§ãWebã¯äžå¯ïŒ
- ã«ã¹ã¿ã Beanãåžžã«åªå
ããŸãã ã³ãŒãã
DataSource
Beanããã§ã«ç»é²ããŠããå Žåãèªåæ§æã¯ããããããã¯ããŸãã
Beanãç»é²ããããã®çšèªãšæé
Beanãç»é²ããããã®ããžãã¯ã¯ã @ConditionalOn*
ã¢ãããŒã·ã§ã³ã®ã»ããã«ãã£ãŠå¶åŸ¡ãããŸãã ã¯ã©ã¹ãã¹ïŒ @ConditionalOnClass
ïŒã«ã¯ã©ã¹ãããå Žåãæ¢åã®BeanïŒ @ConditionalOnBean
ïŒãBeanã@ConditionalOnMissingBean
ïŒ @ConditionalOnMissingBean
ïŒãªã©ã«Beanãäœæãããããã«æå®ã§ããŸãã
Spring Bootã¯ãããã®ã¢ãããŒã·ã§ã³ãç©æ¥µçã«äœ¿çšããŠãã§ããã ãç®ç«ããªãããã«ãããŠãŒã¶ãŒèšå®ãšéãªããªãããã«ããŸãã
Hello Worldã«é£ã³èŸŒã
åºæ¬çãªçè«çç¥èãæã£ãã®ã§ãã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«äœãèµ·ããããåæããŸãã
ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã«ã¯æ¬¡ã®ã³ãŒããå«ãŸããŸãã
@SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
ããã§äœãèµ·ãããã段éçã«èŠãŠã¿ãŸãããã
ã¯ã©ã¹DemoApplication
ãã®ã¯ã©ã¹ã«ã¯ã ã¡ã¿æ³šéã§ãã@SpringBootApplication
泚é ãã€ãŸã åºæ¬çã«ãããã€ãã®æ³šéã®ãšã€ãªã¢ã¹ïŒ
-
@SpringBootConfiguration
-
@EnableAutoConfiguration
-
@ComponentScan
ã
ããªãã¡ @SpringBootApplication
ã®ååšã«ã¯ãã³ã³ããŒãã³ãã¹ãã£ã³ãèªåæ§æãå«ãŸãããããSpring Bootã¢ããªã±ãŒã·ã§ã³ã§ããããšãããŸããŸãªSpringã³ã³ããŒãã³ãïŒçµ±åãã¹ããªã©ïŒã«ç€ºããŸã
SpringApplication.runïŒïŒ
æäŸãããŠããæ§æã®ãªã¹ãïŒããã³DemoApplication
ã¯ã©ã¹èªäœã¯æ§æã§ããäžèšãåç
§ïŒã䜿çšããŠã ApplicationContext
äœæããæ§æããã³ã³ãœãŒã«ã«ãããŒã衚瀺ããã¢ããªã±ãŒã·ã§ã³ã®éå§æéã远跡ããŸãã æåã®ã³ã³ããã¹ãäœæã§çœ®ãæããããšãã§ããŸãïŒ new AnnotationConfigApplicationContext(DemoApplication.class)
ã ååã瀺ãããã«ãããã¯æ³šéã䜿çšããŠèšå®ãããã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã§ãã ãã ãããã®ã³ã³ããã¹ãã¯åã蟌ã¿ãµãŒãã¬ããã³ã³ããã«ã€ããŠã¯äœãç¥ããŸããããããèªäœã®å®è¡æ¹æ³ã確ãã«ç¥ããŸããã 圌ã®çžç¶äººããã§ã«Spring BootããAnnotationConfigEmbeddedWebApplicationContext
ã¯ãããè¡ãããšãã§ããŸãããããŠåã«main
ã¡ãœããã§æžãå Žå
@SpringBootApplication public class DemoApplication { public static void main(String[] args) throws InterruptedException { ApplicationContext applicationContext = new AnnotationConfigEmbeddedWebApplicationContext(DemoApplication.class); } }
次ã«ããŸã£ããåãåäœããã¢ããªã±ãŒã·ã§ã³ãååŸããŸãã AnnotationConfigEmbeddedWebApplicationContext
ã¯ã©ã¹ã¯ãã³ã³ããã¹ãã§EmbeddedServletContainerFactory
åã®BeanãèŠã€ãããããä»ããŠçµã¿èŸŒã¿ã³ã³ãããäœæããã³èµ·åããŸãã ãããã¯ãã¹ãŠãå
±éã®DIã³ã³ããã®ãã¬ãŒã ã¯ãŒã¯å
ã§æ©èœããããšã«æ³šæããŠãã ãããã€ãŸãããã®ã¯ã©ã¹ã¯èªåã§å®è£
ã§ããŸãã
@EnableAutoConfiguration
ãã®æ³šéã«ã¯èªåæ§æãå«ãŸããŸãã ãããŠãããããããããæ¥ã®éæ³ãæŽãéèŠãªãã€ã³ãã§ãã ãã®ã¢ãããŒã·ã§ã³ã®å®£èšæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
... @Import(EnableAutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { ... }
ããªãã¡ ããã¯ãäžã§èª¬æããæãäžè¬çãªæ§æã€ã³ããŒãã§ãã EnableAutoConfigurationImportSelector
ïŒããã³Spring Boot 1.5+ã®åŸç¶ããŒãžã§ã³AutoConfigurationImportSelector
ïŒã¯ãã³ã³ããã¹ãã«ããã€ãã®ãã³ãè¿œå ããåãªãæ§æã§ãã ãã ãããã®ã¯ã©ã¹ã«ã¯åŸ®åŠãªç¹ã1ã€ãããŸããBeanèªäœã宣èšããã®ã§ã¯ãªããããããfactoriesã䜿çšããŸãã
EnableAutoConfigurationImportSelector
ã¯ã©ã¹ã¯ã spring.factories
ãã¡ã€ã«ãspring.factories
ãããããSpring Bootãã€ã³ããŒãããïŒèªåïŒæ§æã¯ã©ã¹ã®ååã§ããå€ã®ãªã¹ããããŒãããŸãã
spring.factories
ãã¡ã€ã«ïŒ spring-boot-autoconfigure.<version>.jar
å
ã®META-INF
ãã©ã«ããŒã«ãããŸãïŒã¯æ¬¡ã®ãšããã§ãã
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ ... (100 lines) org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
ããªãã¡ @EnableAutoConfiguration
泚éã¯ããªã¹ããããŠãããã¹ãŠã®æ§æãã€ã³ããŒãããŠãç®çã®Beanãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã«æäŸããŸãã
å®éãå¿ èŠãªæ§æã®æåã€ã³ããŒãã§çœ®ãæããããšãã§ããŸãã
@Import({ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration.class, org.springframework.boot.autoconfigure.aop.AopAutoConfiguration.class, ...}) public class DemoApplication { ... }
ãã ããSpring Bootã¯ãã¹ãŠã®æ§æãé©çšããããšããŸãïŒãããŠãããã®æ§æã¯çŽ100åãããŸãïŒã æ°é ãã®ããèªè ã«ã¯ãæ確ã«ããå¿ èŠã®ãã質åããã§ã«ããã€ããããšæããŸãã
ãããããé ãïŒã ã¯ããããã-æ£ç¢ºãªæ°åã¯ãããŸããããèªåæ§æããã»ã¹èªäœã¯éåžžã«é«éã§ãïŒç空äžã®æœè±¡çãªãã·ã³ã§çŽ100ããªç§ïŒ
- ããããããã¯äžèŠã§ããã䜿çšããªãã®ã«RabbitïŒ
RabbitAutoConfiguration
ïŒãæ§æããå¿ èŠãããã®ã¯ãªãã§ããïŒã èªåæ§æã®ååšã¯ããã³ãäœæãããããšãæå³ããŸããã èªåæ§æã¯ã©ã¹ã¯ã@ConditionalOnClass
ã¢ãããŒã·ã§ã³ãç©æ¥µçã«äœ¿çšããŸããã»ãšãã©ã®å Žåãæ§æã¯äœãè¡ãããäœæããŸããïŒäžèšã®ããã³ãç»é²ããããã®æ¡ä»¶ãšæé ããåç §ïŒã
ç°¡åãªèŠçŽ
Spring Bootã®ãéæ³ãã®äžå¿ã«ã¯éæ³ã®ãããªãã®ã¯ãããŸãã; Spring Frameworkã®å®å šã«åºæ¬çãªæŠå¿µã䜿çšããŠããŸãã ã€ãŸããããã»ã¹ã¯æ¬¡ã®ããã«èª¬æã§ããŸãã
-
@SpringBootApplication
ã¯ã@EnableAutoConfiguration
ã¢ãããŒã·ã§ã³ãä»ããã³ã³ããŒãã³ãã®ã¹ãã£ã³ãšèªåæ§æãå«ãŸããŸã -
@EnableAutoConfiguration
ã¯EnableAutoConfigurationImportSelector
ã¯ã©ã¹ãã€ã³ããŒãããŸã -
EnableAutoConfigurationImportSelector
ã¯ãMETA-INF/spring.factories
ããæ§æã®ãªã¹ããããŒããMETA-INF/spring.factories
- åæ§æã¯ãå¿ èŠãªBeanãç»é²ããããŸããŸãªæ¡ä»¶ïŒãã³ã®æç¡/èšå®ãã¯ã©ã¹ãªã©ïŒã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªåŽé¢ïŒWebãJPAãAMQPãªã©ïŒãæ§æããããšããŸãã
- çµæã®
AnnotationConfigEmbeddedWebApplicationContext
ã¯ãåãDIã³ã³ããå ã®ãã¡ã¯ããªãæ¢ããŠãåã蟌ã¿ãµãŒãã¬ããã³ã³ãããå®è¡ããŸãã - ãµãŒãã¬ããã³ã³ãããèµ·åããã¢ããªã±ãŒã·ã§ã³ã®æºåãæŽããŸããïŒ
è€éã«èŠãããããããŸããããã»ãšãã©ã®å Žåãã¢ããªã±ãŒã·ã§ã³éçºè ã¯ãã©ã€ãã©ãªã®èªåæ§æã®ãµããŒãã«ã€ããŠè©±ããŠããã®ã§ãªããã°ãèªåæ§æã®å éšã«å ¥ãå¿ èŠã¯ãããŸããã
蚺æ
èªåæ§æã¬ããŒã
äœãåé¡ãçºçããå ŽåãSpring Bootã§ã¯èªåæ§æ蚺æãå®è¡ããäœæãããBeanã確èªã§ããŸãã ãã®æ
å ±ã衚瀺ããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã--debug
ã¹ã€ããã§å®è¡ããå¿
èŠããããŸãã
java -jar my-app.jar --debug
ããã«å¿ããŠãSpringã¯è©³çŽ°ãªèªåæ§æã¬ããŒããçºè¡ããŸã ã
========================= AUTO-CONFIGURATION REPORT ========================= Positive matches: ----------------- DataSourceAutoConfiguration matched: - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition) DataSourceAutoConfiguration#dataSourceInitializer matched: - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer; SearchStrategy: all) did not find any beans (OnBeanCondition) ... Negative matches: ----------------- ActiveMQAutoConfiguration: Did not match: - @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition) ...
ããžãã£ã/ãã¬ãã£ããããã®è¡ã¯ã é©çšãããåèªåæ§æã«å¯Ÿå¿ããŸã ãããã«ãããŒãã¯ç¹å®ã®ãã³ãäœæãããçç±ã瀺ããŸãïŒã€ãŸããã©ã®ç»é²æ¡ä»¶ãæºãããããã瀺ããŸãïŒã
ã¢ã¯ãã¥ãšãŒã¿
Spring Boot Actuatorã¯ãå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³çšã®åŒ·åãªèšºæããŒã«ã§ãããå€ãã®æçšãªåæãæäŸã§ããŸãïŒããã«ããããã®ã¡ããªãã¯ã®ã»ããã¯ã¢ããªã±ãŒã·ã§ã³ããç°¡åã«æ¡åŒµã§ããŸãïŒã
Actuatorããããžã§ã¯ãã«è¿œå ããåŸã Spring Bootã¯URL http://localhost:8080/beans
ä»ããŠå©çšå¯èœãªBeanã®ãªã¹ããå
¬éããŸãã ãã®ãªã¹ãã¯JMXïŒJava Management ExtensionsïŒãããå
¥æã§ããŸããIntellijIDEAã®ææ°ããŒãžã§ã³ã§ã¯ããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³Beanãèµ·åãŠã£ã³ããŠããçŽæ¥è¡šç€ºã§ããŸãã
ãŸãšã
Springã¯äŸç¶ãšããŠå€§èŠæš¡ã§æãç°¡åãªãã¬ãŒã ã¯ãŒã¯ã§ã¯ãããŸããããSpringãæäŸããé«ã¬ãã«ã®æœè±¡åã®ä»£äŸ¡ã§ãã ãŸããæ¥ã ã®éçºã«ããããã¬ãŒã ã¯ãŒã¯ã®ãã¹ãŠã®è€éããç¥ãå¿ èŠã¯ãããŸããããå éšããã©ã®ããã«æ©èœããããç¥ãããšã¯äŸç¶ãšããŠæçšã§ãã ãã®èšäºãçæ ç³»ãšããŠã®Springã®éèŠæ§ãšäŸ¡å€ãç解ããå©ããšãªããç¹ã«Spring Bootã䜿çšããŠããå Žåã«èµ·ãã£ãŠããããšã®ãéæ³ããå°ãåãé€ãããšãé¡ã£ãŠããŸãã ç§ã®ã¢ããã€ã¹-ç§ã®æèŠã§ã¯ããã¬ãŒã ã¯ãŒã¯ã®è žãæãäžããŠããœãŒã¹ã³ãŒããšããã¥ã¡ã³ããSpring-aã§ã»ãšãã©æšæºçã§ããã®ã§ãæããããšã¯ãããŸããã
ãŸãã9æã«ãªãªãŒã¹ãããããšããŠããSpring 5ã«ã¯ ãåçŽãªã¢ããªã±ãŒã·ã§ã³ãäœæãããéæ³ãã®ã¬ãã«ãäžããããšãç®çãšããããã€ãã®æ°ããã³ã³ã»ããããããŸãïŒããã£ãŠããããã«ãéæ³ã¯ããŸããããŸããïŒã 1ã€ã®æŠå¿µã¯Functional Bean Registrationã§ã ãããã«ãããé¢æ°ã䜿çšããŠã³ã³ããã¹ãã§Beanãç»é²ããããKotlinã§é©åãªDSLã䜿çšãããã§ããŸãïŒSpring 5ã§ã¯Kotlinã®å€ãã®åªãããµããŒããè¿œå ãããŸãïŒã 次ã«éèŠãªã®ã¯ã Functional Web FrameworkãšWebFluxïŒãªã¢ã¯ãã£ãWebãã¬ãŒã ã¯ãŒã¯ïŒã®çµã¿åããã§ããããã«ãããSpring MVCã«äŸåããã«Webã¢ããªã±ãŒã·ã§ã³ãäœæãããµãŒãã¬ããã³ã³ãããªãã§å®è¡ã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããšDIãªãã§åäœããããšãã§ããåçŽã«äžé£ã®request -> response
é¢æ°ãšããŠèšè¿°ãããŸãã 詳现ã«ã€ããŠã¯ã ãã¡ããã芧ãã ãã ïŒè±èªïŒã