±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜ
Ò»ÏÂSpringBoot¼ÓÔØymlÅäÖÃÎļþµÄ¹ý³Ì
,
Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ
ÂëÅ©²ÎÉÏ
£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
±³¾°
ǰ¼¸ÌìµÄʱºò£¬ÏîÄ¿ÀïÓÐÒ»¸öÐèÇó£¬ÐèÒªÒ»¸ö¿ª¹Ø¿ØÖÆ´úÂëÖÐÊÇ·ñÖ´ÐÐÒ»¶ÎÂß¼£¬ÓÚÊÇÀíËùµ±È»µÄÔÚ yml ÎļþÖÐÅäÖÃÁËÒ»¸öÊôÐÔ×÷Ϊ¿ª¹Ø£¬ÔÙÅäºÏ nacos ¾Í¿ÉÒÔËæÊ±¸Ä±äÕâ¸öÖµ´ïµ½ÎÒÃǵÄÄ¿µÄ£¬ymlÎļþÖÐÊÇÕâÑùдµÄ£º
³ÌÐòÖеĴúÂëÒ²ºÜ¼òµ¥£¬´óÖµÄÂß¼¾ÍÊÇÏÂÃæÕâÑù£¬Èç¹ûÈ¡µ½µÄ¿ª¹Ø×Ö¶ÎÊÇ on µÄ»°£¬ÄÇô¾ÍÖ´ÐÐ if ÅжÏÖеĴúÂ룬·ñÔò¾Í²»Ö´ÐУº
@Value ( "${switch.turnOn}" )
private String on;
@GetMapping ( "testn" )
public void test () {
if ( "on" .equals(on)){
//TODO
}
} |
µ«Êǵ±´úÂëʵ¼ÊÅÜÆðÀ´£¬ÓÐÒâ˼µÄµØ·½À´ÁË£¬ÎÒÃÇ·¢ÏÖÅжÏÖеĴúÂëÒ»Ö±²»»á±»Ö´ÐУ¬Ö±µ½debugһϣ¬²Å·¢ÏÖÕâÀïµÄÈ¡µ½µÄÖµ¾ÓÈ»²»ÊÇ on ¶øÊÇ true ¡£

¿´µ½Õ⣬ÊDz»ÊǸоõÓеãÒâ˼£¬Ê×ÏÈä²ÂÊÇÔÚ½âÎöymlµÄ¹ý³ÌÖÐ°Ñ on ×÷Ϊһ¸öÌØÊâµÄÖµ½øÐÐÁË´¦Àí£¬ÓÚÊÇÎҸɴàÔÙ¶à²âÊÔÁ˼¸¸öÀý×Ó£¬°ÑymlÖеÄÊôÐÔÀ©Õ¹µ½ÏÂÃæÕâЩ£º
switch:
turnOn: on
turnOff: off
turnOn2: 'on'
turnOff2: 'off' |
ÔÙÖ´ÐÐһϴúÂ룬¿´Ò»ÏÂÓ³ÉäºóµÄÖµ£º

