1.四叶草黑苹果启动器:Clover EFI bootloader for Mac
2.springå¯å¨åç(springå·¥ç¨å¯å¨)
3.bootloader到底是源码什么?
4.我的世界hmcl启动器怎么加光影
5.Qt编写的知名的开源软件列表
6.拥抱原生的另一种方式,完美替代 Pixel Launcher:Lawnchair | App+1
四叶草黑苹果启动器:Clover EFI bootloader for Mac
Clover EFI bootloader Mac版是启动器针对macoS Mojave.的四叶草启动器,提供PKG安装包以供在macOS上双开安装。源码此启动器的启动器文件夹为EF启动文件,需放置在ESP分区以启动装置。源码它能帮助用户迅速启动设备,启动器h5游戏模板源码尤其在安装了多个操作系统的源码情况下,可替代BIOS计算机上的启动器EDK2/Duet启动加载程序。若要编译此启动器,源码需将四叶草源代码添加至edk2文件夹中。启动器
springå¯å¨åç(springå·¥ç¨å¯å¨)
SpringBootå¯å¨åçåæ
èªå¨é ç½®æ ¸å¿ç±»SpringFactoriesLoader
ä¸é¢å¨è¯´@EnableAutoConfigurationçæ¶åæ说META-INFä¸çspring.factoriesæ件ï¼é£ä¹è¿ä¸ªæ件æ¯æä¹è¢«springå è½½å°çå¢ï¼å ¶å®å°±æ¯SpringFactoriesLoaderç±»ã
SpringFactoriesLoaderæ¯ä¸ä¸ªä¾Springå é¨ä½¿ç¨çéç¨å·¥åè£ è½½å¨å®éï¼SpringFactoriesLoaderéæ两个æ¹æ³ï¼
å¨è¿ä¸ªSpringBootåºç¨å¯å¨è¿ç¨ä¸ï¼SpringFactoriesLoaderåäºä»¥ä¸å 件äºï¼
å è½½ææMETA-INF/spring.factoriesä¸çInitializer
å è½½ææMETA-INF/spring.factoriesä¸çListener
å è½½EnvironmentPostProcessorï¼å 许å¨Springåºç¨æ建ä¹åå®å¶ç¯å¢é ç½®ï¼
æ¥ä¸æ¥å è½½PropertiesåYAMLçPropertySourceLoaderï¼é对SpringBootç两ç§é ç½®æ件çå è½½å¨ï¼
åç§å¼å¸¸æ åµçFailureAnalyzerï¼å¼å¸¸è§£éå¨ï¼
å è½½SpringBootå é¨å®ç°çåç§AutoConfiguration
模æ¿å¼æTemplateAvailabilityProviderï¼å¦FreemarkerãThymeleafãJspãVelocityçï¼
æ»å¾æ¥è¯´ï¼SpringFactoriesLoaderå@EnableAutoConfigurationé åèµ·æ¥ï¼æ´ä½åè½å°±æ¯æ¥æ¾spring.factoriesæ件ï¼å è½½èªå¨é 置类ã
æ´ä½å¯å¨æµç¨
å¨æ们æ§è¡å ¥å£ç±»çmainæ¹æ³ä¹åï¼è¿è¡SpringApplication.runï¼åé¢newäºä¸ä¸ªSpringApplication对象ï¼ç¶åæ§è¡å®çrunæ¹æ³ã
åå§åSpringApplicationç±»
å建ä¸ä¸ªSpringApplication对象æ¶ï¼ä¼è°ç¨å®èªå·±çinitializeæ¹æ³
æ§è¡æ ¸å¿runæ¹æ³
åå§åinitializeæ¹æ³æ§è¡å®ä¹åï¼ä¼è°ç¨runæ¹æ³ï¼å¼å§å¯å¨SpringBootã
é¦å éåæ§è¡ææéè¿SpringFactoriesLoaderï¼å¨å½åclasspathä¸çMETA-INF/spring.factoriesä¸æ¥æ¾ææå¯ç¨çSpringApplicationRunListeners并å®ä¾åãè°ç¨å®ä»¬çstarting()æ¹æ³ï¼æ¶²è½éç¥è¿äºçå¬å¨SpringBootåºç¨å¯å¨ã
å建并é ç½®å½åSpringBootåºç¨å°è¦ä½¿ç¨çEnvironmentï¼å æ¬å½åææçPropertySource以åProfileã
éåè°ç¨ææçSpringApplicationRunListenersçenvironmentPrepared()çæ¹æ³ï¼éç¥è¿äºçå¬å¨SpringBootåºç¨çEnvironmentå·²ç»å®æåå§åã
æå°SpringBootåºç¨çbannerï¼SpringApplicationçshowBannerå±æ§ä¸ºtrueæ¶ï¼å¦æclasspathä¸åå¨banner.txtæ件ï¼åæå°å ¶å 容ï¼å¦åæå°é»è®¤bannerã
æ ¹æ®å¯å¨æ¶è®¾ç½®çapplicationContextClassåå¨initializeæ¹æ³è®¾ç½®çwebEnvironmentï¼å建对åºçapplicationContextã
å建å¼å¸¸è§£æå¨ï¼ç¨å¨å¯å¨ä¸åçå¼å¸¸çæ¶åè¿è¡å¼å¸¸å¤ç(å æ¬è®°å½æ¥å¿ãéæ¾èµæºç)ã
设置SpringBootçEnvironmentï¼æ³¨åSpringBeanå称çåºååå¨BeanNameGeneratorï¼å¹¶è®¾ç½®èµæºå è½½å¨ResourceLoaderï¼éè¿SpringFactoriesLoaderå è½½ApplicationContextInitializeråå§åå¨ï¼è°ç¨initializeæ¹æ³ï¼å¯¹å建çApplicationContextè¿ä¸æ¥åå§åã
è°ç¨ææçSpringApplicationRunListenersçcontextPreparedæ¹æ³ï¼éç¥é¹ç»å·è¿äºListenerå½åApplicationContextå·²ç»å建å®æ¯ã
ææ ¸å¿çä¸æ¥ï¼å°ä¹åéè¿@EnableAutoConfigurationè·åçææé 置以åå ¶ä»å½¢å¼çIoC容å¨é ç½®å è½½å°å·²ç»åå¤å®æ¯çApplicationContextã
è°ç¨ææçSpringApplicationRunListenerçcontextLoadedæ¹æ³ï¼å è½½åå¤å®æ¯çApplicationContextã
è°ç¨refreshContextï¼æ³¨åä¸ä¸ªå ³éSpring容å¨çé©åShutdownHookï¼å½ç¨åºå¨åæ¢çæ¶åéæ¾èµæºï¼å æ¬ï¼éæ¯Beanï¼å ³éSpringBeançå建工åçï¼
注ï¼é©åå¯ä»¥å¨ä»¥ä¸å ç§åºæ¯ä¸è¢«è°ç¨ï¼
1ï¼ç¨åºæ£å¸¸éåº
2ï¼ä½¿ç¨System.exit()
3ï¼ç»ç«¯ä½¿ç¨Ctrl+C触åçä¸æ
4ï¼ç³»ç»å ³é
5ï¼ä½¿ç¨Killpidå½ä»¤ææ»è¿ç¨
è·åå½åææApplicationRunneråCommandLineRunneræ¥å£çå®ç°ç±»ï¼æ§è¡å ¶runæ¹æ³
éåææçSpringApplicationRunListenerçfinished()æ¹æ³ï¼å®æSpringBootçå¯å¨ã
springå·¥ä½åç
Springçå·¥ä½åçæ¯è®©ä¸ä¸ªå¯¹è±¡çå建ä¸ç¨newå°±å¯ä»¥èªå¨çç产ï¼å¨è¿è¡æ¶ä¸xmlSpringçé ç½®æ件æ¥é«å²©å¨æçå建对象åè°ç¨å¯¹è±¡ï¼èä¸éè¦éè¿ä»£ç æ¥å ³èã
Springæ¯ä¸ä¸ªå¼æ¾æºä»£ç ç设计å±é¢æ¡æ¶ï¼ä»è§£å³çæ¯ä¸å¡é»è¾å±åå ¶ä»åå±çæ¾è¦åé®é¢ï¼å æ¤å®å°é¢åæ¥å£çç¼ç¨ææ³è´¯ç©¿æ´ä¸ªç³»ç»åºç¨ã
springç¹ç¹æ¯1.æ¹ä¾¿è§£è¦ï¼ç®åå¼åã2.AOPç¼ç¨çæ¯æã3.声æå¼äºå¡çæ¯æã4.æ¹ä¾¿ç¨åºçæµè¯ã5.æ¹ä¾¿éæåç§ä¼ç§æ¡æ¶ã6.éä½JavaEEAPIç使ç¨é¾åº¦ã7.Javaæºç æ¯ç»å ¸å¦ä¹ èä¾ã
Springæ¡æ¶æ¯ç±äºè½¯ä»¶å¼åçå¤ææ§èå建çãSpring使ç¨çæ¯åºæ¬çJavaBeanæ¥å®æ以ååªå¯è½ç±EJBå®æçäºæ ãç¶èï¼Springçç¨éä¸ä» ä» éäºæå¡å¨ç«¯çå¼åãä»ç®åæ§ãå¯æµè¯æ§åæ¾è¦åæ§è§åº¦èè¨ï¼ç»å¤§é¨åJavaåºç¨é½å¯ä»¥ä»Springä¸å¸¦æ¶åçãSpringæ¯ä¸ä¸ªè½»é级çæ§å¶å转(IoC)åé¢ååé¢(AOP)ç容å¨æ¡æ¶ã
Springéè¿ä¸ç§ç§°ä½æ§å¶å转ï¼IoCï¼çææ¯ä¿è¿äºæ¾è¦åãå½åºç¨äºIoCï¼ä¸ä¸ªå¯¹è±¡ä¾èµçå ¶å®å¯¹è±¡ä¼éè¿è¢«å¨çæ¹å¼ä¼ éè¿æ¥ï¼èä¸æ¯è¿ä¸ªå¯¹è±¡èªå·±å建æè æ¥æ¾ä¾èµå¯¹è±¡ãä½ å¯ä»¥è®¤ä¸ºIoCä¸JNDIç¸åââä¸æ¯å¯¹è±¡ä»å®¹å¨ä¸æ¥æ¾ä¾èµï¼èæ¯å®¹å¨å¨å¯¹è±¡åæè¡å¾¡å§åæ¶ä¸ç对象请æ±å°±ä¸»å¨å°ä¾èµä¼ éç»å®ã
springçåçæ¯ä»ä¹ï¼ä¸ãIoC(Inversionofcontrol):æ§å¶å转\x0d\1ãIoCï¼\x0d\æ¦å¿µï¼æ§å¶æç±å¯¹è±¡æ¬èº«è½¬å容å¨ï¼ç±å®¹å¨æ ¹æ®é ç½®è ¢è¡«æ件å»å建å®ä¾å¹¶å建å个å®ä¾ä¹é´çä¾èµå ³ç³»\x0d\æ ¸å¿ï¼beanå·¥åï¼å¨Springä¸ï¼beanå·¥åå建çå个å®ä¾ç§°ä½bean\x0d\äºãAOP(Aspect-OrientedProgramming):é¢åæ¹é¢ç¼ç¨ã\x0d\1ã代çç两ç§æ¹å¼ï¼\x0d\éæ代çï¼\x0d\é对æ¯ä¸ªå ·ä½ç±»åå«ç¼å代çç±»ã\x0d\é对ä¸ä¸ªæ¥å£ç¼åä¸ä¸ªä»£çç±»ã\x0d\å¨æ代çï¼\x0d\é对ä¸ä¸ªæ¹é¢ç¼åä¸ä¸ªInvocationHandlerï¼ç¶ååç¨JDKåå°å ä¸çProxy类为åç§æ¥å£å¨æçæç¸åºç代çç±»ã\x0d\2ãAOPç主è¦åçï¼å¨æ代çã\x0d\Springå·¥ä½åç\x0d\Springå·²ç»ç¨è¿ä¸æ®µæ¶é´äºï¼æè§Springæ¯ä¸ªå¾ä¸éçæ¡æ¶ãå é¨ææ ¸å¿çå°±æ¯IOCäºï¼\x0d\å¨ææ³¨å ¥ï¼è®©ä¸ä¸ªå¯¹è±¡çå建ä¸ç¨newäºï¼å¯ä»¥èªå¨çç产ï¼è¿å ¶å®å°±æ¯å©ç¨javaéçåå°ï¼åå°å ¶å®å°±æ¯å¨è¿è¡æ¶å¨æçå»å建ãè°ç¨å¯¹è±¡ï¼Springå°±æ¯å¨è¿è¡æ¶ï¼è·xmlSpringçé ç½®æ件æ¥å¨æçå建对象ï¼åè°ç¨å¯¹è±¡éçæ¹æ³çã\x0d\Springè¿æä¸ä¸ªæ ¸å¿å°±æ¯AOPè¿ä¸ªå°±æ¯é¢ååé¢ç¼ç¨ï¼å¯ä»¥ä¸ºæä¸ç±»å¯¹è±¡è¿è¡çç£åæ§å¶ï¼ä¹å°±æ¯å¨è°ç¨è¿ç±»å¯¹è±¡çå ·ä½æ¹æ³çååå»è°ç¨ä½ æå®ç模åï¼ä»èè¾¾å°å¯¹ä¸ä¸ªæ¨¡åæ©å çåè½ãè¿äºé½æ¯éè¿é 置类达å°è°åºçã\x0d\Springç®çå«æ¡£æ¡ï¼å°±æ¯è®©å¯¹è±¡ä¸å¯¹è±¡ï¼æ¨¡åä¸æ¨¡åï¼ä¹é´çå ³ç³»æ²¡æéè¿ä»£ç æ¥å ³èï¼é½æ¯éè¿é 置类说æ管ççï¼Springæ ¹æ®è¿äºé ç½®å é¨éè¿åå°å»å¨æçç»è£ 对象ï¼\x0d\è¦è®°ä½ï¼Springæ¯ä¸ä¸ªå®¹å¨ï¼å¡æ¯å¨å®¹å¨éç对象æä¼æSpringææä¾çè¿äºæå¡ååè½ã\x0d\Springéç¨çæç»å ¸çä¸ä¸ªè®¾è®¡æ¨¡å¼å°±æ¯ï¼æ¨¡æ¿æ¹æ³æ¨¡å¼ã
SpringBootåºç¨å¯å¨åç(äº)æ©å±URLClassLoaderå®ç°åµå¥jarå è½½å¨ä¸ç¯æç« ãSpringBootåºç¨å¯å¨åç(ä¸)å°å¯å¨èæ¬åµå ¥jarãä¸ä»ç»äºSpringBootå¦ä½å°å¯å¨èæ¬ä¸RunnableJaræ´å为ExecutableJarçåçï¼ä½¿å¾çæçjar/waræ件å¯ä»¥ç´æ¥å¯å¨
æ¬ç¯å°ä»ç»SpringBootå¦ä½æ©å±URLClassLoaderå®ç°åµå¥jarçç±»(èµæº)å è½½ï¼ä»¥å¯å¨æ们çåºåæ£æç¨ã
é¦å 岩ä¼ï¼ä»ä¸ä¸ªç®åç示ä¾å¼å§
build.gradle
WebApp.java
æ§è¡gradlebuildæ建jarå ï¼éé¢å å«åºç¨ç¨åºã第ä¸æ¹ä¾èµä»¥åSpringBootå¯å¨ç¨åºï¼å ¶ç®å½ç»æå¦ä¸
æ¥çMANIFEST.MFçå 容(MANIFEST.MFæ件çä½ç¨è¯·èªè¡GOOGLE)
å¯ä»¥çå°ï¼jarçå¯å¨ç±»ä¸ºorg.springframework.boot.loader.JarLauncherï¼è并ä¸æ¯æ们çcom.manerfan.SpringBoot.theory.WebAppï¼åºç¨ç¨åºå ¥å£ç±»è¢«æ 记为äºStart-Class
jarå¯å¨å¹¶ä¸æ¯éè¿åºç¨ç¨åºå ¥å£ç±»ï¼èæ¯éè¿JarLauncher代çå¯å¨ãå ¶å®SpringBootæ¥æ3ä¸ä¸åçLauncherï¼JarLauncherãWarLauncherãPropertiesLauncher
SpringBoot使ç¨Launcher代çå¯å¨ï¼å ¶æéè¦çä¸ç¹ä¾¿æ¯å¯ä»¥èªå®ä¹ClassLoaderï¼ä»¥å®ç°å¯¹jaræ件å ï¼jarinjarï¼æå ¶ä»è·¯å¾ä¸jarãclassæèµæºæ件çå è½½
å ³äºClassLoaderçæ´å¤ä»ç»å¯åèãæ·±å ¥ç解JVMä¹ClassLoaderã
SpringBootæ½è±¡äºArchiveçæ¦å¿µï¼ä¸ä¸ªArchiveå¯ä»¥æ¯jarï¼JarFileArchiveï¼ï¼å¯ä»¥æ¯ä¸ä¸ªæ件ç®å½ï¼ExplodedArchiveï¼ï¼å¯ä»¥æ½è±¡ä¸ºç»ä¸è®¿é®èµæºçé»è¾å±ã
ä¸ä¾ä¸ï¼spring-boot-theory-1.0.0.jaræ¢ä¸ºä¸ä¸ªJarFileArchiveï¼spring-boot-theory-1.0.0.jar!/BOOT-INF/libä¸çæ¯ä¸ä¸ªjarå ä¹æ¯ä¸ä¸ªJarFileArchive
å°spring-boot-theory-1.0.0.jar解åå°ç®å½spring-boot-theory-1.0.0ï¼åç®å½spring-boot-theory-1.0.0为ä¸ä¸ªExplodedArchive
æç §å®ä¹ï¼JarLauncherå¯ä»¥å è½½å é¨/BOOT-INF/libä¸çjarå/BOOT-INF/classesä¸çåºç¨class
å ¶å®JarLauncherå®ç°å¾ç®å
å ¶ä¸»å ¥å£æ°å»ºäºJarLauncher并è°ç¨ç¶ç±»Launcherä¸çlaunchæ¹æ³å¯å¨ç¨åº
åå建JarLauncheræ¶ï¼ç¶ç±»ExecutableArchiveLauncheræ¾å°èªå·±æå¨çjarï¼å¹¶å建archive
å¨Launcherçlaunchæ¹æ³ä¸ï¼éè¿ä»¥ä¸archiveçgetNestedArchivesæ¹æ³æ¾å°/BOOT-INF/libä¸ææjarå/BOOT-INF/classesç®å½æ对åºçarchiveï¼éè¿è¿äºarchivesçurlçæLaunchedURLClassLoaderï¼å¹¶å°å ¶è®¾ç½®ä¸ºçº¿ç¨å¥½æ©¡ä¸ä¸æç±»å è½½å¨ï¼å¯å¨åºç¨
è³æ¤ï¼ææ§è¡æ们åºç¨ç¨åºä¸»å ¥å£ç±»çmainæ¹æ³ï¼ææåºç¨ç¨åºç±»æ件åå¯éè¿/BOOT-INF/classeså è½½ï¼ææä¾èµç第ä¸æ¹jaråå¯éè¿/BOOT-INF/libå è½½
å¨åæLaunchedURLClassLoaderåï¼é¦å äºè§£ä¸ä¸URLStreamHandler
javaä¸å®ä¹äºURLçæ¦å¿µï¼å¹¶å®ç°å¤ç§URLåè®®ï¼è§URLï¼*http**file**ftp**jar*çï¼ç»å对åºçURLConnectionå¯ä»¥çµæ´»å°è·ååç§åè®®ä¸çèµæº
对äºjarï¼æ¯ä¸ªjaré½ä¼å¯¹åºä¸ä¸ªurlï¼å¦
jar:file:/data/spring-boot-theory/BOOT-INF/lib/spring-aop-5.0.4.RELEASE.jar!/
jarä¸çèµæºï¼ä¹ä¼å¯¹åºä¸ä¸ªurlï¼å¹¶ä»¥'!/'åå²ï¼å¦
jar:file:/data/spring-boot-theory/BOOT-INF/lib/spring-aop-5.0.4.RELEASE.jar!/org/springframework/aop/SpringProxy.class
对äºåå§çJarFileURLï¼åªæ¯æä¸ä¸ª'!/'ï¼SpringBootæ©å±äºæ¤åè®®ï¼ä½¿å ¶æ¯æå¤ä¸ª'!/'ï¼ä»¥å®ç°jarinjarçèµæºï¼å¦
jar:file:/data/spring-boot-theory.jar!/BOOT-INF/lib/spring-aop-5.0.4.RELEASE.jar!/org/springframework/aop/SpringProxy.class
èªå®ä¹URLçç±»æ ¼å¼ä¸º[pkgs].[protocol].Handlerï¼å¨è¿è¡Launcherçlaunchæ¹æ³æ¶è°ç¨äºJarFile.registerUrlProtocolHandler()以注åèªå®ä¹çHandler
å¨å¤çå¦ä¸URLæ¶ï¼ä¼å¾ªç¯å¤ç'!/'åé符ï¼ä»æä¸å±åºåï¼å æé spring-boot-theory.jarçJarFileï¼åæé spring-aop-5.0.4.RELEASE.jarçJarFileï¼æåæé æåSpringProxy.classç
JarURLConnectionï¼éè¿JarURLConnectionçgetInputStreamæ¹æ³è·åSpringProxy.classå 容
ä»ä¸ä¸ªURLï¼å°è¯»åå ¶ä¸çå 容ï¼æ´ä¸ªè¿ç¨ä¸º
URLClassLoaderå¯ä»¥éè¿åå§çjaråè®®ï¼å è½½jarä¸ä»classæ件
LaunchedURLClassLoaderéè¿æ©å±çjaråè®®ï¼ä»¥å®ç°jarinjarè¿ç§æ åµä¸çclassæ件å è½½
æ建warå å¾ç®å
æ建åºçwarå ï¼å ¶ç®å½æºæ为
MANIFEST.MFå 容为
æ¤æ¶ï¼å¯å¨ç±»å为äºorg.springframework.boot.loader.WarLauncherï¼æ¥çWarLauncherå®ç°ï¼å ¶å®ä¸JarLauncher并æ 太大差å«
å·®å«ä» å¨äºï¼JarLauncherå¨æ建LauncherURLClassLoaderæ¶ï¼ä¼æç´¢BOOT-INF/classesç®å½åBOOT-INF/libç®å½ä¸jarï¼WarLauncherå¨æ建LauncherURLClassLoaderæ¶ï¼åä¼æç´¢WEB-INFO/classesç®å½åWEB-INFO/libåWEB-INFO/lib-provided两个ç®å½ä¸çjar
å¦æ¤ä¾èµï¼æ建åºçwar便æ¯æ两ç§å¯å¨æ¹å¼
PropretiesLauncherçå®ç°ä¸JarLauncherWarLauncherçå®ç°æ为ç¸ä¼¼ï¼éè¿PropretiesLauncherå¯ä»¥å®ç°æ´ä¸ºè½»éçthinjarï¼å ¶å®ç°æ¹å¼å¯èªè¡æ¥é æºç
SpringBootè¿è¡åçSpringBootæ¯ä¸ä¸ªåºäºSpringå¼åï¼éæäºå¤§é第ä¸æ¹åºé ç½®çjavawebå¼åæ¡æ¶
pom.xml
ç¶ä¾èµ
å ¶ä¸å®ä¸»è¦æ¯ä¾èµä¸ä¸ªç¶é¡¹ç®ï¼ä¸»è¦æ¯ç®¡ç项ç®çèµæºè¿æ»¤åæ件ã以åæä»¬å¯¼å ¥ä¾èµé»è®¤æ¯ä¸éè¦åçæ¬çã
å¯å¨å¨spring-boot-starter
springboot-boot-starter-xxx:spring-bootçåºæ¯å¯å¨å¨é御
spring-boot-starter-web:帮æä»¬å¯¼å ¥äºweb模åæ£å¸¸è¿è¡æä¾èµçç»ä»¶ã
springBootå°ææçåè½åºæ¯é½æ½ååºæ¥ï¼åæä¸ä¸ªä¸ªçstarter(å¯å¨å¨)ï¼åªéè¦å¨é¡¹ç®ä¸å¼å ¥è¿äºstarterå³å¯ï¼ææç¸å ³çä¾èµé½ä¼è¢«å¼è¿æ¥ï¼æ们è¦ç¨ä»ä¹åè½å°±å¯¼å ¥ä»ä¹æ ·çåºæ¯å¯å¨å¨å³å¯ã
@SpringBootApplication
ä½ç¨ï¼æ 注å¨æ个类ä¸è¯´æè¿ä¸ªç±»æ¯SpringBootç主é 置类ï¼SpringBootè¿è¡è¿ä¸ªç±»çmainæ¹æ³æ¥å¯å¨SpringBootåºç¨ã
è¿å ¥è¿ä¸ªæ³¨è§£ï¼éé¢å å«äºå¾å¤å ¶ä»æ³¨è§£
@ComponentScanä½ç¨ï¼èªå¨æ«æ并å 载符åæ¡ä»¶çç»ä»¶æè beanï¼å°è¿ä¸ªbeanå®ä¹å è½½å°IOC容å¨ä¸ã
@SpringBootConfigurationä½ç¨ï¼SpringBootçé 置类ï¼æ 注å¨æ个类ä¸ï¼è¡¨ç¤ºè¿æ¯ä¸ä¸ªå§¿åSpringBootçé 置类ã
è¿å ¥@SpringBootConfiguration注解æ¥çï¼è¿éç@Configuration说æè¿æ¯ä¸ä¸ªé 置类ï¼é 置类对åºSpringçxmlé ç½®æ件ã
继ç»æ¥ç@SpringBootConfigurationå å«çå ¶ä»æ³¨è§£
@EnableAutoConfigurationï¼å¼å¯èªå¨é ç½®åè½
è¿å ¥@EnableAutoConfiguration注解æ¥ç
@AutoConfigurationPackageèªå¨é ç½®å
@importï¼Springåºå±æ³¨è§£@importï¼ç»å®¹å¨ä¸å¯¼å ¥ä¸ä¸ªç»ä»¶
@Importï¼{ AutoConfigurationImportSelector.class}ï¼ç»å®¹å¨å¯¼å ¥ç»ä»¶
AutoConfigurationImportSelectorï¼èªå¨é ç½®å¯¼å ¥éæ©å¨ãé£ä¹å®å¯¼å ¥åªäºç»ä»¶çéæ©å¨å¢
è¿ä¸ªç±»ä¸æè¿æ ·ä¸ä¸ªæ¹æ³ï¼getCandidateConfiguration,源码èå¨è¿ä¸ªæ¹æ³ä¸æè°ç¨äºSpringFactoriesLoaderç±»çéææ¹æ³loadFactoryNames()æ¹æ³
è¿å ¥loadSpringFactoriesæ¹æ³
æ ¹æ®å ¨å±æç´¢Spring.factoriesï¼æå¼åæ¯èªå¨é ç½®çæ件ã
é便æå¼ä¸ä¸ªå ¶ä¸çèªå¨é 置类çï¼å®ä»¬é½åå岩æ¯javaConfigé 置类ï¼é½æ³¨å ¥äºä¸äºBean
æ以ï¼èªå¨é ç½®çæ£å®ç°æ¯ä»classpathä¸æ寻ææçMETA-INF/spring.factoriesé ç½®æ件ï¼å¹¶å°å ¶ä¸å¯¹åºçorg.springframework.boot.autoconfigureå ä¸çé 置项éè¿åå°å®ä¾å为对åºæ 注äº@ConfigurationçjavaConfigå½¢å¼çIOC容å¨é 置类ï¼ç¶åå°è¿äºé½æ±æ»æ为ä¸ä¸ªå®ä¾å¹¶å è½½å°IOC容å¨ä¸ã
ç»è®ºï¼
1.SpringBootå¨å¯å¨çæ¶åä»ç±»è·¯å¾ä¸çMETA-INF/spring.factoriesä¸è·åEnableAutoConfigurationæå®çå¼
2.å°è¿äºå¼ä½ä¸ºèªå¨é ç½®ç±»å¯¼å ¥å®¹å¨ï¼èªå¨é 置类就çæï¼å¸®æ们è¿è¡èªå¨é 置工ä½ã
3.æ´ä¸ªJ2EEçæ´ä½è§£å³æ¹æ¡åèªå¨é ç½®é½å¨springboot-autoConfigureçjarå ä¸ã
4.å®ä¼ç»å®¹å¨ä¸å¯¼å ¥é常å¤çèªå¨é 置类ï¼xxxAutoConfigurationï¼,å°±æ¯ç»å®¹å¨ä¸å¯¼å ¥è¿ä¸ªåºæ¯éè¦çææç»ä»¶ï¼å¹¶é 置好è¿äºç»ä»¶ã
5.æäºèªå¨é 置类ï¼å å»äºæ们æå¨ç¼åé ç½®æ³¨å ¥åè½ç»ä»¶ççå·¥ä½ã
SpringApplication
è¿ä¸ªç±»ä¸»è¦åäºä»¥ä¸å件äº
1.æ¨æåºç¨çç±»åæ¯æ®éç项ç®è¿æ¯web项ç®
2.æ¥æ¾å¹¶å è½½ææå¯ç¨åå§åå¨ï¼è®¾ç½®å°initializerså±æ§ä¸
3.æ¾åºææçåºç¨ç¨åºçå¬å¨ï¼è®¾ç½®å°listenerså±æ§ä¸
4.æ¨æ并设置mainæ¹æ³çå®ä¹ç±»ï¼æ¾å°è¿è¡ç主类
SpringbootBatchçå¯å¨åç-ConfigurationSpringbootæ´åäºwebåbatchï¼ä½æ¯ä»ä»¬è¯å®ä¸æ¯åä¸æ¡è·¯ï¼å¨springbootä¸ï¼ä¼æ¨æå½åçè¿è¡ç¯å¢ãthis.webApplicationType=WebApplicationType.deduceFromClasspath();
ä»ä¸ç¨¿æ¨±æå¯ä»¥çåºï¼Springå°è¯ä»classpathéæ¾å°ç¹å¾ç±»ï¼æ¥å¤æå½åappæ¯ä»ä¹ç±»åãå½ç¶è¿ç§å¤ææ¯æå±éæ§çï¼æå¯è½æ¯transitive带ææ¸è¿æ¥ä¸ä¸ªå¸¦æservletç类被å½æäºWebApplicationType.SERVLETï¼å®é ä¸æ¯ä¸ªWebApplicationType.NONE;ãå¦æä¸æ³ä»¥webè¿è¡å°±æ¯æ³è¿è¡batchå¯ä»¥å¨application.properties强è¡æå®WebApplicationType
å ·ä½åçä½ç¨ç请çä¸é¢çstacktrace
å½ä¸ä¸ªbatchapplicationéè¦å¯å¨ï¼éè¦é ç½®JobRepositoryï¼Datasourceççï¼ææçå¼å§é½æ¥èªä¸ä¸ªannotation@EnableBatchProcessing
å½å å ¥@EnableBatchProcessingæ¶ï¼BatchConfigurationSelectorå¼å§å¯å¨ï¼æä¹å¯å¨ç大家å¯ä»¥é®æä¸åèä¸é¢çstacktraceã
import类主è¦æ¯ç±ConfigurationClassPostProcessoræ¥å®ç°çãå½BatchConfigurationSelector被è°ç¨çæ¶åï¼æ们å¯ä»¥çå°ä»æ两æ¡æ¯è·¯ã
é£ä¹è¿ä¸¤æ¡è·¯æå¥ä¸åå¢ã主è¦æ¯jobå®ä¹çæ¹å¼ä¸åã
modular=trueçæ åµä¸ï¼ä¸é¢æ¯ä¸ä¸ªä¾å
å¯ä»¥æå¤ä¸ªåAp
bootloader到底是什么?
Bootloader:解锁手机潜力的关键 在手机刷机的世界里,对于那些对技术懵懂的启动器新手来说,理解Bootloader这个词就像是源码打开新世界大门的钥匙。Bootloader,启动器简单来说,源码就像是安卓设备的启动器,它在操作系统启动之前运行,扮演着至关重要的角色。 启动过程的守护者 想象一下,Bootloader就像手机的"BIOS",负责初始化硬件,检测内存大小,确保手机以最佳状态启动。它确保一切设置就绪,让屏幕从冷启动到活跃。如果Bootloader出现故障,手机就无法正常启动,即使按下了电源键和音量键的组合,也无法进入恢复模式或快速启动,更别提正常使用了。 定制与差异 对于嵌入式系统,Bootloader是硬件平台特定的,这意味着每个处理器架构都有其专属的Bootloader。比如,即便使用同款处理器,不同的嵌入式板卡可能需要定制的Bootloader,因为它们的硬件配置不同。这就解释了为什么在某些板卡上运行的Bootloader可能无法在其他板卡上直接运行,通常需要对源代码进行相应修改。thinkphp 学校源码 解锁与界限 值得留意的是,Bootloader的存在常常与解锁手机功能紧密相连。要刷入第三方ROM,你必须首先破解Bootloader,因为它是硬件初始化的入口。不解除锁定,手机无法初始化硬件,自然也无法使用。在刷机术语中,Bootloader和Fastboot的概念有时会被混淆,但对于某些特定的手机型号,我们确实需要关注Bootloader解锁和相应的驱动程序。 总结与启示 了解Bootloader的作用,就如同掌握了手机操作系统的解锁密码。今天,你已经对这个关键术语有了初步的认识。希望这些信息能帮助你在刷机的道路上少走弯路,让你的手机性能提升更加得心应手。我的世界hmcl启动器怎么加光影
hmcl启动器加光影的方法: 1、首先,打开我的世界。 2、点击“资源中心”。 3、然后点击“多玩专区”。 4、然后直接点击“搜索”图形。 5、然后在输入栏中输入“光影”。 6、然后选择你想要的光影,点击“免费”。 7、然后点击“确定购买”。 8、购买成功后,点击“下载”。 9、django 事务 源码下载成功后即可安装,点击“装载”。 、然后选择自己装载的地图,点击“确定”。 、最后进入游戏,我的世界会被你选择的光影加载,hmcl启动器成功加载光影 Hello Minecraft! Launcher (中文名:你好我的世界启动器,简称:HMCL) 是一个免费、自由、开放源代码的 Minecraft 启动器。 Hello Minecraft! Launcher是huanghongxun 开发的一款可在多平台启动 Minecraft Java Edition 的游戏启动器。可启动范围不包含我的世界中国版。开源软件Qt编写的知名的开源软件列表
Qt是一个开发的跨平台C++图形用户界面应用程序开发框架,它既适用于创建GUI程序,也能用于非GUI程序的开发。最新版本是6.0。以下是一些由Qt编写的知名开源软件列表:
3DSlicer是一个用于可视化和医学图像计算的免费开源软件。
AcetoneISO是一款镜像文件挂载软件。
Adobe Photoshop Album是一款图像组织应用程序。
Arora是一款跨平台的开源网页浏览器。
Autodesk MotionBuilder是一款专业3D角色动画软件。
Autodesk Maya是一款用于3D建模和动画的软件。
Avidemux是一款多用途视频编辑和处理的免费软件程序。
Avogadro是一款高级分子编辑器。
BOUML是一款免费的UML工具箱。
chmcreator是一款开源的CHM开发工具。
CineFX是一款跨平台、开源、免费、视频剪辑软件。
CoCoA是一款交换代数计算软件。
Dash Express是一款支持互联网的个人导航设备。
DAZ Studio是一款三维图形演示/动画应用程序。
Doxygen是一款API文件产生器。
EAGLE是一款用于印刷电路板(PCB)设计的工具。
EiskaltDC++是上帝视觉源码一款使用直接连接协议的程序。
Emergent是一款神经网络模拟器。
FEKO是一款电磁场模拟软件产品。
eva是Linux版QQ聊天软件。
FreeCAD是一款自由开源的三维实体和通用设计CAD/CAE。
FreeMat是一款自由开源的数值计算环境和编程语言。
Full Tilt Poker是一款在线扑克程序。
Gadu-Gadu是一款实时通信软件。
Gambas是一款基于基本解释器的自由开发环境。
GoldenDict是一款开源的字典软件。
Google地球是一款三维虚拟地图软件。
GNS是一款Cisco网络模拟器。
Guitar Pro 6是一款a tablature editor。
刺猬大作战是一款基于百战天虫的开源游戏。
Hydrogen是一款高级鼓机。
ImageVis3D是一款体积射线投射应用。
Ipe是一款自由的矢量图形编辑器。
ISE Webpack是一款为Windows和Linux开发的免费EDA工具。
Kadu是一款使用Gadu-Gadu协议的波兰即时通信工具。
KDELibs是许多KDE程序都使用的共享库。
KeePassX是KeePass的多平台移植版本。
Last.fm播放器是著名互联网音乐社交网站的桌面客户端。
Launchy是一款开放源代码的快捷启动器。
LMMS是一款开放源代码的音乐编辑软件。
LyX是一款使用Qt作为界面的LaTeX软件。
Mathematica在Linux和Windows版本中使用Qt作为GUI。
Maxwell Render是一款帮助从计算机三维模型数据生成照片级真实感图像的软件包。
Mixxx是一款跨平台的开放源代码DJ混音软件。
MuseScore是一款WYSIWYG的乐谱编辑器。
MythTV是一款开源的数字视频录制软件。
Nuke是一款基于节点的合成器。
PDFedit是一款自由的PDF编辑器。
PokerTH是一款开放源代码的德州扑克模拟器。
Psi是一款基于XMPP网络协议的实时通信软件。
qBittorrent是一款自由的BitTorrent P2P客户端。
QCad是一款用于二维设计及绘图的CAD软件。
Qjackctl是一款用于控制插孔音频连接套件的工具。
QSvn是一款Linux、UNIX、吉祥小鸡源码Mac OS X和Windows的GUI Subversion客户端。
Opera是一款著名的网页浏览器。
Qt Creator是Nokia的免费软件、跨平台、集成开发环境。
Qterm是一款跨平台的BBS软件。
Quantum GIS是一款自由的桌面GIS。
Quassel IRC是一款跨平台的IRC客户端。
QupZilla是一款跨平台的开放源代码Webkit网页浏览器。
RealFlow是一款三维工业流体和动力学模拟器。
Recoll是一款桌面搜索工具。
Rosegarden是一款免费软件数字音频工作站程序。
SciDAVis是一款跨平台绘图与数据分析程序。
Scribus是一款桌面排版软件。
Skype是一款使用人数众多的基于P2P的VOIP聊天软件。
SMPlayer是一款跨平台多媒体播放器。
Spotify是一款音乐流媒体服务。
Stellarium是一款天文学的自由软件。
TeamSpeak是一款跨平台的音效通信软件。
Texmaker是一款跨平台的开放源代码LaTeX编辑器。
TeXworks是排版系统TeX的图形用户界面。
Tlen.pl是一款波兰人发明的实时通信客户端。
TOra是一款数据库管理工具。
UMPlayer是一款基于Mplayer的美观多媒体播放器。
UniversalIndentGUI是一款帮助用户美化代码的应用程序。
Valknut是一款使用直接连接协议的程序。
VirtualBox是一款虚拟机软件。
VisIt是一款开源型交互式并行可视化与图形分析工具。
VisTrails是一款科学的工作流管理与可视化系统。
VLC多媒体播放器是一款体积小巧、功能强大的开源媒体播放器。
VoxOx是一款统一通信软件。
WordPress基于Qt,适用于Maemo和Symbian。
wpa supplicant是一款IEEE.i的自由软件实现。
Xconfig是Linux的Kernel配置工具。
YY语音又名“歪歪语音”,是一个在中国大陆拥有庞大用户群的在线多人语音聊天和语音会议的免费软件。
咪咕音乐是中国移动倾力打造的正版音乐播放器。
WPS Office是金山公司(Kingsoft)出品的办公软件,与微软Office兼容性良好,个人版免费。
拥抱原生的另一种方式,完美替代 Pixel Launcher:Lawnchair | App+1
Lawnchair,一款由开发者@Till Kottmann基于AOSP中的Launcher3源码开发的启动器,致力于提供原生体验的同时,带来超越原生的功能与美观。对于追求个性与原生体验的Android用户来说,这款启动器值得深入探索。
在Lawnchair中,你将体验到与Pixel Launcher类似但更加个性化的功能。例如,它实现了全局统一且规范的图标大小,使所有应用图标在大小上符合Material Design设计规范,看起来更加和谐。用户还可以根据个人喜好手动调整全局图标大小。
此外,Lawnchair在保持Pixel Launcher风格的同时,引入了一种替代的主屏Widget样式,让你拥有更多选择。它还保留了Android O上的新特性,如应用快捷方式的UI设计、通知角标支持和长按应用图标查看通知预览功能,让你在旧版系统中也能体验到新特性。
对于Google应用的整合,Lawnchair也做得恰到好处。安装后,Google Feed用户可以在启动器的“负一屏”查看到常用天气、资讯和行程动态卡片,无需额外安装应用,使用体验与Pixel Launcher一致。
在可定制方面,Lawnchair提供了多种选项,包括手势操作、应用图标隐藏等功能,满足不同用户的需求。如果你对原生启动器有所追求,Lawnchair可以成为完美的替代者。
需要注意的是,由于无缝整合Google应用这一特性采用了特殊处理,Lawnchair暂时无法在Google Play上架。用户可以通过访问GitHub(稳定版)或加入Telegram频道(测试版)来下载。
我的世界HMCL启动器开发版V官方版我的世界HMCL启动器开发版V官方版功能简介
大家好,关于我的世界HMCL启动器开发版 V3.5.2. 官方版,我的世界HMCL启动器开发版 V3.5.2. 官方版功能简介这个很多人还不知道,现在让我们一起来看看吧!我的世界HMCL启动器最新版是一款功能强大的游戏启动软件,能够帮助用户轻松启动游戏,提升游戏体验,满足用户的各种我的世界版本启动需求。软件为开发测试版,集合了最新的功能,用户可以第一时间体验到软件的最新功能。
软件功能
1、支持离线模式和正版登录
2、支持Forge,Optifine和LiteLoader自动安装
3、自动下载游戏缺失库和资源
4、支持mod管理
5、支持界面主题定制、整合包制作
软件特色
1、HMCL支持WIN、linux、macOS操作系统
2、比其他我的世界启动器感加好的支持库下载,让你使用任何游戏、作弊端轻松自如
3、个性化的配色,提供更舒适的视觉体验
4、自动式安装
5、在线获取所有游戏版本,为所安装的游戏核心提供全自动配置安装Fcrge、 Liteloader、 Optifine功能以及资源文件补齐功能。
软件优势
1、自动安装,支持导入 Curse、MultiMC 整合包,创建游戏并安装 Fabric、Forge、LiteLoader、OptiFine,支持导出 HMCL、MultiMC 整合包
2、个性化主题,多种启动器配色方案,支持更换背景图
3、开放源代码Hello Minecraft! Launcher 根据 GPLv3 协议开放源代码,开放且自由。从 年开始,已经获得至少 位贡献者的支持。
使用方法
游戏的主界面是这样子的,很简洁,等会儿下载完游戏之后需要在这个页面启动游戏。
游戏设置页面,如下图,
在这个页面可以设置java路径,内存大小等,同时后期加装Forge、LiteLoader、OptiFine等,也再此页面,选择自动安装。
点右下角添加游戏,启动器会把所有版本的游戏全部列出来,包括正式版游戏与快照版游戏,点击自己需要的版本后,再点右边的箭头下载,游戏就开始下载了。
给游戏起个喜欢的名字,点击下方的安装,游戏就开始下载了;同时如果需要安装Fabric、Forge、LiteLoader、OptiFine的话,可以选择其他四个选项安装。
等到都下载完成之后,回到主页面,选择需要的游戏版本,正版用户输入账号密码,盗版用户给自己起个名字,点击启动Minecraft就可以开始游戏了!
常见问题
Q1:为何无法启动?
A1:可能是您的设置问题或文件夹格式以及json错误,如果是使用某整合包,请联系整合包作者,我有时间也可以帮您调试。
Q2:为何在资源下载或游戏下载没有东西?
A2:刷新一下即可,官方服务器有时候会挂。
Q3:为什么下载游戏后没有声音中文?(问的人多就写出来)
A3:你没有下载资源文件,自行下载或使用启动器“设置->资源下载->全部下载”。
Q4:为什么Minecraft一闪而过/没有打开?
A4:
1)重启启动器后下载错误的文件不能被重新下载导致Minecraft启动失败。删除.minecraft/libraries文件夹重新下载即可(或者知道是哪个文件下载错误也可只删除对应文件。
2)(重要)安装了Java 1.8.0_及以后的Java运行时而Forge未更新所致,请卸载Java8更换Java 8u或Java
嵌入式界的顶流开源项目,RetroPie 是怎么设计的?
RetroPie 是一款基于开源项目的树莓派游戏机解决方案,它让树莓派等板子能够运行复古游戏。其基于 Shell 开发,拥有 9.4K 星标,凸显了其独特价值。RetroPie 的核心在于集成有能模拟运行复古游戏的模拟器,最流行的是 RetroArch。RetroArch 负责基础功能,如音频、显示,而各个模拟器核心则负责实际游戏模拟。Emulationstation 是一个常用的开源启动器,为用户选择启动游戏提供菜单界面。
在树莓派上运行 Emulationstation 或者 Pegasus 启动器,可体验更丰富的游戏选择。对于嵌入式物联网学习者,可关注 C语言、Linux开发、数据结构等技术,以及软件开发、STM单片机、ARM硬件开发、物联网通信开发等实践内容。同时,了解 RetroPie 源码的优雅设计,可为项目开发提供宝贵灵感。
RetroPie 的核心设计包括定义一组函数集,分别对应获取源码、编译、安装、配置四个步骤,帮助软件包专注于核心功能,提高效率。核心层系统.sh、助手.sh、软件包管理.sh 等文件,以及注册模块的 rp_registerModule() 和编译安装模块的 rp_callModule() 等函数,构成了 RetroPie 的内部实现。
Shell 编程在 RetroPie 开发中扮演重要角色,提供灵活且强大的功能。在实际应用中,应注重代码的优雅和稳定性,以及对用户需求的细致考量。RetroPie 的成功展示了简单功能实现稳定性的价值,强调以用户为中心的产品设计理念。
总结而言,RetroPie 是一个集复古游戏模拟与现代技术于一体的优秀开源项目。学习其设计和实现,不仅能提升个人技术能力,还能深入了解嵌入式物联网领域的先进实践。对于寻求知识和灵感的学习者而言,RetroPie 是一个宝贵资源。