¿ÉÒÔ¿´µ½£¬ymlÖÐûÓдøÒýºÅµÄ on ºÍ off ±»×ª»»³ÉÁË true ºÍ false £¬´øÒýºÅµÄÔò±£³ÖÁËÔÀ´µÄÖµ²»·¢Éú¸Ä±ä¡£
µ½ÕâÀÈÃÎÒÈ̲»×¡ÓеãºÃÆæ£¬ÎªÊ²Ã´»á·¢ÉúÕâÖÖÏÖÏóÄØ£¿ÓÚÊÇÇ¿ÈÌ×ÅÀ§Òâ·ÁË·Ô´Â룬Ӳ¿ÄÁËÒ»ÏÂSpringBoot¼ÓÔØymlÅäÖÃÎļþµÄ¹ý³Ì£¬ÖÕÓÚÈÃÎÒ¿´³öÁ˵ãÃŵÀ£¬ÏÂÃæÎÒÃÇÒ»µãÒ»µãϸ˵£¡
ÒòΪÅäÖÃÎļþµÄ¼ÓÔØ»áÉæ¼°µ½Ò»Ð©SpringBootÆô¶¯µÄÏà¹ØÖªÊ¶£¬ËùÒÔÈç¹û¶ÔÕâÒ»¿é²»ÊǺÜÊìϤµÄͬѧ£¬¿ÉÒÔÏÈÌáǰÏÈ¿´Ò»ÏÂHydraÔÚ¹ÅÔçʱÆÚд¹ýһƪÎÄÕÂÔ¤ÈÈһϡ£ÏÂÃæµÄ½éÉÜÖУ¬Ö»»áÕª³öһЩ¶Ô¼ÓÔØºÍ½âÎöÅäÖÃÎļþ±È½ÏÖØÒªµÄ²½Öè½øÐзÖÎö£¬¶ÔÆäËûÎ޹ز¿·Ö½øÐÐÁËÊ¡ÂÔ¡£
¼ÓÔØ¼àÌýÆ÷
µ±ÎÒÃÇÆô¶¯Ò»¸öSpringBoot³ÌÐò£¬ÔÚÖ´ÐÐ SpringApplication.run() µÄʱºò£¬Ê×ÏÈÔÚ³õʼ»¯ SpringApplication µÄ¹ý³ÌÖУ¬¼ÓÔØÁË11¸öʵÏÖÁË ApplicationListener ½Ó¿ÚµÄÀ¹½ØÆ÷¡£

Õâ11¸ö×Ô¶¯¼ÓÔØµÄ ApplicationListener £¬ÊÇÔÚ spring.factories Öж¨Ò岢ͨ¹ý SPI À©Õ¹±»¼ÓÔØµÄ£º

ÕâÀïÁгöµÄ10¸öÊÇÔÚ spring-boot ÖмÓÔØµÄ£¬»¹ÓÐÊ£ÓàµÄ1¸öÊÇÔÚ spring-boot-autoconfigure ÖмÓÔØµÄ¡£ÆäÖÐ×î¹Ø¼üµÄ¾ÍÊÇ ConfigFileApplicationListener £¬ËüºÍºóÃæÒª½²µ½µÄÅäÖÃÎļþµÄ¼ÓÔØÏà¹Ø¡£
Ö´ÐÐrun·½·¨
ÔÚʵÀý»¯Íê³É SpringApplication ºó£¬»á½Ó×ÅÍùÏÂÖ´ÐÐËüµÄ run ·½·¨¡£

¿ÉÒÔ¿´µ½£¬ÕâÀïͨ¹ý getRunListeners ·½·¨»ñÈ¡µÄ SpringApplicationRunListeners ÖУ¬ EventPublishingRunListener °ó¶¨ÁËÎÒÃÇÇ°Ãæ¼ÓÔØµÄ11¸ö¼àÌýÆ÷¡£µ«ÊÇÔÚÖ´ÐÐ starting ·½·¨Ê±£¬¸ù¾ÝÀàÐͽøÐÐÁ˹ýÂË£¬×îÖÕʵ¼ÊÖ»Ö´ÐÐÁË 4¸ö ¼àÌýÆ÷µÄ onApplicationEvent ·½·¨£¬²¢Ã»ÓÐÎÒÃÇÏ£Íû¿´µ½µÄ ConfigFileApplicationListener £¬ÈÃÎÒÃǽÓ×ÅÍùÏ¿´¡£

µ± run ·½·¨Ö´Ðе½ prepareEnvironment ʱ£¬»á´´½¨Ò»¸ö ApplicationEnvironmentPreparedEvent ÀàÐ͵Äʼþ£¬²¢¹ã²¥³öÈ¥¡£ÕâʱËùÓеļàÌýÆ÷ÖУ¬ÓÐ7¸ö»á¼àÌýµ½Õâ¸öʼþ£¬Ö®ºó»á·Ö±ðµ÷ÓÃËüÃÇµÄ onApplicationEvent ·½·¨£¬ÆäÖоÍÓÐÁËÎÒÃÇÐÄÐÄÄîÄîµÄ ConfigFileApplicationListener £¬½ÓÏÂÀ´ÈÃÎÒÃÇ¿´¿´ËüµÄ onApplicationEvent ·½·¨ÖÐ×öÁËʲô¡£

ÔÚ·½·¨µÄµ÷Óùý³ÌÖУ¬»á¼ÓÔØÏµÍ³×Ô¼ºµÄ4¸öºóÖô¦ÀíÆ÷ÒÔ¼° ConfigFileApplicationListener ×ÔÉí£¬Ò»¹²5¸öºóÖô¦ÀíÆ÷£¬²¢Ö´ÐÐËûÃÇµÄ postProcessEnvironment ·½·¨£¬ÆäËû4¸ö¶ÔÎÒÃDz»ÖØÒª¿ÉÒÔÂÔ¹ý£¬×îÖձȽϹؼüµÄ²½ÖèÊÇ´´½¨ Loader ʵÀý²¢µ÷ÓÃËüµÄ load ·½·¨¡£
¼ÓÔØÅäÖÃÎļþ
ÕâÀïµÄ Loader ÊÇ ConfigFileApplicationListener µÄÒ»¸öÄÚ²¿À࣬¿´Ò»Ï Loader ¶ÔÏóʵÀý»¯µÄ¹ý³Ì£º

ÔÚʵÀý»¯ Loader ¶ÔÏóµÄ¹ý³ÌÖУ¬ÔÙ´Îͨ¹ýSPIÀ©Õ¹µÄ·½Ê½¼ÓÔØÁËÁ½¸öÊôÐÔÎļþ¼ÓÔØÆ÷£¬ÆäÖÐµÄ YamlPropertySourceLoader ¾ÍºÍºóÃæµÄymlÎļþµÄ¼ÓÔØ¡¢½âÎöÃÜÇйØÁª£¬¶øÁíÒ»¸ö PropertiesPropertySourceLoader Ôò¸ºÔð properties ÎļþµÄ¼ÓÔØ¡£´´½¨Íê Loader ʵÀýºó£¬½ÓÏÂÀ´»áµ÷ÓÃËüµÄ load ·½·¨¡£

ÔÚ load ·½·¨ÖУ¬»áͨ¹ýǶÌ×Ñ»··½Ê½±éÀúĬÈÏÅäÖÃÎļþ´æ·Å·¾¶£¬ÔÙ¼ÓÉÏĬÈϵÄÅäÖÃÎļþÃû³Æ¡¢ÒÔ¼°²»Í¬ÅäÖÃÎļþ¼ÓÔØÆ÷¶ÔÓ¦½âÎöµÄºó׺Ãû£¬×îÖÕÕÒµ½ÎÒÃǵÄymlÅäÖÃÎļþ¡£½ÓÏÂÀ´£¬¿ªÊ¼Ö´ÐÐ loadForFileExtension ·½·¨¡£

ÔÚ loadForFileExtension ·½·¨ÖУ¬Ê×ÏȽ« classpath:/application.yml ¼ÓÔØÎª Resource Îļþ£¬½ÓÏÂÀ´×¼±¸Õýʽ¿ªÊ¼£¬µ÷ÓÃÁË֮ǰ´´½¨ºÃµÄ YamlPropertySourceLoader ¶ÔÏóµÄ load ·½·¨¡£
·â×°Node
ÔÚ load ·½·¨ÖУ¬¿ªÊ¼×¼±¸½øÐÐÅäÖÃÎļþµÄ½âÎöÓëÊý¾Ý·â×°£º

load ·½·¨Öе÷ÓÃÁË OriginTrackedYmlLoader ¶ÔÏóµÄ load ·½·¨£¬´Ó×ÖÃæÒâ˼ÉÏÎÒÃÇÒ²¿ÉÒÔÀí½â£¬ËüµÄÓÃ;ÊÇÔʼ׷×ÙymlµÄ¼ÓÔØÆ÷¡£ÖмäÒ»Á¬´®µÄ·½·¨µ÷ÓÿÉÒÔºöÂÔ£¬Ö±½Ó¿´×îºóÒ²ÊÇ×îÖØÒªµÄÊÇÒ»²½£¬µ÷Óà OriginTrackingConstructor ¶ÔÏóµÄ getData ½Ó¿Ú£¬À´½âÎöyml²¢·â×°³É¶ÔÏó¡£

ÔÚ½âÎöymlµÄ¹ý³ÌÖÐʵ¼ÊʹÓÃÁË Composer ¹¹½¨Æ÷À´Éú³É½Úµã£¬ÔÚËüµÄ getNode ·½·¨ÖУ¬Í¨¹ý½âÎöÆ÷ʼþÀ´´´½¨½Úµã¡£Í¨³£À´Ëµ£¬Ëü»á½«ymlÖеÄÒ»×éÊý¾Ý·â×°³ÉÒ»¸ö MappingNode ½Úµã£¬ËüµÄÄÚ²¿Êµ¼ÊÉÏÊÇÒ»¸ö NodeTuple ×é³ÉµÄ List £¬ NodeTuple ºÍ Map µÄ½á¹¹ÀàËÆ£¬ÓÉÒ»¶Ô¶ÔÓ¦µÄ keyNode ºÍ valueNode ¹¹³É£¬½á¹¹ÈçÏ£º

ºÃÁË£¬ÈÃÎÒÃÇÔٻص½ÉÏÃæµÄÄÇÕÅ·½·¨µ÷ÓÃÁ÷³Ìͼ£¬ËüÊǸù¾ÝÎÄÕ¿ªÍ·µÄymlÎļþÖÐʵ¼ÊÄÚÈÝÄÚÈÝ»æÖƵģ¬Èç¹ûÄÚÈݲ»Í¬µ÷ÓÃÁ÷³Ì»á·¢Éú¸Ä±ä£¬´ó¼ÒÖ»ÐèÒªÃ÷°×Õâ¸öÔÀí£¬ÏÂÃæÎÒÃǾßÌå·ÖÎö¡£
Ê×ÏÈ£¬´´½¨Ò»¸ö MappingNode ½Úµã£¬²¢½« switch ·â×°³É keyNode £¬È»ºóÔÙ´´½¨Ò»¸ö MappingNode £¬×÷ΪÍâ²ã MappingNode µÄ valueNode £¬Í¬Ê±´æ´¢ËüÏÂÃæµÄ4×éÊôÐÔ£¬ÕâÒ²ÊÇΪʲôÉÏÃæ»á³öÏÖ4´ÎÑ»·µÄÔÒò¡£Èç¹ûÓеãÀ§»óҲû¹ØÏµ£¬¿´Ò»ÏÂÏÂÃæµÄÕâÕÅͼ£¬¾ÍÄÜһĿÁËÈ»Á˽âËüµÄ½á¹¹¡£

ÔÚÉÏͼÖУ¬ÓÖÒýÈëÁËÒ»ÖÖÐ嵀 ScalarNode ½Úµã£¬ËüµÄÓÃ;Ҳ±È½Ï¼òµ¥£¬¼òµ¥StringÀàÐ͵Ä×Ö·û´®ÓÃËüÀ´·â×°³É½Úµã¾Í¿ÉÒÔÁË¡£µ½ÕâÀymlÖеÄÊý¾Ý±»½âÎöÍê³É²¢Íê³ÉÁ˳õ²½µÄ·â×°£¬¿ÉÄÜÑÛ¼âµÄС»ï°éÒªÎÊÁË£¬ÉÏÃæÕâÕÅͼÖÐΪʲôÔÚ ScalarNode ÖУ¬³ýÁË value »¹ÓÐÒ»¸ö tag ÊôÐÔ£¬Õâ¸öÊôÐÔÊǸÉʲôµÄÄØ£¿
ÔÚ½éÉÜËüµÄ×÷ÓÃǰ£¬ÏÈ˵һÏÂËüÊÇÔõô±»È·¶¨µÄ¡£ÕâÒ»¿éµÄÂß¼±È½Ï¸´ÔÓ£¬´ó¼Ò¿ÉÒԷһϠScannerImpl Àà fetchMoreTokens ·½·¨µÄÔ´Â룬Õâ¸ö·½·¨»á¸ù¾ÝymlÖÐÿһ¸ö key »ò value ÊÇÒÔʲô¿ªÍ·£¬À´¾ö¶¨ÒÔʲô·½Ê½½øÐнâÎö£¬ÆäÖоͰüÀ¨ÁË { ¡¢ [ ¡¢ ' ¡¢ % ¡¢ ? µÈÌØÊâ·ûºÅµÄÇé¿ö¡£ÒÔ½âÎö²»´øÈκÎÌØÊâ×Ö·ûµÄ×Ö·û´®ÎªÀý£¬¼òÒªµÄÁ÷³ÌÈçÏ£¬Ê¡ÂÔÁËһЩ²»ÖØÒª²¿·Ö£º

ÔÚÕâÕÅͼµÄÖм䲽ÖèÖУ¬´´½¨ÁËÁ½¸ö±È½ÏÖØÒªµÄ¶ÔÏó ScalarToken ºÍ ScalarEvent £¬ÆäÖж¼ÓÐÒ»¸öΪ true µÄ plain ÊôÐÔ£¬¿ÉÒÔÀí½âΪÕâ¸öÊôÐÔÊÇ·ñÐèÒª ½âÊÍ £¬ÊǺóÃæ»ñÈ¡ Resolver µÄ¹Ø¼üÊôÐÔÖ®Ò»¡£
ÉÏͼÖÐµÄ yamlImplicitResolvers ÆäʵÊÇÒ»¸öÌáǰ»º´æºÃµÄHashMap£¬ÒѾÌáǰ´æ´¢ºÃÁËһЩ Char ÀàÐÍ×Ö·ûÓë ResolverTuple µÄ¶ÔÓ¦¹ØÏµ£º

µ±½âÎöµ½ÊôÐÔ on ʱ£¬È¡³öÊ××Öĸ o ¶ÔÓ¦µÄ ResolverTuple £¬ÆäÖÐµÄ tag ¾ÍÊÇ tag:yaml.org.2002:bool ¡£µ±È»ÁË£¬ÕâÀïÒ²²»ÊǼòµ¥µÄÈ¡³ö¾ÍÍêÊÂÁË£¬ºóÐø»¹»á¶ÔÊôÐÔ½øÐÐÕýÔò±í´ïʽµÄÆ¥Å䣬¿´Óë regexp ÖеÄÖµÊÇ·ñÄܶԵÄÉÏ£¬¼ì²éÎÞÎóʱ²Å»á·µ»ØÕâ¸ö tag ¡£
µ½ÕâÀÎÒÃǾͽâÊÍÇå³þÁË ScalarNode ÖÐ tag ÊôÐÔ¾¿¾¹ÊÇÔõô»ñÈ¡µ½µÄÁË£¬Ö®ºó·½·¨µ÷Óòã²ã·µ»Ø£¬·µ»Øµ½ OriginTrackingConstructor ¸¸Àà BaseConstructor µÄ getData ·½·¨ÖС£½ÓÏÂÀ´£¬¼ÌÐøÖ´ÐÐ constructDocument ·½·¨£¬Íê³É¶ÔymlÎĵµµÄ½âÎö¡£
µ÷Óù¹ÔìÆ÷
ÔÚ constructDocument ÖУ¬ÓÐÁ½²½±È½ÏÖØÒª£¬µÚÒ»²½ÊÇÍÆ¶Ïµ±Ç°½ÚµãÓ¦¸ÃʹÓÃÄÄÖÖÀàÐ͵Ĺ¹ÔìÆ÷£¬µÚ¶þ²½ÊÇʹÓûñµÃµÄ¹¹ÔìÆ÷À´ÖØÐÂ¶Ô Node ½ÚµãÖÐµÄ value ½øÐи³Öµ£¬¼òÒ×Á÷³ÌÈçÏ£¬Ê¡È¥ÁËÑ»·±éÀúµÄ²¿·Ö£º

ÍÆ¶Ï¹¹ÔìÆ÷ÖÖÀàµÄ¹ý³ÌÒ²ºÜ¼òµ¥£¬ÔÚ¸¸Àà BaseConstructor ÖУ¬»º´æÁËÒ»¸öHashMap£¬´æ·ÅÁ˽ڵãµÄ tag ÀàÐ͵½¶ÔÓ¦¹¹ÔìÆ÷µÄÓ³Éä¹ØÏµ¡£ÔÚ getConstructor ·½·¨ÖУ¬¾ÍʹÓÃ֮ǰ½ÚµãÖдæÈëµÄ tag ÊôÐÔÀ´»ñµÃ¾ßÌåҪʹÓõĹ¹ÔìÆ÷£º

µ± tag Ϊ bool ÀàÐÍʱ£¬»áÕÒµ½ SafeConstruct ÖеÄÄÚ²¿Àà ConstructYamlBool ×÷Ϊ¹¹ÔìÆ÷£¬²¢µ÷ÓÃËüµÄ construct ·½·¨ÊµÀý»¯Ò»¸ö¶ÔÏó£¬À´×÷Ϊ ScalarNode ½ÚµãµÄ value µÄÖµ£º

ÔÚ construct ·½·¨ÖУ¬È¡µ½µÄval¾ÍÊÇ֮ǰµÄ on £¬ÖÁÓÚÏÂÃæµÄÕâ¸ö BOOL_VALUES £¬Ò²ÊÇÌáǰ³õʼ»¯ºÃµÄÒ»¸öHashMap£¬ÀïÃæÌáǰ´æ·ÅÁËһЩ¶ÔÓ¦µÄÓ³Éä¹ØÏµ£¬keyÊÇÏÂÃæÁгöµÄÕâЩ¹Ø¼ü×Ö£¬valueÔòÊÇ Boolean ÀàÐ굀 true »ò false £º

µ½ÕâÀymlÖеÄÊôÐÔ½âÎöÁ÷³Ì¾Í»ù±¾Íê³ÉÁË£¬ÎÒÃÇÒ²Ã÷°×ÁËΪʲôymlÖÐµÄ on »á±»×ª»¯Îª true µÄÔÀíÁË¡£
˼¿¼
ÄÇô£¬ÏÂÒ»¸öÎÊÌâÀ´ÁË£¬¼ÈÈ»ymlÎļþ½âÎöÖлá×öÕâÑùµÄÌØÊâ´¦Àí£¬ÄÇôÈç¹û»»³É properties ÅäÖÃÎļþÔõôÑùÄØ£¿
sw.turnOn=on
sw.turnOff=off |
Ö´ÐÐһϳÌÐò£¬¿´Ò»Ï½á¹û£º

¿ÉÒÔ¿´µ½£¬Ê¹Óà properties ÅäÖÃÎļþÄܹ»Õý³£¶ÁÈ¡½á¹û£¬¿´À´ÊÇÔÚ½âÎöµÄ¹ý³ÌÖÐûÓÐ×öÌØÊâ´¦Àí£¬ÖÁÓÚ½âÎöµÄ¹ý³Ì£¬ÓÐÐËȤµÄС»ï°é¿ÉÒÔ×Ô¼ºÈ¥ÔĶÁÒ»ÏÂÔ´Âë¡£
|