第ä¸æ¬¡åCSDNå客ï¼è¿éæ¯å°ç½èªå·±æ´ççå°ç¡ è°·çSpringBootè§é¢ç¬¬ä¸é¨åçç¬è®°ï¼è§é¢éé¢ä½¿ç¨çæ¯1.5çæ¬çSpringBootï¼ææ¯ç¨çæ¯2.0.5çæ¬çï¼å ¶ä¸æ许å¤ä¸ä¸æ ·ï¼å¯è½ä¼æ许å¤é误ï¼è¯·å¤§å®¶ææ£ãå ¶ä¸dockerç使ç¨ï¼æ使ç¨çæ¯windowsçæ¬çdockerï¼linuxçæ¬çä¸è§é¢ä¸è´ãå ¨æææï¼å¿å·ååã
æç« ç®å½
- ä¸ãspring boot å ¥é¨
-
- 1ãSpring boot ç®ä»
- 2ãå¾®æå¡
- 3ãç¯å¢åå¤
-
- 1ãmaven设置
- 2ãIDEA设置
- 4ãSpring Boot HelloWorld
-
- 1ãå建ä¸ä¸ªmavenå·¥ç¨ï¼ï¼jarï¼
- 2ãå¯¼å ¥spring boot ç¸å ³çä¾èµ
- 3ãç¼åä¸ä¸ªä¸»ç¨åºï¼å¯å¨Spring Boot åºç¨
- 4ãç¼åç¸å ³çControllerãService
- 5ãè¿è¡ä¸»ç¨åºæµè¯
- 6ãç®åé¨ç½²
- 5ãHello Worldæ¢ç©¶
-
- 1ãPOMæ件
-
- 1ãç¶é¡¹ç®
- 2ãå¯å¨å¨
- 2ã主ç¨åºç±»ï¼ä¸»å ¥å£ç±»
- 6ãä½¿ç¨ Spring Initializerå¿«éå建Spring Boot 项ç®
- äºãé ç½®æ件
-
- 1ãé ç½®æ件
- 2ãYAMLè¯æ³ï¼
-
- 1ãåºæ¬è¯æ³
- 2ãå¼çåæ³
-
- åé¢éï¼æ®éçå¼ï¼æ°åãå符串ãå¸å°ï¼ï¼
- 对象ãMapï¼å±æ§åå¼ï¼ï¼é®å¼å¯¹ï¼ï¼
- æ°ç»ï¼ListãSetï¼ï¼
- 3ãé ç½®æ件å¼æ³¨å ¥
-
- 1ãpropertiesé ç½®æ件å¨ideaä¸é»è®¤utf-8å¯è½ä¼ä¹±ç
- 2ã@Valueè·åå¼å@ConfigurationPropertiesè·åå¼çæ¯è¾
- 3ãé ç½®æä»¶æ³¨å ¥æ°æ®æ ¡éªï¼JSR303ï¼
- 4ã@PropertySourceï¼å è½½é ç½®æ件propertiesä¸åªè½å è½½propertiesæä»¶ï¼ & @ImportResourceï¼å è½½springçxmlé ç½®æ件ï¼
- 4ãé ç½®æ件å ä½ç¬¦
-
- 1ãéæºæ°
- 2ãå ä½ç¬¦è·åä¹åé ç½®çå¼ï¼å¦æ没æåå¯ä»¥ç¨ : æå®é»è®¤å¼
- 5ãProfile
-
- 1ãå¤Profileæ件
- 2ãymlæ¯æå¤ææ¡£åæ¹å¼
- 3ãæ¿æ´»æå®profile
- 6ãé ç½®æ件å è½½ä½ç½®
- 7ãå¤é¨é ç½®å 载顺åº
- 8ãèªå¨é ç½®åç
-
- 1ãèªå¨é ç½®åç
- 2ãç»è
-
- 1ã@Conditionalæ´¾ç注解ï¼Spring注解çåçç@Conditionalä½ç¨ï¼
- ä¸ãæ¥å¿
-
- 1ãæ¥å¿æ¡æ¶
- 2ãSLF4jç使ç¨
-
- 1ãå¦ä½å¨ç³»ç»ä¸ä½¿ç¨SLF4j https://www.slf4j.org
- 2ãéçé®é¢
- 3ãSpringBootæ¥å¿å ³ç³»
- 4ãæ¥å¿ä½¿ç¨
-
-
- 1ãé»è®¤é ç½®
- 2ãæå®é ç½®
-
- 5ãåæ¢æ¥å¿æ¡æ¶
- åãWebå¼å
-
- 1ãç®ä»
- 2ãSpringBoot对éæèµæºçæ å°è§å
- 3ã模æ¿å¼æ
-
- 1ãå¼å ¥thymeleaf
- 2ãThymeleaf使ç¨&è¯æ³
- 3ãè¯æ³è§å
- 4ãSpringMVCèªå¨é ç½®
-
- 1ã 27.1.1 Spring MVC Auto-configuration
- 2ãæ©å±SpringMVC
- 3ãå ¨é¢æ¥ç®¡SpringMVCï¼
- 5ãå¦ä½ä¿®æ¹SpringBootçé»è®¤é ç½®
- 6ãRestfulCRUE
-
- 1ï¼ãé»è®¤è®¿é®é¦é¡µ
- 2ï¼ãå½é å
- 3ï¼ãç»å½
- 4ï¼ãæ¦æªå¨è¿è¡ç»å½æ£æ¥
- 5ï¼ãCRUD-åå·¥å表
- äºãSpringBootä¸Docker
-
- 1ãç®ä»
- 2ãæ ¸å¿æ¦å¿µ
- 3ãå®è£ Docker
-
- 1ï¼ãå®è£ linuxèææº
- 2ï¼ãå¨linuxèææºä¸å®è£ Docker
- 3ï¼ãå¨windowsä¸å®è£ docker
- 4ãdockerç常ç¨æä½
-
-
- 1ï¼ãdockeréåæä½
- 2ï¼ãdocker容å¨æä½
- 3ï¼ãå®è£ mysqlçå®ä¾
- 4ï¼ãå®æ¹çéåå é
-
- å ãSpringBootä¸æ°æ®è®¿é®
-
- 1ãJDBC
- 2ãæ´åDruidæ°æ®æº
- 3ãæ´åMybatis
- 4ã注解ç
-
- **å°é®é¢ï¼**
-
- 1ãèªå¢é¿IDï¼éè¿ç»æ¹æ³ä¸æ·»å @Options(useGeneratedKeys = true, keyProperty = "id")å®ç°ï¼æ¤æ¹æ³ä¸å»ºè®®ä½¿ç¨äºé ç½®çmybatis
- 2ãå ³äºé©¼å³°å½åæ³
- 3ãå ³äºé 置类ç@Mapper注解
- 5ãé ç½®çmybatis
- 6ãæ´åJPA
-
- 1ãä»ä¹æ¯JPAï¼
- 2ãæ´åSpringData JPA
- ä¸ãå¯å¨é ç½®åç
-
- 1ãå建SpringApplication对象ï¼new SpringApplication(primarySources)
- 2ãè¿è¡runæ¹æ³
- 3ãäºä»¶çå¬æºå¶
- å «ãSpringBootèªå®ä¹startersï¼åºæ¯å¯å¨å¨ï¼
ä¸ãspring boot å ¥é¨
1ãSpring boot ç®ä»
ç®åspringåºç¨å¼åçä¸ä¸ªæ¡æ¶ï¼
æ´ä¸ªSpringææ¯æ çä¸ä¸ªå¤§æ´åï¼
J2EEå¼åçä¸ç«å¼è§£å³æ¹æ¡ï¼
2ãå¾®æå¡
2014ï¼Martin Fowler
å¾®æå¡ï¼æ¶æé£æ ¼
ä¸ä¸ªåºç¨åºè¯¥æ¯ä¸ç»å°åæå¡ï¼å¯ä»¥éè¿HTTPçæ¹å¼è¿è¡æ²éï¼
æ¯ä¸ä¸ªåè½å ç´ æç»é½æ¯ä¸ä¸ªå¯ç¬ç«æ¿æ¢åç¬ç«å级ç软件åå ï¼
[详ç»åç §å¾®æå¡ææ¡£][https://martinfowler.com/articles/microservices.html]
http://www.gulixueyuan.com/è°·ç²å¦é¢
3ãç¯å¢åå¤
ç¯å¢çº¦æ
-jdk1.8ï¼Spring Boot 1.7å以ä¸ï¼java version â1.8.0_112â
-maven3.xï¼maven 3.3以ä¸çæ¬ï¼Apache Maven 3.3.9
-IntelliJIDEA2017ï¼IntelliJ IDEA 2017.2.2x64ãSTS
-Spring Boot 1.5.9.RELEASEï¼1.5.9ï¼(æ¬æä½è 使ç¨2.0.6çæ¬SpringBoot)
ç»ä¸ç¯å¢ï¼
1ãmaven设置
ç»maven çsettings.xmlé ç½®æ件ä¸çprofilesæ ç¾æ·»å
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.cpmplier.compilerVersion>1.8</maven.cpmplier.compilerVersion>
</properties>
</profile>
2ãIDEA设置
4ãSpring Boot HelloWorld
ä¸ä¸ªåè½
æµè§å¨åéhello请æ±ï¼æå¡å¨æ¥å请æ±å¹¶å¤çï¼ååºhello worldå符串ï¼
1ãå建ä¸ä¸ªmavenå·¥ç¨ï¼ï¼jarï¼
2ãå¯¼å ¥spring boot ç¸å ³çä¾èµ
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3ãç¼åä¸ä¸ªä¸»ç¨åºï¼å¯å¨Spring Boot åºç¨
/**
* @ClassName HelloWorldMainApplication
* @Author Peach
* @SpringBootApplication æ¥æ 注è¿æ¯ä¸ä¸ªspringbootåºç¨
* @Date 2018/09/27 14:52
* @Version 1.0
**/
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
//springåºç¨å¯å¨
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
4ãç¼åç¸å ³çControllerãService
/**
* @ClassName HelloController
* @Author Peach
* @Date 2018/09/27 14:55
* @Version 1.0
**/
@Controller
public class HelloController {
@ResponseBody
@RequestMapping("hello")
public String hello(){
return "Hello world";
}
}
5ãè¿è¡ä¸»ç¨åºæµè¯
6ãç®åé¨ç½²
<!--è¿ä¸ªæ件å¯ä»¥å°é¡¹ç®æå
æä¸ä¸ªjarå
éè¿java -jar xxxxx.jarçæ¹å¼æ¥è¿è¡-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
å°è¿ä¸ªåºç¨ææjarå ï¼ç´æ¥ä½¿ç¨java -jarçå½ä»¤è¿è¡æ§è¡ï¼ä¸è¿ä¸ªjarå èªå¸¦tomcatç¯å¢ï¼ä¸éè¦æå¡å¨æå¨tomcat
æå çæ¹æ³ï¼ç¹å»å³è¾¹maven projects âéæ©ä½ ç项ç®âLifecycleâåå»packageï¼æå å®æåç®æ æ件å¨ä½ çtargetç®å½ä¸
5ãHello Worldæ¢ç©¶
1ãPOMæ件
1ãç¶é¡¹ç®
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
</parent>
ä»çç¶é¡¹ç®æ¯
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.4.2.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
ä»æ¥çæ£ç®¡çSpring bootåºç¨éé¢ææçä¾èµçæ¬ï¼
Spring Boot ççæ¬ä»²è£ä¸å¿ï¼
以åæä»¬å¯¼å ¥ä¾èµé»è®¤æ¯ä¸è®¸éè¦åçæ¬çï¼ï¼æ²¡æå¨dependencieséé¢ç®¡ççä¾èµèªç¶éè¦å£°æçæ¬å·ï¼
2ãå¯å¨å¨
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter - webï¼
â spring-boot-starterï¼spring-bootåºæ¯å¯å¨å¨ï¼å¸®æä»¬å¯¼å ¥äºweb模åæ£å¸¸è¿è¡æ以ä¾èµçç»ä»¶
Spring Bootå°ææçåè½åºæ¯é½æ½ååºæ¥ï¼åæä¸ä¸ªä¸ªçstartersï¼å¯å¨å¨ï¼ï¼æ们éè¦çæ¶ååªéè¦å¨é¡¹ç®ä¸å¼ç¨è¿äºstarterç¸å ³åºæ¯ä¸çææ以æ¥é½ä¼å¯¼å ¥è¿æ¥ãè¦ç¨ä»ä¹åè½å°±åå ¥ä»ä¹åè½çåºæ¯å¯å¨å¨
2ã主ç¨åºç±»ï¼ä¸»å ¥å£ç±»
/**
* @ClassName HelloWorldMainApplication
* @Author Peach
* @SpringBootApplication æ¥æ 注è¿æ¯ä¸ä¸ªspringbootåºç¨
* @Date 2018/09/27 14:52
* @Version 1.0
**/
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
//springåºç¨å¯å¨
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
@SpringBootApplication ï¼Spring Bootåºç¨å¨æ个类ä¸ï¼è¯´æè¿ä¸ªç±»æ¯Spring Bootç主é 置类ï¼Spring Bootå°±åºè¯¥è¿è¡è¿ä¸ªç±»çmainæ¹æ³æ¥å¯å¨Spring Bootåºç¨ï¼
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class))
public @interface SpringBootApplication {
@SpringBootConfigurationï¼Spring bootçé 置类ï¼
â æ 注å¨æ个类ä¸ï¼è¡¨ç¤ºè¿æ¯ä¸ä¸ªspring bootçé 置类ï¼
â @Configurationï¼é 置类ä¸æ¥æ 注è¿ä¸ªæ³¨è§£ï¼
â é 置类âé ç½®æ件ï¼é 置类ä¹æ¯å®¹å¨ä¸çä¸ä¸ªç»ä»¶ï¼@Component
â
@EnableAutoConfiguration ï¼å¼å¯èªå¨é ç½®åè½
â 以åéè¦é ç½®çä¸è¥¿ï¼Spring Boot帮æ们é ç½®ï¼@EnableAutoConfiguration ï¼åè¯spring bootå¼å¯èªå¨é ç½®åè½ï¼è¿æ ·èªå¨é ç½®æè½å¤çæï¼
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
â @AutoConfigurationPackageï¼èªå¨é ç½®å
â @Import(AutoConfigurationPackages.Registrar.class)ï¼
â å±äºspring çåºå±æ³¨è§£ï¼@Importçä½ç¨æ¯ç»spring容å¨ä¸å¯¼å ¥ä¸ä¸ªç»ä»¶ï¼å¯¼å ¥çç»ä»¶ç±AutoConfigurationPackages.Registrar.classå³å®ï¼
â ä»çä½ç¨æ¯å°ä¸»é 置类ï¼@SpringBootApplicationæ 注çè¿ä¸ªç±»ï¼çæå¨å åä¸é¢ææçåå éé¢çææç»ä»¶æ«æå°spring容å¨ï¼
â @Import(EnableAutoConfigurationImportSelector.class)
â ç»å®¹å¨ä¸å¯¼å ¥ç»ä»¶ï¼
â EnableAutoConfigurationImportSelector : å¯¼å ¥åªäºç»ä»¶çéæ©å¨ï¼
â å°ææéè¦å¯¼å ¥çç»ä»¶ä»¥å ¨ç±»åçæ¹å¼è¿åï¼è¿äºç»ä»¶å°±ä¼è¢«æ·»å å°å®¹å¨ä¸ï¼
â ä¼ç»å®¹å¨ä¸åå ¥é常å¤çèªå¨é 置类ï¼xxxAutoConfigurationï¼;å°±æ¯ä¸ªå®¹å¨ä¸å¯¼å ¥è¿ä¸ªåºæ¯ä¸éè¦çææç»ä»¶ï¼å¹¶é 置好è¿äºç»ä»¶ï¼
æäºèªå¨é 置类ï¼å å»äºæ们æå¨ç¼åé ç½®æ³¨å ¥åè½ç»ä»¶ççå·¥ä½ï¼
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader)
==Spring Bootå¨å¯å¨çæ¶åä»ç±»è·¯å¾ä¸çMETA-INF/spring.factoriesä¸è·åEnableAutoConfigurationæå®çå¼ï¼å°è¿äºå¼ä½ä¸ºèªå¨é ç½®ç±»å¯¼å ¥å°å®¹å¨ä¸ï¼èªå¨é 置类就çæäºï¼å¸®æ们è¿è¡èªå¨é 置工ä½ï¼==以åçæ们éè¦èªå·±æå®çä¸è¥¿ï¼èªå¨é 置类é½å¸®æ们åäºï¼è¿äºæ件é½å¨autoconfigureå ä¸çspring.factoriesæ件ä¸
J2EEçæ´ä½æ´å解å³æ¹æ¡åèªå¨é ç½®é½å¨spring-boot-autoconfigure-1.4.2.RELEASE.jar
æ³è¦äºè§£è¿äºæ³¨è§£çåºå±åçé½å¯ä»¥å»Spring注解çï¼è°·ç²å¦é¢ï¼
6ãä½¿ç¨ Spring Initializerå¿«éå建Spring Boot 项ç®
IDEé½æ¯æ使ç¨Springç项ç®å建æ³å°å¿«éå建ä¸ä¸ªSpring Boot项ç®
éæ©æ们éè¦ç模åï¼æ³å°ä¼èç½å建Spring Boot项ç®ï¼
é»è®¤çæçSpring Boot项ç®ï¼
- 主ç¨åºå·²ç»çæ好äºï¼æ们åªéè¦ç¼åèªå·±çä¸å¡é»è¾
- resourcesæ佳家ä¸çç®å½ç»æ
- staticï¼ä¿åææçéæèµæºï¼JS CSS imagesï¼
- templates ï¼ä¿åææç模æ¿é¡µé¢ï¼ï¼Spring Booté»è®¤jarå 使ç¨åµå ¥å¼çTomcatï¼é»è®¤ä¸æ¯æJSP页é¢ï¼ï¼å¯ä»¥ä½¿ç¨æ¨¡æ¿å¼æï¼freemarkerãthymeleafï¼ï¼
- application.propertiesï¼spring bootåºç¨çé ç½®æ件ï¼å¯ä»¥ä¿®æ¹ä¸äºé»è®¤è®¾ç½®
äºãé ç½®æ件
1ãé ç½®æ件
-SpringBoot使ç¨ä¸ä¸ªå ¨å±çé ç½®æ件ï¼é ç½®æ件çååæ¯åºå®ç
- application.properties
- application.yml
é ç½®æ件çä½ç¨ï¼ä¿®æ¹SpringBootèªå¨é ç½®çé»è®¤å¼ï¼Spring Bootå¨åºå±é½ç»æ们èªå¨é 置好äºï¼
YAMLï¼YAML Ainât Markup Languageï¼
â YAML A Markup Languageï¼æ¯ä¸ä¸ªæ è®°è¯è¨
â YAML isnât Markup Language ï¼ä¸æ¯ä¸ä¸ªæ è®°è¯è¨
æ è®°è¯è¨ï¼
â 以åçé ç½®æ件ï¼å¤§å¤é½æ¯ç¨çæ¯ xxxx.xmlæ件;
â YAMLï¼ä»¥æ°æ®ä¸ºä¸å¿ï¼æ¯jsonãxmlæ´éåä½ä¸ºé ç½®æ件ï¼
â YAMLï¼é ç½®å®ä¾
server:
port: 8081
â XMLï¼
<server>
<port>8081</port>
</server>
2ãYAMLè¯æ³ï¼
1ãåºæ¬è¯æ³
k:(ç©ºæ ¼)vï¼è¡¨ç¤ºä¸å¯¹é®å¼å¯¹ï¼ç©ºæ ¼å¿ é¡»æï¼ï¼
ä»¥ç©ºæ ¼ç缩è¿æ¥æ§å¶å±çº§å ³ç³»ï¼ä¸»è¦æ¯å·¦å¯¹é½çä¸åæ°æ®ï¼é½æ¯åä¸å±çº§ç
server:
port: 8081
path: /hello
å±æ§åå¼ä¹æ¯å¤§å°åææç
2ãå¼çåæ³
åé¢éï¼æ®éçå¼ï¼æ°åãå符串ãå¸å°ï¼ï¼
â k: vï¼åé¢ç´æ¥å
â å符串é»è®¤ä¸ç¨å ä¸åå¼å·æè åå¼å·
â â âï¼åå¼å·ï¼ä¸ä¼è½¬ä¹å符串éé¢çç¹æ®å符ï¼ç¹æ®å符ä¼ä½ä¸ºæ¬èº«æ³è¡¨ç¤ºçææ
â nameï¼âzhangsan \n lisiâ è¾åºï¼zhangsan æ¢è¡ lisi
â â âï¼åå¼å· ä¼è½¬ä¹ç¹æ®å符ï¼ç¹æ®å符æç»åªæ¯ä¸ä¸ªæ®éçå符串æ°æ®
â nameï¼âzhangsan \n lisiâ è¾åºï¼zhangsan \n lisi
â
对象ãMapï¼å±æ§åå¼ï¼ï¼é®å¼å¯¹ï¼ï¼
â k: v : å¨ä¸ä¸è¡æ¥å对象åå±æ§çå¼å¾å ³ç³»ï¼æ³¨æ缩è¿
â 对象è¿æ¯k: vçæ¹å¼
friends:
lastName: zhangsan
age: 20
è¡å åæ³ï¼
æ°ç»ï¼ListãSetï¼ï¼
ç¨- å¼è¡¨ç¤ºæ°ç»ä¸çä¸ä¸ªå ç´
pets:
- cat
- dog
- pig
è¡å åæ³
3ãé ç½®æ件å¼æ³¨å ¥
1ãpropertiesé ç½®æ件å¨ideaä¸é»è®¤utf-8å¯è½ä¼ä¹±ç
æå¼fileâsettingsâFile Encodingsé ç½®å¦ä¸
é ç½®æ件
person:
lastName: zhangsan
age: 18
isBoss: true
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhaoliu
dog:
name: wangwang
age: 2
对åºçjavaBean
/*
* @ConfigurationProperties åè¯Spring bootè¿ä¸ªæ件çæç¨å±æ§åé
ç½®æ件ä¸çç¸å
³çé
ç½®è¿è¡ç»å®
* å°é
ç½®æ件ä¸çæ¯ä¸ä¸ªå±æ§çå¼æ å°å°æ们çç»ä»¶å½ä¸
* (prefix = "person") é
ç½®æ件ä¸çåªä¸ªå±æ§è¿è¡ä¸ä¸æ å°
*
* åªæè¿ä¸ªç»ä»¶æ¯å®¹å¨ä¸çç»ä»¶æè½ä½¿ç¨å®¹å¨æä¾ç@ConfigurationPropertiesåè½ï¼æ以éè¦å ä¸@Component注解
* */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private String isBoss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
æ们å¯ä»¥å¨Mavenä¸å¯¼å ¥é ç½®æ件å¤çå¨ï¼ä»¥åç¼åé ç½®æ件就æ==æ示==äº
<!--导å
¥é
ç½®æ件å¤çå¨ï¼é
ç½®æ件è¿è¡ç»å®å°±ä¼ææ示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2ã@Valueè·åå¼å@ConfigurationPropertiesè·åå¼çæ¯è¾
@Component
@ConfigurationProperties(prefix = âpersonâ)
å¯¼å ¥é ç½®æ件使ç¨è¿ä¸ª@ConfigurationProperties(prefix = âpersonâ)å°±è¡äºï¼ä½æ¯ä¸å®è¦å°è¿ä¸ªbeanæ³¨å ¥å°å®¹å¨ä¸ä½¿ç¨@Component
@ConfigurationProperties | @Value | |
---|---|---|
åè½ | æ¹é注æé ç½®æ件ä¸çå±æ§ | ä¸ä¸ªä¸ªæå® |
æ¾æ£ç»å®ï¼æ¾æ£è¯æ³ï¼ | æ¯æï¼lastNameå¯ä»¥åælast-nameï¼ | ä¸æ¯æ |
SpEL | ä¸æ¯æ | æ¯æï¼#{12*2}ï¼ |
JSR303æ°æ®æ ¡éª | æ¯æ | ä¸æ¯æ |
å¤æç±»åå°è£ (MapãList) | æ¯æ | ä¸æ¯æ |
@Valueæ ¼å¼ ï¼ @Value("${å±æ§å ¨å}")
JSR303æ°æ®æ ¡éªï¼ï¼å¨beanä¸ç»å®@Validated表示è¿ä¸ªbeanéè¦æ ¡éªï¼å¨å±æ§ä¸å ä¸ç±»ä¼¼@Emailç注解就å¯ä»¥å°å ¶æ ¡éªï¼ä¸ç¬¦åemailæ ¼å¼åä¼æåºå¼å¸¸ï¼
SpringBoot主é ç½®æ件ymlè¿æ¯propertiesä»ä»¬é½è½è·åå°å¼ï¼
å¦æ说æ们åªæ¯å¨æ个ä¸å¡é»è¾ä¸éè¦è·åä¸ä¸é ç½®æ件ä¸çæ项å¼ï¼æ们就éç¨@Value
å¦æ说ï¼æ们ä¸é¨ç¼åäºä¸ä¸ªjavaBeanæ¥åé ç½®æ件è¿è¡æ å°ï¼
â æ们就ç´æ¥ä½¿ç¨ @ConfigurationPropertiesï¼æ³¨æï¼@ConfigurationProperties注解æ¯ä»å ¨å±é ç½®æ件ï¼application.yml æè application.propertiesï¼ä¸è·åæ°æ®
3ãé ç½®æä»¶æ³¨å ¥æ°æ®æ ¡éªï¼JSR303ï¼
@Validated #æ¤å¤æ·»å 注解åè¯SpringBootè¿æ¯ä¸ä¸ªéè¦æ°æ®æ ¡éªçç±»
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
@Email #æ 注ä¸æ¹ç¬¬ä¸ä¸ªå±æ§æ¯ä¸æ¯ä»¥ä¸ä¸ªEmailçæ ¼å¼ä¼ å
¥åæ°ï¼å¦æä¸æ¯åæ¥é
private String lastName;
private Integer age;
private Boolean isBoss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
4ã@PropertySourceï¼å è½½é ç½®æ件propertiesä¸åªè½å è½½propertiesæä»¶ï¼ & @ImportResourceï¼å è½½springçxmlé ç½®æ件ï¼
@PropertySource ï¼å è½½å¶å®çé ç½®æ件ï¼é¤äºä¸»é ç½®æ件ä¹å¤çé ç½®æ件ï¼
/*
* @ConfigurationProperties åè¯Spring bootè¿ä¸ªæ件çæç¨å±æ§åé
ç½®æ件ä¸çç¸å
³çé
ç½®è¿è¡ç»å®
* å°é
ç½®æ件ä¸çæ¯ä¸ä¸ªå±æ§çå¼æ å°å°æ们çç»ä»¶å½ä¸
* (prefix = "person") é
ç½®æ件ä¸çåªä¸ä¸ªå±æ§è¿è¡ä¸ä¸æ å° æ¯personå¼å¤´çé
ç½®
* @ConfigurationProperties(prefix = "person") åªè½å è½½å
¨å±é
ç½®æ件ä¸çé
ç½®application.yml æè
application.properties
* åªæè¿ä¸ªç»ä»¶æ¯å®¹å¨ä¸çç»ä»¶æè½ä½¿ç¨å®¹å¨æä¾ç@ConfigurationPropertiesåè½ï¼æ以éè¦å ä¸æ³¨è§£
@component
* */
@Component
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean isBoss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
注æï¼@PropertySource(value = {âclasspath:person.propertiesâ}) 注解éè¦å @ConfigurationProperties(prefix = âpersonâ) 注解ä¸èµ·ä½¿ç¨ï¼æè½å¤åå°åæ°ï¼å¹¶ä¸@PropertySourceä¸æ¯æå è½½ymlæ件ï¼[详æ è§å®æ¹ææ¡£][https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-yaml-shortcomings]
@ImportResourceï¼**å¯¼å ¥Springç é ç½®æ件ï¼è®©é ç½®æ件éé¢çå 容çæï¼
Spring Boot 没æSpring çé ç½®æ件ï¼beans.xmlï¼ï¼æ们èªå·±ç¼åçé ç½®æ件ä¹ä¸è½èªå¨è¯å«ï¼
æ³è®©Springçé ç½®æ件çæï¼å è½½è¿æ¥ï¼@ImportResourceæ å¨ä¸ä¸ªé 置类ï¼@Configurationé ç½®çç±» ä½æ¯ä¸è¬æ¯ä¸»é 置类ï¼ä¸ã
@ImportResource(value = {"classpath:beans.xml"})
导å
¥Springçé
ç½®æ件ï¼æ 注beançé
ç½®æ件ï¼è®©å
¶çæ èä¸æ¯SpringBootçé
ç½®æ件
@ImportResourceè¯æ³æ ¼å¼ä¸ºï¼
- @ImportResource({âclasspath:beans.xmlâ})
- @ImportResource(value = {âclasspath:beans.xmlâ})
- @ImportResource(locations = {âclasspath:beans.xmlâ})
ä¸æ¨èç¼åSpringé ç½®æ件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="helloService" class="com.example.springboot.service.HelloService"></bean>
</beans>
SpringBootæ¨èçç»å®¹å¨ä¸çæ·»å ç»ä»¶çæ¹å¼
1ãé 置类ä¹å°±çäºSpringçxmlé ç½®æ件
2ã使ç¨@Beanç»å®¹å¨ä¸æ·»å ç»ä»¶
@Configuration
public class MyAppConfig {
@Bean
public HelloService helloService02(){
System.out.println("é
置类添å ç»ä»¶äº");
return new HelloService();
}
}
@Bean æ¯å°æ³¨è§£ç该æ¹æ³çè¿åå¼ä½ä¸ºé ç½®æ件ä¸çclassï¼è¯¥æ¹æ³çæ¹æ³åä½ä¸ºidæ³¨å ¥å°ioc容å¨ä¸ï¼æ们å¯ä»¥éè¿å¨æµè¯ç±»ä¸èªå¨æ³¨å ¥ApplicationContext ç¨å ¶ä¸çcontainsBean(âbeançidâ) æ¹æ³æ¥å¤æä¸ä¸ªä¸ä¸ªbeanæ¯å¦è¢«æ³¨å ¥äºã
4ãé ç½®æ件å ä½ç¬¦
1ãéæºæ°
random.value {random.int} ${random.long}
random.int(10) {random.int[1024,65536]} {random.uuid}
2ãå ä½ç¬¦è·åä¹åé ç½®çå¼ï¼å¦æ没æåå¯ä»¥ç¨ : æå®é»è®¤å¼
${person.last-name:hello} :è¯æ³è¡¨ç¤ºè·å该æ件ä¸person.last-nameçå¼ï¼å¦æ没æè¿ä¸ªå¼ï¼å°±ç¨ ï¼ åé¢çhelloå¯¹å ¶èµå¼
5ãProfile
1ãå¤Profileæ件
æ们å¨ä¸»é ç½®æ件ç¼åçæ¶åï¼æ件åå¯ä»¥ä½¿applocation-{profile}.properties/yml
é»è®¤ä½¿ç¨application.propertiesçé ç½®
2ãymlæ¯æå¤ææ¡£åæ¹å¼
server:
port: 8081
spring:
profiles:
active: xxxx
#--- 表示ææ¡£åçåé
---
server:
port: 8082
spring:
profiles: test
---
server:
port: 8083
spring:
profiles: hhh
---
server:
port: 8084
spring:
profiles: xxxx #表示å±äºåªä¸ªç¯å¢
3ãæ¿æ´»æå®profile
â 1ãå¨application.propertiesé ç½®æ件ä¸æå®æ¿æ´»æ个ç¯å¢ spring.profiles.active=test
â 2ãå½ä»¤è¡æ¹å¼ï¼
â --spring.profiles.active=dev
â æä½æ¥éª¤å¦ä¸ï¼
â
3ãcmdè¿è¡æ¶åæ¢ï¼å¯ä»¥å¨é¡¹ç®æå æjarå ä¹å使ç¨java -jar çæ¹å¼è¿è¡æ¶åå ¥ --spring.profiles.active=dev
4ãèææºåæ° -Dspring.profiles.active=test
6ãé ç½®æ件å è½½ä½ç½®
SpringBootå¯å¨ä¼æ«æ以ä¸æªç¥çapplication.propertiesæè application.ymlæ件ä½ä¸ºSpringBooté»è®¤é ç½®æ件
-file:./config/ 表示å½å项ç®çæ ¹ç®å½ä¸é¢çconfigæ件夹ä¸çæ件
-file:./ 表示å½åæ件çæ ¹ç®å½
-classpath:/config/ 表示å½å类路å¾ï¼WEB-INFæ件夹ä¸çclassesç®å½ ï¼çconfigæ件夹
-classpath:/ 表示å½å类路å¾çæ ¹ç®å½
ä¼å 级ç±é«å°ä½ï¼é«ä¼å 级çé ç½®ä¼è¦çä½ä¼å 级çé ç½®ï¼
SpringBootä¼ä»è¿å个ä½ç½®å ¨é¨å è½½é ç½®æ件ï¼å½¢æ==äºè¡¥é ç½®==
æ们ä¹å¯ä»¥éè¿spring.config.locationæ¥æ¹åé»è®¤çé ç½®
å¨æ们éè¿java -jar æ¹å¼è¿è¡ä¸ä¸ªé¡¹ç®çæ¶åå¨å ¶åæ¹å å ¥âspring.config.location=é ç½®æ件路å¾çæ¹å¼æ¹åé»è®¤é ç½®ï¼å½ç¶è¿ä¸ªæ¹å¼é ç½®çä¼å 级æ¯æé«ç
java -jar spring-boot-helloworld-quick-0.0.1-SNAPSHOT.jar --spring.config.location=C:\Users\Administrator\Desktop\application.properties
7ãå¤é¨é ç½®å 载顺åº
SpringBootä¹å¯ä»¥ä»ä»¥ä¸ä½ç½®å è½½é ç½®;ä¼å 级ä»é«å°ä½;é«ä¼å 级çé ç½®è¦çä½ä¼å 级çé ç½®,ææçé ç½®ä¼å½¢æäºè¡¥é ç½®
1.å½ä»¤è¡åæ°ï¼éè¿java -jar æ¹å¼æ§è¡çæ¶åå¨å端å ä¸ --server.port=xxxx
â java -jar spring-boot-helloworld-quick-0.0.1-SNAPSHOT.jar --server.port=8088 --server.context-path=/abc
å¤ä¸ªé
ç½®ç¨ç©ºæ ¼åå¼ï¼--é
置项=å¼
2.æ¥èªjava:comp/envçJNDIå±æ§
3.Javaç³»ç»å±æ§ç³»ç»å±æ§(å±æ§(System.getPropertiesties())
4.æä½ç³»ç»ç¯å¢åé
5.RandomValuePropertySourceé ç½®çrandom.*å±æ§å¼
ç±jarå å¤åjarå å è¿è¡å¯»æ¾
ä¼å å 载带profileç
6.jarå å¤é¨çapplication-{profile}.propertiesæapplication.yml带(spring.profile)é ç½®æ件
å å¤é¨ï¼åææçjarå æ¾å¨åä¸ç®å½ä¸
7.Jarå å é¨çapplication-{profile}.propertiesæapplication.yml带(spring.profile)é ç½®æ件
åæ¥å è½½ä¸å¸¦profileç
8.jarå å¤é¨çapplication.propertiesæapplication.yml(ä¸å¸¦spring.profile)é ç½®æ件
å å¤é¨ï¼åææçjarå æ¾å¨åä¸ç®å½ä¸
9.jarå å é¨çapplication.propertiesæapplication.yml(ä¸å¸¦spring.profile)é ç½®æ件
[email protected]注解类ä¸ç@PropertySource
11.éè¿SpringApplication.setDefaultPropertiesæå®çé»è®¤å±æ§
æææ¯æçé ç½®æ¥æºï¼
[åèå®æ¹ææ¡£][https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#boot-features-external-config]
8ãèªå¨é ç½®åç
é ç½®æ件å°åºè½åä»ä¹ï¼æä¹åï¼èªå¨é ç½®çåçï¼
[é ç½®æ件è½é ç½®çå±æ§åç §][https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#common-application-properties]
1ãèªå¨é ç½®åç
1ï¼ãSpringBootå¯å¨çæ¶åå 载主é 置类ï¼å¼å¯äºèªå¨é ç½®åè½ @EnableAutoConfiguration
2ï¼ã@EnableAutoConfigurationçä½ç¨ï¼
- å©ç¨EnableAutoConfigurationImportSelectorï¼èªå¨è£ é éæ©å¨ï¼ç»å®¹å¨ä¸å¯¼å ¥ä¸äºç»ä»¶
- å¯ä»¥æ¥çéæ©å¨çselectImports()æ¹æ³éçå 容ï¼
- List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);è·ååéçé
ç½®
-
SpringFactoriesLoader.loadFactoryNames() æ«æå¾å°èµæº æ«æææjarå è·¯å¾ä¸ META-INF/spring.factories æ件 å°æææ«æå°çæ件çå 容å è£ æä¸ä¸ªproperties对象 ä»propertiesä¸è·åå°EnableAutoConfiguration.calssç±»ï¼ç±»åï¼å¯¹åºçå¼ï¼ç¶åæä»ä»¬æ·»å å¨å®¹å¨ä¸
-
å°ç±»è·¯å¾ä¸ META-INF/spring.factories éé¢é ç½®çææçEnableAutoConfigurationçå¼å å ¥å°å®¹å¨ä¸ï¼
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\
org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\
org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\
org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
æ¯ä¸ä¸ªxxxxAutoConfigurationç±»é½æ¯å®¹å¨ä¸çä¸ä¸ªç»ä»¶ï¼é½å å ¥å°å®¹å¨ä¸ï¼ç¨ä»ä»¬æ¥åèªå¨é ç½®
3ï¼ãæ¯ä¸ä¸ªèªå¨é 置类å¼å§èªå¨é 置工ä½
4ï¼ã以**HttpEncodingAutoConfigurationï¼HTTPç¼ç çèªå¨é ç½®ï¼**为ä¾è§£éèªå¨é ç½®åçï¼
@Configuration //表示è¿æ¯ä¸ä¸ªé
置类ï¼å以ååçé
ç½®æ件ä¸æ ·ï¼ä¹å¯ä»¥ç»å®¹å¨ä¸æ·»å ç»ä»¶
@EnableConfigurationProperties({HttpEncodingProperties.class}) //å¯å¨æå®ç±»çConfigurationPropertiesåè½ï¼å°é
ç½®æ件ä¸å¯¹åºçå¼ååæ°ä¸çHttpEncodingPropertiesç»å®èµ·æ¥äºï¼å¹¶æHttpEncodingPropertieså å
¥å°ioc容å¨ä¸
@ConditionalOnWebApplication //Springåºå±@Conditional注解ï¼Spring注解çæ详ç»åçï¼ï¼æ ¹æ®ä¸åçæ¡ä»¶ï¼å¦æ满足æå®çæ¡ä»¶ï¼åæ¤è¡¨è¾¾å¼çè¿åç»æ为trueï¼ï¼æ´ä¸ªé
置类éé¢çé
ç½®æä¼çæï¼ å¤æå½ååºç¨æ¯ä¸æ¯webåºç¨ï¼å¦ææ¯ï¼å½åé
置类çæï¼å¦æä¸æ¯åä¸çæ
@ConditionalOnClass({CharacterEncodingFilter.class}) //å¤æå½å项ç®æ没ææ´ä¸ªCharacterEncodingFilterç±»ï¼ä¹å°±æ¯SprinMVCä¸è¿è¡ä¹±ç 解å³çè¿æ»¤å¨ï¼
@ConditionalOnProperty(
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true
) //å¤æé
ç½®æ件ä¸æ¯å¦åå¨æ个é
ç½®spring.http.encoding.enabled;å¦æä¸åå¨ï¼å¤æä¹æ¯æç«çï¼å¦æåå¨å使ç¨è¿ä¸ªé
ç½®ä¸çå¼
//å³ä½¿æ们é
ç½®æ件ä¸ä¸é
ç½®spring.http.encoding.enabled=trueï¼ä¹æ¯é»è®¤çæçï¼
public class HttpEncodingAutoConfiguration {
//ä»å·²ç»åSpringBootçé
ç½®æ件æ å°äº
private final HttpEncodingProperties properties;
//并ä¸ä»åªæä¸ä¸ªæåæé å¨ï¼å¨è¿æ ·çæ
åµä¸ä»å°±ä¼ä»ioc容å¨ä¸æ¿HttpEncodingPropertiesï¼è¿ä¸ªå¼ä»ä¸æ¹ç@EnableConfigurationProperties({HttpEncodingProperties.class})注解ä¸æ¥
public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
this.properties = properties;
}
@Bean //ç»å®¹å¨ä¸æ·»å ä¸ä¸ªç»ä»¶ï¼è¿ä¸ªç»ä»¶çæäºå¼ï¼éè¦ä»propertiesä¸è·å
@ConditionalOnMissingBean({CharacterEncodingFilter.class}) //æ£æ¥å®¹å¨ä¸æ¯å¦åå¨CharacterEncodingFilterè¿ä¸ªç±»ç©¿ä»¶çbeanï¼å¦æå·²ç»åå¨ï¼é£ä¹å°±ä¸å è½½è¿ä¸ªbean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}
æ ¹æ®å½åä¸åçæ¡ä»¶å¤æãå³å®è¿ä¸ªé 置类æ¯å¦çæï¼
ä¸æ¦è¿ä¸ªé 置类çæï¼è¿ä¸ªé 置类就ä¼ç»å®¹å¨ä¸æ·»å ç»ä»¶ï¼è¿äºç»ä»¶çå±æ§æ¯ä»å¯¹åºçpropertiesç±»ï¼ä¹å°±æ¯xxxxPropertiesï¼ä¸è·åçï¼èè¿äºç±»éé¢çå±æ§çæ¯ä¸ä¸ªå±æ§åæ¯åé ç½®æ件ç»å®ç
5ï¼ãææå¨é ç½®æ件ä¸è½é ç½®çå±æ§é½æ¯å¨xxxxPropertiesç±»ä¸å°è£ çï¼é ç½®æ件è½é ç½®ä»ä¹å°±å¯åç §æ个åè½è½å¯¹åºçè¿ä¸ªå±æ§ç±»ï¼
@ConfigurationProperties( //ä»é
ç½®æ件ä¸è·åæå®çå¼ï¼è¿éæ¯åç¼ä¸ºspring.http.encodingçæ件ï¼åbeanè¿è¡ç»å®
prefix = "spring.http.encoding"
)
public class HttpEncodingProperties {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
ç²¾é«ï¼
â 1ï¼ãSpringBootå¯å¨åä¼å 载大éçèªå¨é 置类
â 2ï¼ãæ们çæ们éè¦çåè½æ没æSpringBooté»è®¤å好çèªå¨é 置类ï¼
â 3ï¼ãæ们åæ¥çè¿ä¸ªèªå¨é 置类ä¸å°åºé ç½®äºåªäºç»ä»¶ï¼ï¼åªè¦ææ们éè¦çç»ä»¶æ们就ä¸éè¦åæ¥é ç½®äºï¼
â 4ï¼ãç»å®¹å¨ä¸èªå¨é 置类添å ç»ä»¶çæ¶åï¼ä¼ä»propertiesç±»ä¸è·åæäºå±æ§ãæ们就å¯ä»¥å¨é ç½®æ件ä¸æå®è¿äºå±æ§çå¼ã
2ãç»è
1ã@Conditionalæ´¾ç注解ï¼Spring注解çåçç@Conditionalä½ç¨ï¼
ä½ç¨ï¼å¿ é¡»æ¯@Conditionalæå®ç**æ¡ä»¶æç«ï¼å³å¤æç»æ为trueï¼**ï¼æç»å®¹å¨ä¸æ·»å ç»ä»¶ï¼é 置类éé¢ææçå 容æä¼çæï¼
@Conditionalæ©å±æ³¨è§£ | ä½ç¨ |
---|---|
@ConditionalOnJava | ç³»ç»çjavaçæ¬æ¯å¦ç¬¦åè¦æ± |
@ConditionalOnBean | 容å¨ä¸åå¨æå®Bean |
@ConditionalOnMissingBean | 容å¨ä¸ä¸åå¨æå®Bean |
@ConditionalOnExpression | 满足SpEL表达å¼æå® |
@ConditionalOnClass | ç³»ç»ä¸ææå®çç±» |
@ConditionalOnMissingClass | ç³»ç»ä¸æ²¡ææå®ç±» |
@ConditionalOnSingleCandidate | ç³»ç»ä¸åªæä¸ä¸ªæå®çBeanï¼æè è¿ä¸ªBeanæ¯é¦éBean |
@ConditionalOnProperty | ç³»ç»ä¸æå®çå±æ§æ¯å¦ææå®çå¼ |
@ConditionalOnResource | 类路å¾ä¸æ¯å¦åå¨èµæºæ件 |
@ConditionalOnWebApplication | å½åæ¯ä¸æ¯webç¯å¢ |
@ConditionalOnNotWebApplication | å½åä¸æ¯webç¯å¢ |
@ConditionalOnJndi | JNDIåå¨æå®é¡¹ |
èªå¨é ç½®ç±»å¿ é¡»å¨ä¸å®çæ¡ä»¶ä¸æä¼çæ
æ们æä¹ç¥éæä¹ç¥éåªäºèªå¨é 置类çæäº
æ们å¯ä»¥å¨**å ¨å±é ç½®æ件ä¸å¡«ådebug = trueå±æ§**æ¥è®©æ§å¶å°æå°èªå¨é ç½®æ¥åï¼è¿æ ·æ们å¯ä»¥å¾æ¹ä¾¿çç¥éåªäºèªå¨é ç½®çæäº
============================
CONDITIONS EVALUATION REPORT
============================
Positive matches:(èªå¨é
置类å¯ç¨ç)
-----------------
CodecsAutoConfiguration matched:
- @ConditionalOnClass found required class 'org.springframework.http.codec.CodecConfigurer'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
Negative matches:ï¼èªå¨é
置类没æå¯ç¨çï¼æ²¡æå¹é
æåçèªå¨é
置类ï¼
-----------------
ActiveMQAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)
ä¸ãæ¥å¿
1ãæ¥å¿æ¡æ¶
å¸é¢ä¸çæ¥å¿æ¡æ¶ï¼
JULãJCLãJboss-loggingãlogbackãlog4jãlog4j2ãslf4jããã
æ¥å¿é¨é¢ï¼æ¥å¿çæ½è±¡å±ï¼ | æ¥å¿çå®ç° |
---|---|
JCL( Jakarta Commons Logging) SLF4j ( Simple Logging Facade for java) jboss-logging | Log4j JUL( java.util.logging) Log4j2 Logback |
左边éæ©ä¸ä¸ªé¨é¢ï¼æ½è±¡å±ï¼ãå³è¾¹éæ©ä¸ä¸ªå®ç°ï¼
左边çé¨é¢ï¼SLF4jï¼
å³è¾¹çå®ç°ï¼Logbackï¼
SpringBoot åºå±ä½¿ç¨çæ¯Springæ¡æ¶ï¼Spring æ¡æ¶é»è®¤ä½¿ç¨çæ¯JCL ï¼
â SpringBootéç¨SLF4jåLogbackï¼
2ãSLF4jç使ç¨
1ãå¦ä½å¨ç³»ç»ä¸ä½¿ç¨SLF4j https://www.slf4j.org
以åå¼åçæ¶åï¼æ¥å¿è®°å½çè°ç¨æ¹æ³ï¼ä¸åºè¯¥æ¥ç´æ¥è°ç¨æ¥å¿çå®ç°ç±»ãèæ¯è°ç¨æ¥å¿çæ½è±¡å±éçæ¹æ³ï¼
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
å¾ç¤ºï¼
æ¯ä¸ä¸ªæ¥å¿çå®ç°æ¡æ¶é½æèªå·±çé ç½®æ件ã使ç¨slf4jä¹åï¼é ç½®æ件è¿æ¯è¦åææ¥å¿å®ç°æ¡æ¶èªå·±æ¬èº«çé ç½®æ件ï¼
2ãéçé®é¢
aï¼slf4j+logbackï¼ï¼springï¼commons-loggingï¼ãHibernateï¼Jboss-loggingï¼ãMybatisãxxx
ç»ä¸æ¥å¿è®°å½ï¼åæ¶æ¯å«çæ¡æ¶åæä¸èµ·ç»ä¸ä½¿ç¨slf4jè¿è¡è¾åºï¼
å¦ä½è®©ç³»ç»ä¸çæææ¥å¿é½ç»ä¸å°slf4j
1ã移é¤ç³»ç»ä¸åæçæ¥å¿å®ç°ç±»
2ãå¯¼å ¥ä¸é´å æ¿æ¢æåæ¥çå
3ãè°ç¨å ¶ä»çslf4jçå®ç°æ¡æ¶
3ãSpringBootæ¥å¿å ³ç³»
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.0.5.RELEASE</version>
<scope>compile</scope>
</dependency>
SpringBoot使ç¨å®æ¥åæ¥å¿åè½
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.0.5.RELEASE</version>
<scope>compile</scope>
</dependency>
SpringBootåºå±ä¾èµå ³ç³»
æ»ç»ï¼
â 1ï¼ãSpringBootåºå±ä¹æ¯ä½¿ç¨sjf4j + logbackçæ¹å¼è¿è¡æ¥å¿è®°å½
â 2ï¼ãSpringBootä¹æå ¶ä»çæ¥å¿æ¿æ¢æäºslf4jï¼
â 3ï¼ãä¸é´æ¿æ¢å ï¼
public class SLF4JBridgeHandler extends Handler {
private static final String FQCN = Logger.class.getName();
private static final String UNKNOWN_LOGGER_NAME = "unknown.jul.logger";
private static final int TRACE_LEVEL_THRESHOLD;
private static final int DEBUG_LEVEL_THRESHOLD;
private static final int INFO_LEVEL_THRESHOLD;
private static final int WARN_LEVEL_THRESHOLD;
public static void install() {
LogManager.getLogManager().getLogger("").addHandler(new SLF4JBridgeHandler());
}
4ï¼ãå¦ææ们è¦å¼å ¥å ¶ä»æ¡æ¶ï¼ä¸å®è¦æè¿ä¸ªæ¡æ¶çé»è®¤æ¥å¿é ç½®çjarå 移é¤æ
â Springæ¡æ¶ä½¿ç¨çæ¯jclï¼commons loggingï¼ï¼SpringBootå¨éæçæ¶åä¹å°å ¶ç§»é¤äº
SpringBootè½èªå¨éé ææçæ¥å¿ï¼èä¸åºå±éæ©ä½¿ç¨slf4j+logbackçæ¹å¼è®°å½æ¥å¿ï¼æ们éè¦åçæ¯å¨å¼å ¥å ¶ä»æ¡æ¶çæ¶åï¼æè¿ä¸ªæ¡æ¶ä¾èµçæ¥å¿æ¡æ¶æé¤æï¼
4ãæ¥å¿ä½¿ç¨
1ãé»è®¤é ç½®
SpringBooté»è®¤å¸®æ们é 置好äºæ¥å¿ï¼
//å®ä¾åè®°å½å¨
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
//æ¥å¿çº§å«
//ç±ä½å°é« trace<debug<info<warn<error
//å¯ä»¥è°æ´éè¦è¾åºçæ¥å¿çº§å«ï¼æ¥å¿åªä¼å¨è¿ä¸ªçº§å«å以ä¸çé«çº§å«çæ.å¦æ没æ设置å使ç¨é»è®¤çº§å«çæ¥å¿ï¼ä¹å«root级å«ï¼
logger.trace("this is trace");
logger.debug("this is debug");
//SpringBooté»è®¤è°æ´çæ¯info级å«çæ¥å¿
logger.info("this is info");
logger.warn("this is warn");
logger.error("this is error");
æ¥å¿è¾åºæ ¼å¼
<!--
æ¥å¿è¾åºæ ¼å¼ï¼
%d表示æ¥ææ¶é´ï¼
%thread表示线ç¨åï¼
%-5levelï¼çº§å«ä»å·¦æ¾ç¤º5个å符宽度
%logger{50}: 表示loggerååæé¿50个å符ï¼å¦åæç
§å¥ç¹åå²
%msgï¼æ¥å¿æ¶æ¯
%n æ¯æ¢è¡ç¬¦
-->
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
SpringBootä¿®æ¹æ¥å¿çé»è®¤é ç½®
logging.level.com.example=trace
#ä¸æå®è·¯å¾åå¨å½å项ç®ä¸çæSpringBoot.logæ¥å¿
#æ们å¯ä»¥æå®å®æ´çè·¯å¾ï¼åä¼å¨æ们æå®çè·¯å¾ä¸çææ¥å¿æ件
#logging.file=SpringBoot.log
#å¨å½åç£çï¼ä¹å°±æ¯å½å项ç®æå¨çç£çï¼çæ ¹ç®å½ä¸å建springæ件夹ålogæ件夹ï¼ä½¿ç¨spring.logä½ä¸ºé»è®¤çé
ç½®æ件
logging.path=/spring/log
#å¨æ§å¶å°è¾åºçæ¥å¿çæ ¼å¼
logging.pattern.console=%d{yyyy-MM-dd}===[%thread]===%-5level===%logger{50}===%m%n
#æå®æ件ä¸æ¥å¿è¾åºçæ ¼å¼
#logging.pattern.file=%d{yyyy-MM-dd}===[%thread]===%-5level===%logger{50}===%m%n
logging.file | logging.path | Example | Description |
---|---|---|---|
ï¼noneï¼ | ï¼noneï¼ | åªå¨æ§å¶å°è¾åº | |
æå®æ件å | ï¼noneï¼ | my.log | è¾åºå°æ¥å¿æ件my.log |
ï¼noneï¼ | æå®ç®å½ | /var/log | è¾åºå°æå®ç®å½çspring.logæä»¶ä¸ |
2ãæå®é ç½®
ç»ç±»è·¯å¾ä¸æ¾ä¸æ¯ä¸ªæ¥å¿æ¡æ¶çé ç½®æ件å³å¯ï¼SpringBootå°±ä¸ä½¿ç¨ä»çé»è®¤é ç½®æ件
æ ¹æ®ä¸åçæ¥å¿ç³»ç»ï¼ä½ å¯ä»¥æå¦ä¸è§åç»ç»é ç½®æ件åï¼å°±è½è¢«æ£ç¡®å è½½ï¼
- Logbackï¼
logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
- Log4jï¼
log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
- Log4j2ï¼
log4j2-spring.xml, log4j2.xml
- JDK (Java Util Logging)ï¼
--------------------- æ¬ææ¥èª Inke çCSDN å客 ï¼å ¨æå°å请ç¹å»ï¼https://blog.csdn.net/inke88/article/details/75007649?utm_source=copylogging.properties
logback.xmlï¼ç´æ¥å°±è¢«æ¥å¿æ¡æ¶è¯å«å°äºæ件ï¼æ æ³ç±SpringBootæ¾å ¥æ´å¥½çåè½â表示æ¥å¿æ¡æ¶æ¯å¨SpringBootæ¥å¿å è½½ä¹å被å è½½ç
logback-spring.xmlï¼æ¥å¿æ¡æ¶æ æ³è¯å«ï¼ä¸å è½½é 置项ï¼ç±SpringBootå è½½ï¼å¯ä»¥ä½¿ç¨SpringBootçspringProfileè¿è¡ç¯å¢é ç½®
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
å¯ä»¥æå®å¨æ个ç¯å¢ä¸çæ
</springProfile>
å¦æ使ç¨logback.xmlä½ä¸ºæ¥å¿é ç½®æ件ï¼ç¶åè¿è¦ä½¿ç¨profileåè½ï¼å°±ä¼æ以ä¸æ¥é
5ãåæ¢æ¥å¿æ¡æ¶
å¯ä»¥æç §slf4jçæ¥å¿éé å¾ï¼è¿è¡ç¸å ³çåæ¢ï¼
slf4j + log4jçæ¹å¼ï¼
åæ¢ä¸ºlog4j2
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
åãWebå¼å
1ãç®ä»
使ç¨SpringBootï¼**
1ï¼ãå建ä¸ä¸ªSpringBootåºç¨ï¼éä¸æ们éè¦ç模åï¼
2ï¼ãSpringBootå·²ç»å¸®æ们å°è¿äºåºæ¯èªå¨é 置好äºï¼åªéè¦å¨é ç½®æ件ä¸æå®å°éé ç½®å³å¯è¿è¡èµ·æ¥
3ï¼ãç¼åä¸å¡ä»£ç
èªå¨é ç½®åçï¼
è¿ä¸ªåºæ¯SpringBoot帮æ们é ç½®äºä»ä¹ï¼è½ä¸è½ä¿®æ¹ï¼è½ä¿®æ¹åªäºé ç½®ï¼è½ä¸è½æ©å±ï¼xxx
xxxAutoConfigurationï¼å¸®æ们èªå¨é
ç½®ç»ä»¶
xxxPropertiesé
置类æ¥å°è£
é
ç½®æ件çå
容ï¼
2ãSpringBoot对éæèµæºçæ å°è§å
@ConfigurationProperties(
prefix = "spring.resources",
ignoreUnknownFields = false
)
public class ResourceProperties {
//å¯ä»¥è®¾ç½®åéæèµæºæå
³çåæ° æ¯å¦ç¼åæ¶é´ç
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
} else {
Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
if (!registry.hasMappingForPattern("/webjars/**")) {
this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) {
this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
}
}
//é
ç½®é¦é¡µï¼æ¬¢è¿é¡µï¼çæ å°
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext) {
return new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, this.getWelcomePage(), this.mvcProperties.getStaticPathPattern());
}
//é
ç½®å欢çå¾æ
@Configuration
@ConditionalOnProperty(
value = {"spring.mvc.favicon.enabled"},
matchIfMissing = true
)
public static class FaviconConfiguration implements ResourceLoaderAware {
private final ResourceProperties resourceProperties;
private ResourceLoader resourceLoader;
public FaviconConfiguration(ResourceProperties resourceProperties) {
this.resourceProperties = resourceProperties;
}
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
@Bean
public SimpleUrlHandlerMapping faviconHandlerMapping() {
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
mapping.setOrder(-2147483647);
mapping.setUrlMap(Collections.singletonMap("**/favicon.ico", this.faviconRequestHandler()));
return mapping;
}
@Bean
public ResourceHttpRequestHandler faviconRequestHandler() {
ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler();
requestHandler.setLocations(this.resolveFaviconLocations());
return requestHandler;
}
private List<Resource> resolveFaviconLocations() {
String[] staticLocations = WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter.getResourceLocations(this.resourceProperties.getStaticLocations());
List<Resource> locations = new ArrayList(staticLocations.length + 1);
Stream var10000 = Arrays.stream(staticLocations);
ResourceLoader var10001 = this.resourceLoader;
this.resourceLoader.getClass();
var10000.map(var10001::getResource).forEach(locations::add);
locations.add(new ClassPathResource("/"));
return Collections.unmodifiableList(locations);
}
}
1ï¼ãææ/webjars/**ï¼é½å»classpath:/META-INF/resources/webjars/æ¾èµæº
â webjarsï¼ä»¥jarå çæ¹å¼å¼å ¥éæèµæº [WebJars][https://www.webjars.org/]
æ们åéå°éæè¯·æ± localhost:8080/webjars/jquery/3.3.1-1/jquery.js
<!--å¼å
¥jquery-webjars-->å¨éæ访é®çæ¶ååªéè¦åä¸webjarsä¸é¢çèµæºå称å³å¯
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.3.1-1</version>
</dependency>
2ï¼ã"/**"访é®å½å项ç®çä»»æèµæº ï¼ï¼éæèµæºæ件夹ï¼
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
"/" ï¼å½å项ç®çæ ¹è·¯å¾
localhost:8080/abc === å»éæèµæºæ件夹éé¢æ¾abc
3ï¼ã欢è¿é¡µï¼éæèµæºæ件夹ä¸é¢ææçâindex.htmlâ页é¢ï¼è¢«"favicon.icoé½æ¯æ¾å¨éææ件夹ä¸ç
5ï¼ãå¦ææ³æ¹åéææ件夹çè·¯å¾éè¦å¨application.propertiesä¸é ç½®åç¼æ¯spring.resources
@ConfigurationProperties(
prefix = "spring.resources",
ignoreUnknownFields = false
)
public class ResourceProperties {
é ç½®æ件ä¸æ ¼å¼
spring.resources.static-locations=classpath:/hello/,classpath:/test/ #å¤ä¸ªæ件夹使ç¨éå·åé
3ã模æ¿å¼æ
JSPãVelocityãFreemarkerãThymeleafï¼
SpringBootæ¨èçThymeleaf
è¯æ³æ´ç®åï¼åè½æ´å¼ºå¤§ï¼
1ãå¼å ¥thymeleaf
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
éè¿ä»¥ä¸æ¹å¼åæ¢thymeleafçæ¬
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.1.1</thymeleaf-layout-dialect.version>
<!--å¸å±åè½ä¸ä¸»ç¨åºå¯¹åºå
³ç³»æ¯ 主ç¨åºthymeleaf2åå¸å±åè½1å¹é
主ç¨åºthymeleaf 3.0以ä¸å¯¹åºå¸å±åè½ç 2.0以ä¸çæ¬-->
2ãThymeleaf使ç¨&è¯æ³
@ConfigurationProperties(
prefix = "spring.thymeleaf"
)
public class ThymeleafProperties {
private static final Charset DEFAULT_ENCODING;
public static final String DEFAULT_PREFIX = "classpath:/templates/";
public static final String DEFAULT_SUFFIX = ".html";
//
private boolean checkTemplate = true;
private boolean checkTemplateLocation = true;
private String prefix = "classpath:/templates/";
private String suffix = ".html";
private String mode = "HTML";
åªè¦æ们æhtml页é¢æ¾å¨"classpath:/templates/"éé¢ï¼æ们çthymeleafå°±è½å¸®æ们èªå¨æ¸²æ
使ç¨ï¼
â 1ãå¯¼å ¥ thymeleaf çå称空é´ï¼è¿ä¸ªå称空é´åªæ¯ä½ä¸ºè¯æ³æ示åè½å¦æä¸å¯¼å ¥ä¾ç¶å¯ä»¥è¿è¡ç¨åºç¼å
â 2ã使ç¨thymeleafçè¯æ³
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<hr>
<h1>æå</h1>
<div th:text="${message}+${test}"></div>
<div th:text="${test}"></div>
</body>
</html>
3ãè¯æ³è§å
1ï¼ãth:text æ¹åå ç´ éé¢çææ¬å 容ï¼
â thï¼ä»»æhtmlå±æ§ï¼ä»»æå±æ§å¯ä»¥æ¿æ¢åæ¥çå±æ§å¼ ä¾å¦ï¼th:id å¯ä»¥è¦çåå divçidå±æ§
2ï¼ã表达å¼ï¼
Simple expressions:(表达å¼è¯æ³)
Variable Expressions: ${...}
1ï¼ãè·å对象çå±æ§ãè°ç¨æ¹æ³
2ï¼ã使ç¨å
ç½®åºæ¬å¯¹è±¡ åæ³ï¼"${#locale.country}"
#ctx : the context object.
#vars: the context variables.
#locale : the context locale.
#request : (only in Web Contexts) the HttpServletRequest object.
#response : (only in Web Contexts) the HttpServletResponse object.
#session : (only in Web Contexts) the HttpSession object.
#servletContext : (only in Web Contexts) the ServletContext object.
${param.foo} // ä»è¯·æ±åæ°ä¸ä¸è·åfooå±æ§çå¼
è½å¤è·åçå
ç½®åºæ¬å¯¹è±¡
3ï¼ãå
置工å
·å¯¹è±¡
#execInfo : information about the template being processed.
#messages : methods for obtaining externalized messages inside variables expressions, in the same way as they would be obtained using
#{â¦} syntax.
#uris : methods for escaping parts of URLs/URIs Page 20 of 106
#conversions : methods for executing the configured conversion service (if any).
#dates : methods for java.util.Date objects: formatting, component extraction, etc.
#calendars : analogous to #dates , but for java.util.Calendar objects.
#numbers : methods for formatting numeric objects.
#strings : methods for String objects: contains, startsWith, prepending/appending, etc.
#objects : methods for objects in general.
#bools : methods for boolean evaluation.
#arrays : methods for arrays.
#lists : methods for lists.
#sets : methods for sets.
#maps : methods for maps.
#aggregates : methods for creating aggregates on arrays or collections.
#ids : methods for dealing with id attributes that might be repeated (for example, as a result of an iteration).
Selection Variable Expressions: *{...}è·ååéå¼ï¼
è¡¥å
åè½ï¼é
å th:object="${session.user}" 使ç¨ï¼åå¯ä»¥å¨ä¸æ¹éè¿
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="*{lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>
éè¿ä»¥ä¸æ¹å¼è·åå°è¿ä¸ªå¯¹è±¡éé¢çæ¯ä¸ä¸ªå±æ§çå¼
Message Expressions: #{...} //ç¨äºè·åå½é
åå
容ç
Link URL Expressions: @{...} //ç¨äºå®ä¹urlé¾æ¥ç
@{/order/process(execId=${execId},execType='FAST')}
Fragment Expressions: ~{...} //ç段å¼ç¨
<div th:insert="~{commons :: main}">...</div>
Literals ï¼åé¢éï¼
Text literals: 'one text' , 'Another one!' ,â¦
Number literals: 0 , 34 , 3.0 , 12.3 ,â¦
Boolean literals: true , false
Null literal: null
Literal tokens: one , sometext , main ,â¦
Text operations: ï¼ææ¬æä½ï¼
String concatenation: +
Literal substitutions: |The name is ${name}|
Arithmetic operations:ï¼æ°å¦è¿ç®ï¼
Binary operators: + , - , * , / , %
Minus sign (unary operator): -
Boolean operations:ï¼å¸å°è¿ç®ï¼
Binary operators: and , or
Boolean negation (unary operator): ! , not
Comparisons and equality:ï¼æ¯è¾è¿ç®ï¼
Comparators: > , < , >= , <= ( gt , lt , ge , le )
Equality operators: == , != ( eq , ne )
Conditional operators:ï¼æ¡ä»¶è¿ç®ï¼ï¼æ¯æä¸ç®è¿ç®ï¼
If-then: (if) ? (then)
If-then-else: (if) ? (then) : (else)
Default: (value) ?: (defaultvalue)
Special tokens: ï¼ç¹æ®æä½ï¼ä¸æ§è¡ä»»ä½æä½ï¼
No-Operation: _
å½æ们éè¦éåçæ¶åï¼å¯ä»¥éè¿th:eachçæ¹å¼è¿è¡éååè代ç å¦ä¸ï¼
<tr th:each="prod : ${prods}">
<td th:text="${prod.name}">Onions</td>
<td th:text="${prod.price}">2.41</td>
<td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
</tr>
==注æï¼==å½æ们æthï¼eachåå¨ä¸ä¸ªæ ç¾ä¸æ¶ï¼è¿ä¸ªæ ç¾ä¼å¨æ¯æ¬¡éåçæ¶åé½çæä¸æ¬¡ï¼ä¸é¢ä¾åä¸ç æ ç¾ä¼åå¤çæï¼æ¯éåä¸æ¬¡åä¼çæä¸ä¸ª
æ们è¿å¯ä»¥ä½¿ç¨è¡å åæ³ï¼ç´æ¥ä½¿ç¨${ }çæ¹å¼ååºåå°è¿åçå¼ï¼ä½æ¯éè¦æç §ä¸å®çåæ³æè½å®ç°ã
<p>The message is "[(${msg})]"</p>
<p>The message is "[[${msg}]]"</p>
è¿ä¸¤ç§åæ³çåºå«å¨äºï¼[ [ ] ] çä»·äº th:text [ ( ) ]çä»·äºth:utext ä¸ç§ä¼è½¬ä¹
å¦ä¸ç§ä¸ä¼
转ä¹ï¼å°è¯¥å符以æ¬èº«çå符形å¼æ¾ç¤ºï¼ä¾å¦
å°±ç´æ¥è¢«æ¾ç¤ºæ
ä¸è½¬ä¹ï¼å°è¯¥å符æ表达çæ ¼å¼æ¾ç¤ºåºæ¥ï¼ä¾å¦
å°±ç´æ¥è¢«æ¾ç¤ºæä¸çº§æ é¢çæ ·å¼ã
4ãSpringMVCèªå¨é ç½®
[å®æ¹ææ¡£SpringMVCèªå¨é ç½®][https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#boot-features-developing-web-applications]
1ã 27.1.1 Spring MVC Auto-configuration
Spring Boot èªå¨é 置好äºspringMVC
The auto-configuration adds the following features on top of Springâs defaults:
- Inclusion of
andContentNegotiatingViewResolver
beans.BeanNameViewResolver
- èªå¨é ç½®äºViewResolverï¼è§å¾è§£æå¨ï¼æ ¹æ®æ¹æ³çè¿åå¼å¾å°è§å¾å¯¹è±¡ï¼Viewï¼ï¼è§å¾å³å®å¦ä½æ¸²æï¼è½¬åæè æ¯éå®åè¿æ¯å¦ä½ï¼ï¼
- ContentNegotiatingViewResolverï¼ç»åææçè§å¾è§£æå¨ï¼
- éè¦å®å¶ï¼å¦ä½å®å¶ï¼èªå¨å°å®¹å¨ä¸çè§å¾è§£æå¨ç»åè¿æ¥ï¼æ们åªéè¦å°èªå·±ç¼åçè§å¾è§£æå¨éè¿ï¼@Beanæè @Component注解å°ä»ä»¬èªå¨è£ é å°å®¹å¨ä¸ï¼
- Support for serving static resources, including support for WebJars (covered later in this document)).éæèµæºæ件夹路å¾ï¼webjars
- èªå¨æ³¨åäº
,Converter
, andGenericConverter
beans.Formatter
- Converterï¼è½¬æ¢å¨ï¼ ç±»å转æ¢ï¼ä¹å°±æ¯è¯´ä»é¡µé¢ä¼ éå°åå°çå¼é½æ¯Stringç±»åçï¼éè¦å°ä»ä»¬è½¬æ¢æç¸åºçå ¶ä»ç±»åï¼å¦trueåfalse转æ¢æbooleanç±»åï¼18 19æ°å转æ¢æIntegerç±»å
- Formatterï¼æ ¼å¼åå¨ï¼æ ¼å¼å页é¢æ°æ®ï¼2017-12-17 === Dateï¼
- èªå·±æ·»å çæ ¼å¼åå¨è½¬æ¢å¨ï¼æ们åªéè¦æ¾å¨å®¹å¨ä¸å³å¯
- Support for
(covered later in this document).HttpMessageConverters
- HttpMessageConvertersï¼æ¶æ¯è½¬æ¢å¨SpringMVCç¨æ¥è½¬æ¢http请æ±åååºçï¼UserâJson
- MessageConvertersï¼æ¯ä»å®¹å¨ä¸ç¡®å®ï¼è·åææçhttpMessageConverterï¼
- èªå·±ç»å®¹å¨ä¸æ·»å httpMessageConverterï¼åªéè¦å°èªå·±çç»ä»¶æ³¨åå¨å®¹å¨ä¸ï¼@Bean,@Componentï¼
- Automatic registration of
(covered later in this document).å®ä¹é误代ç çæè§åMessageCodesResolver
- Static
support.éæé¦é¡µè®¿é®index.html
- Custom
support (covered later in this document).Favicon
- Automatic use of a
bean (covered later in this document).ConfigurableWebBindingInitializer
- æ们å¯ä»¥é ç½®ä¸ä¸ªConfigurableWebBindingInitializeræ¥æ¿æ¢é»è®¤çï¼ï¼æ·»å å°å®¹å¨ä¸ï¼
-
åå§åWebDataBinder; ä»çåè½æ¯ 请æ±æ°æ®ç»å®å°javabeanï¼
2ãæ©å±SpringMVC
If you want to keep Spring Boot MVC features and you want to add additional MVC configuration (interceptors, formatters, view controllers, and other features), you can add your own
@Configuration
class of type
WebMvcConfigurer
but without
@EnableWebMvc
. If you wish to provide custom instances of
RequestMappingHandlerMapping
,
RequestMappingHandlerAdapter
, or
ExceptionHandlerExceptionResolver
, you can declare a
WebMvcRegistrationsAdapter
instance to provide such components.
If you want to take complete control of Spring MVC, you can add your own
@Configuration
annotated with
@EnableWebMvc
.
<mvc:view-controller path="/hello" view-name="success"/>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/hello"/>
<bean></bean>
</mvc:interceptor>
</mvc:interceptors>
ç¼åä¸ä¸ªé 置类ï¼ï¼@Configurationï¼ï¼æ¯@WebMvcConfigurerç±»åçï¼è¿ä¸è½æ 注@EnableWebMvcè¿ä¸ªæ³¨è§£
è¿ä¸ªæ¯å¯¹springMVCçæ©å±é ç½®ï¼æ¢ä¿çäºææçèªå¨é ç½®ï¼ä¹è½ç¨æ们æ©å±çé ç½®ï¼
@Configuration
public class myconfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// addViewControllers
//æµè§å¨åé /atguigu 请æ±ï¼é¡µé¢ä¹è·³è½¬å°success页é¢
registry.addViewController("/").setViewName("/success");
}
}
åçï¼
1ï¼ãWebMvcConfigureræ¯SpringMVCçèªå¨é 置类ï¼SpringBoot2.0.5çæ¬ä»¥ä¸é½æ¯éè¿å®ç°WebMvcConfigureræ¥å£å¹¶éåæ¹æ³æ¥æ©å±é ç½®çã
2ï¼ãå¨åå ¶ä»é ç½®çæ¶åä¼å¯¼å ¥@Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
@Configuration
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration {
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
@Autowired(required = false) //èªå¨è£
é
ä¸æ¦æ¾å¨æ¹æ³ä¸ï¼é£ä¹è¿ä¸ªæ¹æ³çåæ°å°±ä¼ä»å®¹å¨ä¸è·åï¼ä¸é¢ä¾åä¸çconfigurersåä¼ä»å®¹å¨ä¸è·åï¼ç¶åå°ææ容å¨éé¢çconfigurerså¤å¶å°è¿ä¸ªç±»ä¸çthis.configurerséé¢å»
public void setConfigurers(List<WebMvcConfigurer> configurers) {
if (!CollectionUtils.isEmpty(configurers)) {
this.configurers.addWebMvcConfigurers(configurers);
//å
¶ä¸çä¸ä¸ªåèå®ç°ï¼å°ææçWebMvcConfigurerç¸å
³çé
ç½®é½è°ç¨ä¸éï¼
//å°ææçWebMvcConfigurerç¸å
³é
ç½®é½æ¥ä¸èµ·è°ç¨ï¼å
æ¬æ们èªå·±ç
//@Override
//public void addViewControllers(ViewControllerRegistry registry) {
//for (WebMvcConfigurer delegate : this.delegates) {
//delegate.addViewControllers(registry);
}
}
}
}
3ï¼ã容å¨ä¸ææçWebMvcConfigureré½ä¼ä¸èµ·æ¥èµ·ä½ç¨ã
4ï¼ãæ们çé 置类ä¹ä¼è¢«è°ç¨
ææï¼springMVCçèªå¨é ç½®åæ们æ©å±é ç½®é½ä¼èµ·ä½ç¨
3ãå ¨é¢æ¥ç®¡SpringMVCï¼
SpringBoot对SpringMVCçèªå¨é ç½®ä¸éè¦äºï¼ææé½æ¯æ们èªå·±é ç½®ï¼ï¼ï¼åªéè¦å¨é 置类ä¸æ·»å @EnableWebMvc注解ï¼ç¸åºçï¼ææçwebåºæ¯çèªå¨é ç½®é½å¤±æäºï¼ä¸æ¨è大家使ç¨å ¨é¢æ¥ç®¡ã
@EnableWebMvc
@Configuration
public class myconfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// addViewControllers
//æµè§å¨åé /atguigu 请æ±ï¼é¡µé¢ä¹è·³è½¬å°success页é¢
registry.addViewController("/").setViewName("/success");
}
}
åç:
为ä»ä¹@EnableWebMvcèªå¨é 置就失æäºï¼
1)ã@EnableWebMvcçæ ¸å¿
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}
2ï¼ã
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
3ï¼ã
@Configuration
@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
//å¤æ容å¨ä¸æ²¡æWebMvcConfigurationSupportè¿ä¸ªç»ä»¶çæ¶åï¼ä¸é¢çèªå¨é
ç½®æçæ
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {
4ï¼ã@EnableWebMvc帮æä»¬å¯¼å ¥äºDelegatingWebMvcConfigurationç±»ï¼è¿ä¸ªç±»åæ¯ç»§æ¿èªWebMvcConfigurationSupportç±»ï¼æ以å¨èªå¨é 置类çå¤æä¸ï¼å¤å®ä¸ºå¤±æç
5ï¼ãå¯¼å ¥çWebMvcConfigurationSupportåªæ¯SpringMVCæåºæ¬çåè½ï¼
5ãå¦ä½ä¿®æ¹SpringBootçé»è®¤é ç½®
模å¼
â 1ï¼ãSpringBootå¨èªå¨é ç½®å¾å¤ç»ä»¶çæ¶åï¼å ç容å¨ä¸æ没æç¨æ·èªå·±é ç½®çï¼ï¼@Beanï¼@Componentï¼å¦ææå°±ç¨ç¨æ·é ç½®çï¼å ¥è¡æ²¡ææèªå¨é ç½®ï¼å¦ææäºç»ä»¶å¯ä»¥æå¤ä¸ªï¼ViewResolverï¼å°ç¨æ·é ç½®çåèªå·±é»è®¤çç»åèµ·æ¥ï¼
â 2ï¼ãå¨SpringBootä¸ï¼ä¼æé常å¤çxxxconfigurer帮å©æ们è¿è¡æ©å±é ç½®ï¼
6ãRestfulCRUE
1ï¼ãé»è®¤è®¿é®é¦é¡µ
â æ们éè¦å°localhost:8080/çé»è®¤é¡µé¢è®¾ç½®æé¦é¡µ
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("/index");
registry.addViewController("/index.html").setViewName("index");
}
}
å¨2.0.5çæ¬ä»¥ä¸çSpringBootä¸ï¼æ们éè¿èªå®ä¹çé 置类ï¼å®ç°WebMvcConfigureræ¥å£å¹¶éåaddViewControllersï¼ï¼æ¹æ³æ¥è¿è¡æ·»å
2ï¼ãå½é å
1ï¼ãç¼åå½é åé ç½®æ件ï¼
2ï¼ã使ç¨ResourceBundleMessageSource管çå½é åèµæºæ件
3ï¼ãå¨é¡µé¢ä½¿ç¨fmt:messageååºå½é åå 容
æ¥éª¤ï¼
1ï¼ãç¼åå½é åé ç½®æ件ï¼æ½å页é¢éè¦æ¾ç¤ºçå½é åæ¶æ¯
设置çæ¶åä¸å®è¦çæ¸ æ¥å½å®¶_è¯è¨çæ ¼å¼ï¼å¯è½ä¸ä¸ªè¯è¨ä¼æå¤ä¸ªå½å®¶ä½¿ç¨ï¼ä¾å¦ç¾å½åè±å½é½ä½¿ç¨çè±è¯ï¼ä½æ¯å¨å½é åä¸è¿ä¸¤ä¸ªå½å®¶çè¯è¨ä¸é
2ï¼ãSpringBootèªå¨é 置好äºç®¡çå½é åèµæºæ件çç»ä»¶ï¼
@Configuration
@ConditionalOnMissingBean(
value = {MessageSource.class},
search = SearchStrategy.CURRENT
)
@AutoConfigureOrder(-2147483648)
@Conditional({MessageSourceAutoConfiguration.ResourceBundleCondition.class})
@EnableConfigurationProperties
public class MessageSourceAutoConfiguration {
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
String basename = context.getEnvironment().getProperty("spring.messages.basename", "messages");//æ们çé
ç½®æ件å¯ä»¥ç´æ¥æ¾å¨ç±»è·¯å¾ä¸å«message.properties
ConditionOutcome outcome = (ConditionOutcome)cache.get(basename);
if (outcome == null) {
outcome = this.getMatchOutcomeForBasename(context, basename);
cache.put(basename, outcome);
}
return outcome;
}
@Bean
public MessageSource messageSource() {
MessageSourceProperties properties = this.messageSourceProperties();
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
if (StringUtils.hasText(properties.getBasename())) {
//设置å½é
åèµæºæ件çåºç¡åï¼å»æè¯è¨å½å®¶ä»£ç çååï¼ messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(properties.getBasename())));
}
if (properties.getEncoding() != null) {
messageSource.setDefaultEncoding(properties.getEncoding().name());
}
messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale());
Duration cacheDuration = properties.getCacheDuration();
if (cacheDuration != null) {
messageSource.setCacheMillis(cacheDuration.toMillis());
}
messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
return messageSource;
}
3ï¼ãå»é¡µé¢è·åå½é åçå¼
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>This is index page</h1>
<h1 th:text="#{login.tip}"></h1>
<h1 th:text="#{login.btn}"></h1>
<h1 th:text="#{login.password}"></h1>
<h1 th:text="#{login.rememberme}"></h1>
<h1 th:text="#{login.username}"></h1>
</body>
</html>
ææï¼é¡µé¢å·²ç»æ ¹æ®æµè§å¨è®¾ç½®çè¯è¨è¿è¡äºå½é ååæ¢
åç
â å½é åLocalï¼åºåä¿¡æ¯å¯¹è±¡ï¼ï¼LocaleResolverï¼è·ååºåä¿¡æ¯å¯¹è±¡ï¼
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(
prefix = "spring.mvc",
name = {"locale"}
)
public LocaleResolver localeResolver() {
if (this.mvcProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED) {
return new FixedLocaleResolver(this.mvcProperties.getLocale());
} else {
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
return localeResolver;
}
}
4ï¼ãç¹å»é¾æ¥åæ¢å½é å
/*
* é¦å
éè¦ç¼åä¸ä¸ªå½é
åé
置类
* è¿éçå½é
åä¿¡æ¯çæ¥æºå¯ä»¥ä»é¾æ¥ä¸ä¼ åæ°æ¥è¾¾å°ç¶åéè¿request.getParameter("l");æ¥è·åå°é¾æ¥ä¸é¢çå¼
* */
public class myLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
String l = request.getParameter("l");
Locale locale = Locale.getDefault();
if (!StringUtils.isEmpty(l)){
String[] split = l.split("_");
locale = new Locale(split[0], split[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
}
}
//ç¼å好æ们çå½é
åé
ç½®ä¹åï¼éè¦å¨webmvcé
ç½®æ件ä¸æ·»å è¿ä¸ªé
ç½®
@Bean
public LocaleResolver localeResolver(){
return new myLocaleResolver();
}
//è¿æ ·æ们çå½é
åé
置就è½çæäºã
3ï¼ãç»å½
å¨å¼åæé´æ³è¦æ¨¡æ¿å¼æ页é¢ä¿®æ¹ä»¥åè¦å®æ¶çæï¼
1ï¼ãç¦ç¨æ¨¡æ¿å¼æçç¼å
#ç¦ç¨ç¼åï¼å®ç°é¡µé¢ççé¨ç½²
spring.thymeleaf.cache=false
2ï¼ã页é¢ä¿®æ¹å®æ以åæä½ctrl+f9éæ°ç¼è¯ï¼æåå·æ°é¡µé¢å°±å¯ä»¥äº
ç»å½é误çæ¶æ¯æ示
4ï¼ãæ¦æªå¨è¿è¡ç»å½æ£æ¥
1ï¼ãç¼åä¸ä¸ªæ¦æªå¨ï¼å®ç°HandlerInterceptoræ¥å£ï¼éåéé¢çpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)æ¹æ³ï¼
public class mylanjieqi implements HandlerInterceptor {
//æ¤æ¹æ³çè¿åå¼ï¼true代表ä¸æ¦æªï¼false代表æ¦æª
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
HttpSession session = request.getSession();
Object loginuser = session.getAttribute("loginuser");
if (loginuser == null){
//è¿åç»å½é¡µé¢
request.setAttribute("msg","ä½ æ²¡ææéè¿æ ·åï¼è¯·å
ç»å½");
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}else
{
//sessionæå¼ï¼åä¸æ¦æª
return true;
}
}
}
2ï¼ãå°æ¦æªå¨é ç½®å°æ们åçwebmvcé 置类ä¸ï¼è¿è¡æ³¨å
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new mylanjieqi()).addPathPatterns("/**").excludePathPatterns("/index.html","/user/login","/","login");
//éè¿addPathPatterns()æ¹æ³å°éè¦æ¦æªçåè½æ·»å è¿å»ï¼excludePathPatterns()æ¹æ³å°ä¸æ¦æªçåè½æé¤æï¼èéæèµæºèªå¨ä¸æ¦æªï¼SpringBoot帮æ们èªå¨æ¾è¡äºå¯¹éæèµæºçæ¦æªã
}
5ï¼ãCRUD-åå·¥å表
å®éªè¦æ±ï¼
1ï¼ãRestfulCRUDï¼CRUD满足Resté£æ ¼ï¼
URI:/èµæºå称/èµæºè¡¨ç¤º HTTP请æ±æ¹å¼æ¥åºå对èµæºCRUDçæä½
æ®éCRUDï¼uriæ¥åºåæä½ï¼ | RestfulCRUD | |
---|---|---|
æ¥è¯¢ | getEmp | empâGET |
æ·»å | addEmpï¼xxxx | empâPOST |
ä¿®æ¹ | updataEmpï¼id=xxx&xxx | emp/{id}âPUT |
å é¤ | deleteEmpï¼id=ï¼ | emp/{id}-DELETE |
2ï¼ãå®éªç请æ±æ¶æ
å®éªåè½ | 请æ±URI | 请æ±æ¹å¼ |
---|---|---|
æ¥è¯¢ææåå·¥ | emps | GET |
æ¥è¯¢æ个åå·¥ | emp/{id} | GET |
æ¥å°æ·»å é¡µé¢ | emp | GET |
æ·»å åå·¥ | emp | POST |
æ¥å°ä¿®æ¹é¡µé¢ï¼æ¥è¯¢åºå工信æ¯è¿è¡åæ¾ï¼ | emp/{id} | GET |
ä¿®æ¹åå·¥ | emp | PUT |
å é¤åå·¥ | emp/{id} | DELETE |
3ï¼ãåå·¥å表
使ç¨thymeleafå ¬å ±å ç´ æ½å
1ãæ½åå
Œ
±ç段
<div th:fragment="copy">
© 2011 The Good Thymes Virtual Grocery
</div>
2ãå¼å
¥å
Œ
±ç段ï¼åå¦å¤ä¸ä¸ªhtml页é¢ä¸å å
¥å¦ä¸ä»£ç
<body>
<div th:insert="~{footer :: copy}"></div>//代表å¨footer页é¢æä¸ä¸ªcopyç段ï¼æå
¥footerçcopyç段
</body>
~{templatename::selector} ï¼æ¨¡æ¿åï¼ï¼éæ©å¨
~{templatename::fragmentname} ï¼æ¨¡æ¿åï¼ï¼ç段å
3ãé»è®¤ææï¼
insertçåè½ç段å¨divæ ç¾ä¸
å¦æ使ç¨th:insertçå±æ§è¿è¡å¼å
¥ï¼å¯ä»¥ä¸ç¨å~{}ï¼
[[]];[(~{})]å¨è¡å
åæ³åå¿
é¡»å ä¸~{}
注æï¼è¿éç模æ¿åï¼ä¹ç¨å°äºthymeleafçå½åè§åï¼æ以ä¹ä¸éè¦æ·»å è·¯å¾ååç¼ï¼ç´æ¥åååã****
è¯æ³è§åï¼
~{templatename::selector} ï¼æ¨¡æ¿åï¼ï¼éæ©å¨ ä¹å°±æ¯cssä¸çéæ©å¨ ä¾å¦ï¼~{templatename::#id}
~{templatename::fragmentname} ï¼æ¨¡æ¿åï¼ï¼ç段å
4ï¼ãä¸ç§thå±æ§å»å¼å ¥æ¨¡æ¿ç段
th:insert ï¼å°å ¬å ±ç段æ´ä¸ªæå ¥å°æå®å ç´ ä¸footer被divå å«è¿å»äº
th:replaceï¼å°å£°æå¼å ¥çå ç´ æ¿æ¢æå ¬å ±ç段ï¼ä¸é¢ä¾åä¸æ¯æ´ä¸ªdiv被footeræ¿æ¢äº
th:includeï¼å°è¢«å¼å ¥çç段çå 容å å«è¿è¿ä¸ªæ ç¾ä¸ä¹å°±æ¯æ²¡æä¸é¢ç footeræ ç¾
<footer th:fragment="copy">
© 2011 The Good Thymes Virtual Grocery
</footer>
å¼å
¥æ¹å¼
<body>
...
<div th:insert="footer :: copy"></div>
<div th:replace="footer :: copy"></div>
<div th:include="footer :: copy"></div>
</body>
ææ
<body>
...
<div>
<footer>
© 2011 The Good Thymes Virtual Grocery
</footer>
</div>
<footer>
© 2011 The Good Thymes Virtual Grocery
</footer>
<div>
© 2011 The Good Thymes Virtual Grocery
</div>
</body>
5ï¼ãå ¬å ±é¨åç导èªæ å¦æéè¦å¨æåæ¢activeï¼é£ä¹å¨æ¨¡æ¿ä¸çæ·»å äºactive classçç»ä»¶ä¸æ·»å å¤æï¼è·åä¸ä¸ªä»å¼å ¥æ¨¡æ¿ä¼ éçå¼ï¼éè¿ä¸å 表达å¼çth:class="${ value1==â设å®çå¼â ? âæ·»å äºactive çclassâ ï¼â没ææ·»å activeçclassâ}"å¤æå®çå¼ï¼è®¾ç½®å®çclassï¼å½ç¶éè¦å¨å¼å ¥æ¨¡æ¿çæ¶åæ·»å åæ°ï¼åæ°çåæ³å¦ä¸ï¼
<div th:replace="::frag (${value1},${value2})">...</div>
<div th:replace="::frag (onevar=${value1},twovar=${value2})">...</div>
è¿æ ·å°±å¯ä»¥å¨æ设置activeçå¼äº
äºãSpringBootä¸Docker
1ãç®ä»
Dockeræ¯ä¸ä¸ªå¼æºçåºç¨å®¹å¨å¼æï¼
Dockeræ¯æå°è½¯ä»¶ç¼è¯æä¸ä¸ªéåï¼ç¶ååéåä¸åç§è½¯ä»¶å好é ç½®ï¼å°éååå¸åºå»ï¼å ¶ä»ä½¿ç¨è å¯ä»¥ç´æ¥ä½¿ç¨è¿ä¸ªéåï¼
è¿è¡ä¸çè¿ä¸ªéå称为容å¨ï¼å®¹å¨çå¯å¨æ¶é常快çã
Dockerçå¾ç¤º
2ãæ ¸å¿æ¦å¿µ
docker主æºï¼Hostï¼ï¼å®è£ äºDockerç¨åºçæºå¨ï¼Dockerç´æ¥å®è£ å¨ æä½ç³»ç»ä¹ä¸ï¼ï¼
docker客æ·ç«¯ï¼Clientï¼ï¼è¿æ¥docker主æºè¿è¡æä½ï¼
dockerä»åºï¼Registryï¼ï¼ç¨æ¥ä¿ååç§æå 好ç软件éåï¼
dockeréåï¼Imagesï¼ï¼è½¯ä»¶æå 好ï¼æ¾å¨dockerä»åºä¸ï¼
docker容å¨ï¼Containerï¼ï¼éåå¯å¨ä¹åçå®ä¾æ为ä¸ä¸ªå®¹å¨ï¼å®¹å¨æ¯ç¬ç«è¿è¡çä¸ä¸ªæè ä¸ç»dockeråºç¨
使ç¨Dockerçæ¥éª¤ï¼
â 1ï¼ãå®è£ Docker
â 2ï¼ãå»Dockerä»åºæ¾å°è¿ä¸ªè½¯ä»¶å¯¹åºçéå
â 3ï¼ã使ç¨Dockerè¿è¡è¿ä¸ªéåï¼è¿ä¸ªéåå°±ä¼çæä¸ä¸ªå®¹å¨
â 4ï¼ã对容å¨çå¯å¨åæ¢å°±æ¯è½¯ä»¶çå¯å¨åæ¢
3ãå®è£ Docker
1ï¼ãå®è£ linuxèææº
â 1ï¼ãVMwareãVirtualBoxï¼å®è£ ï¼ï¼
â 2ï¼ãå¯¼å ¥èææºæ件
â 3)ãåå»å¯å¨èææºï¼ä½¿ç¨ï¼ root/123456 ç»å½
â 4ï¼ã使ç¨å®¢æ·ç«¯è¿æ¥linuxæå¡å¨è¿è¡æä½
â 5ï¼ã设置èææºç½ç»ï¼
â æ¡¥æ¥ç½è·¯=é好ç½å¡æ¥å ¥ç½çº¿ï¼
â 6ï¼ã设置好çç½ç»ä¹åç¨å½ä»¤éå¯èææºçç½ç»
service network restart
â 7)ãæ¥çlinuxçipå°å
ip addr
â 8ï¼ã使ç¨å®¢æ·ç«¯è¿æ¥ï¼
2ï¼ãå¨linuxèææºä¸å®è£ Docker
â 1ãæ¥çcentosçæ¬ï¼
â dockerè¦æ±CnetOSç³»ç»çå æ ¸çæ¬é«äº3.10
â 2ãå级软件å åå æ ¸ï¼ï¼éåï¼
â 3ãå®è£ docker
yum install docker
â 4ãå¯å¨docker
systemctl start docker
â 5ãå°docker设置为å¼æºå¯å¨
systemctl enable docker
â 6ãåæ¢docker
systemctl stop docker
3ï¼ãå¨windowsä¸å®è£ docker
â 1ãæ¥çwindowsçç³»ç»ä¿¡æ¯ï¼dockeråªè½å¨windows10 æè²çåä¼ä¸çä¸è¿è¡
â 2ãä¸è½½docker
â å°åï¼https://store.docker.com/editions/community/docker-ce-desktop-windows
â å¨æ³¨åè´¦å·ä¹åï¼ä¾¿å¯ä»¥ä¸è½½docker
â 注æï¼dockeræ¯å¤å½ç½ç«ï¼æ³¨åæ¶éè¦éªè¯ä½ ä¸æ¯æºå¨äººï¼éè¦ä½ è¿æ¥ä¸ä¸ªvpn继ç»æ³¨åï¼ææ¯ä½¿ç¨çå¯ç¹å éå¨
â 详ç»è¯·çï¼https://blog.csdn.net/debugbugbg/article/details/81865553#commentBox
â 3ãç°å¨å®æåç´æ¥å®è£ ï¼è¿ç¨ä¸éè¦éå¯è®¡ç®æºï¼
â 4ãéå¯å®æä¹åï¼æå¼dockerï¼å³å»å°å¾æ éæ©sign inè¿è¡ç»å½ï¼
â
â 5ãè³æ¤ï¼dockerå·²ç»å¯å¨å®æ¯äºï¼å¯ä»¥ç´æ¥å»cmdçªå£ä½¿ç¨dockeräºï¼
â è¾å ¥ docker -v æ¥çå½ådockerççæ¬ï¼ä»¥åå¨cmdçªå£æååå¨linuxæä½ä¸è´
4ãdockerç常ç¨æä½
1ï¼ãdockeréåæä½
æä½ | å½ä»¤ | 说æ |
---|---|---|
æ£ç´¢ | docker search egï¼docker search redis | æ们ç»å¸¸å»docker hubä¸æ£ç´¢éåç详ç»ä¿¡æ¯ï¼å¦éåçTAG |
æå | docker pull éåå:tag | :tagæ¯å¯éçï¼tag表示æ ç¾ï¼å¤ä¸ºè½¯ä»¶ççæ¬ï¼é»è®¤æ¯latest |
å表 | docker images | æ¥çæ¬å°ææéå |
å é¤ | docker rmi image-id | å é¤æå®çæ¬å°éå |
â æ¥çéåéè¦å°docker-hubä¸æ¥çï¼https://hub.docker.com/
2ï¼ãdocker容å¨æä½
使ç¨dockerçæµç¨ï¼å¾å°è½¯ä»¶éåï¼QQå®è£ ç¨åºï¼âè¿è¡éå----产çä¸ä¸ªå®¹å¨ï¼ä¹å°±æ¯æ们æ£å¨è¿è¡ç软件ï¼è¿è¡çQQï¼ï¼
æä½å½ä»¤ | å½ä»¤ | 说æ |
---|---|---|
è¿è¡ | docker run -name ä½ çåå -d image-name :tag eg:docker run -name mysql01 -d mysql:latest | -name:èªå®ä¹å®¹å¨åå -d:åå°è¿è¡ image-name:æå®éåæ¨¡æ¿ :tag æå®éåççæ¬ï¼é»è®¤ä¸ºlatest |
å表 | docker ps(æ¥çè¿è¡ä¸ç容å¨)ï¼ | å ä¸ -a å°±å¯ä»¥æ¥çææç容å¨ï¼æ 论è¿è¡ä¸å¦ |
åæ¢ | docker stop container-name/container-id | éè¿å®¹å¨ååæè 容å¨çidåæ¢è¿ä¸ªå®¹å¨ |
å¯å¨ | docker start container-name/container-id | éè¿å®¹å¨çååæè 容å¨çidå¯å¨è¿ä¸ªå®¹å¨ |
å é¤ | docker rm container-name/container-id | éè¿å®¹å¨çååæè idå é¤æä¸ªå®¹å¨ |
端å£æ å° | -p 3308:3306 eg:docker run -d -p 6379:6379 -name myredis docker.io/redis | å°ä¸»æºï¼å®è£ dockerçè¿ä¸ªæºå¨ï¼ç3308端å£å容å¨éé¢ç3306端å£ç¸ç»å®ï¼è¿æ ·å¤é¨è®¿é®ä¸»æºç3308端å£å³å¯è®¿é®å°å®¹å¨å é¨çå 容 |
容å¨æ¥å¿ | docker logs container-name/container-id | éè¿å®¹å¨çååæè 容å¨çidæ¥çè¿ä¸ªå®¹å¨çæ¥å¿ |
æ´å¤å½ä»¤ï¼è¯·æ¥çå®æ¹ææ¡£
æ¥éª¤ï¼
1ãæç´¢tomcatéå
docker search tomcat
2ãæåtomcatéå
docker pull tomcat
3ãæ ¹æ®éåå¯å¨å®¹å¨
docker run --name mytomcat -d tomcat:latest
4ãæ¥çè¿è¡ä¸ç容å¨
docker ps
5ãåæ¢è¿è¡ä¸ç容å¨
docker stop mytoncat/容å¨çid
6ãæ¥çææç容å¨
docker ps -a
7ãå é¤ä¸ä¸ªå®¹å¨ï¼è¿ä¸ªå®¹å¨ä¸å®æ¯åæ¢ç¶ææè¡ï¼åºå«äºå é¤éåï¼
docker rm 容å¨çid // docker rmi éåçid
8ãå¯å¨å®¹å¨
docker start 容å¨id
9ãå¯å¨ä¸ä¸ªåäºç«¯å£æ å°çtomcat
docker run --name mytomcat -d -p 8888:8080 tomcat:latest
-dï¼åå°è¿è¡
-pï¼å°ä¸»æºç端å£å容å¨ç端å£ç¸äºç»å® 主æºç«¯å£ï¼å®¹å¨å
é¨ç端å£
10ã为äºæ©é¥°ç®åå
³éäºlinuxçé²ç«å¢
service firewalld statusï¼æ¥çé²ç«å¢ç¶æ
service firewalld stopï¼å
³éé²ç«å¢
11ãæ¥ç容å¨æ¥å¿
docker logs container-id/container-name
æ´å¤å½ä»¤åèå®æ¹ææ¡£
3ï¼ãå®è£ mysqlçå®ä¾
docker pull mysql
é误çå¯å¨
PS C:\Users\Administrator> docker run --name mysql01 -d mysql
cb38e2a596ebb8cccc3f0711a4a2d713e26e5179e68220f6658c821de6e7aa2e
PS C:\Users\Administrator> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb38e2a596eb mysql "docker-entrypoint.sâ¦" 17 seconds ago Exited (1) 16 seconds ago mysql01
é误信æ¯ï¼
PS C:\Users\Administrator> docker logs mysql01
error: database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
//æ们mysqlçå¯å¨éè¦ç»rootç¨æ·è®¾ç½®ä¸ä¸ªå¯ç ï¼å¯ä»¥æ¯ç©ºå¯ç æè
ä¸ä¸ªéæºå¯ç ä½æ¯å¿
é¡»æå®ä¸ä¸ª
æ£ç¡®çå¯å¨
PS C:\Users\Administrator> docker run --name mysql02 -e MYSQL_ROOT_PASSWORD=sxt510922 -d mysql:latest
c6ea0af29c848ba917289d8be8ee05cfad9b58bd0f9b5e85c6ec9fe1d3c16805
ä½æ¯è¿æ ·é ç½®æ们ä¾ç¶æ æ³è¿æ¥è¿ä¸ªmysqlï¼å 为没æ端å£æ å°ï¼æ æ³ä»å¤é¨è¿æ¥
åäºç«¯å£æ å°çå¯å¨
PS C:\Users\Administrator> docker run --name mysql02 -e MYSQL_ROOT_PASSWORD=sxt510922 -d -p 3307:3306 mysql:latest
633eb07209bed865db36ecc8a4953c9da934f443865631301dec0430aa6a3203
å使ç¨ps -a æ¥çä¸ä¸å½åè¿è¡çdocker
PS C:\Users\Administrator> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
633eb07209be mysql:latest "docker-entrypoint.sâ¦" 14 seconds ago Up 12 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp mysql02
å ä¸ªå ¶ä»çé«çº§æä½
$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
//æ主æºç/my/customæ件夹æå¨å° mysql容å¨ç/etc/mysql/conf.dæ件
æ¹mysqlçé
ç½®æ件就åªéè¦æmysqlçé
ç½®æ件
//ä¸ä½¿ç¨é
ç½®æ件çå½ä»¤
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
æå®ä¸äºmysqlçåæ°
4ï¼ãå®æ¹çéåå é
dockeré»è®¤ä½¿ç¨çæ¯ç¾å½çéåä»åºï¼ä½æ¯å¨å½å ä¹ææ管çï¼æ们åªéè¦å¨ä½¿ç¨pullå½ä»¤çæ¶åæ·»å ç¨å代ç å°±å¯ä»¥å¿«éä¸è½½äº
docker pull registry.docker-cn.com/library/éåçåå:çæ¬å·
详æ è§å®ç½ï¼https://www.docker-cn.com/registry-mirror
å ãSpringBootä¸æ°æ®è®¿é®
1ãJDBC
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
å¦ææ们éè¦è®¿é®æ°æ®åºï¼å¨æ·»å äºsqlåjdbc模åä¹åï¼å¨ymlæè propertiesé ç½®æ件ä¸æ·»å å¦ä¸é 置就å¯ä»¥äº
spring:
datasource:
username: ä½ çåå
password: ä½ çå¯ç
url: jdbc:mysql://localhost:3306/sms
driver-class-name: com.mysql.jdbc.Driver
ææï¼
â SpringBoot 2.0.5çæ¬ é»è®¤ä½¿ç¨çæ¯org.apache.tomcat.jdbc.pool.Datasourceæ°æ®æº
â æ°æ®æºçç¸å ³é ç½®é½å¨DataSourcePropertiesè¿ä¸ªç±»éé¢ï¼éè¿æä½Ctrlç¹å»é ç½®æ件ä¸çå±æ§å³å¯è¿å ¥æ¤ç±»ã
èªå¨é ç½®åçï¼
org.springframework.boot.autoconfigure.jdbc
1ãåèDataSourceConfigurationï¼æ ¹æ®é ç½®å建æ°æ®æºï¼ï¼é»è®¤ä½¿ç¨tomcatè¿æ¥æ± ï¼å¯ä»¥ä½¿ç¨spring.datasource.typeæå®èªå®ä¹çæ°æ®æºç±»åä¾å¦c3p0
2ãSpringBooté»è®¤æ¯æçæ¯ï¼
org.apache.tomcat.jdbc.pool.DataSourceã
com.zaxxer.hikari.HikariDataSourceã
org.apache.commons.dbcp2.BasicDataSource.class
3ãèªå®ä¹æ°æ®æº
å
æ¬èªå®ä¹æ°æ®æºï¼å¦ææ们æå®çæ°æ®æºä¸æ¯ä»¥ä¸å ç§ï¼é£ä¹å使ç¨æ们èªå·±æå®çæ°æ®æº
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {
@Bean
public DataSource dataSource(DataSourceProperties properties) {
//æ¯ä½¿ç¨DataSourceBuilderæ¥å建æ°æ®æº,å©ç¨åå°å建typeçæ°æ®æºï¼å¹¶ä¸ç»å®ç¸å
³å±æ§
return properties.initializeDataSourceBuilder().build();
}
}
4ã1.5.9çæ¬çDataSourceInitializerä¹å°±æ¯2.0.5çæ¬ä¸çDataSourceInitializerInvokerï¼å®ç°äºApplicationListenerè¿ä¸ªçå¬å¨
â ä½ç¨ï¼
â 1ï¼ãthis.dataSourceInitializer.initSchema(); è¿è¡å»ºè¡¨è¯å¥
â 2ï¼ãinitializer.initSchema(); åå§åschema
é»è®¤åªéè¦å°æ件å½å为ï¼
schema-*.sqlãdata-*.sql
é»è®¤è§åï¼schema.sql schema-all.sql
ä¹å¯ä»¥ä½¿ç¨ schema: classpath:auditing_money.sql æ¥æå®æä¸ä¸ªsqlæ件çä½ç½®
注æ
â å¨SpringBoot1.xä¸, è¿è¡schema.sqlä¸éè¦é 置便å¯ç´æ¥è¿è¡,ä½æ¯å¨SpringBoot2.xä¸,æ们éè¦å¨é ç½®æ件ä¸é ç½®ä¸ä¸:
â spring.datasource.initialization-mode: always
é 置好äºä¹å,便å¯éè¿.
--------------------- ä½è ï¼èä¸ æ¥æºï¼CSDN åæï¼https://blog.csdn.net/qq_41473874/article/details/82184462?utm_source=copy çæ声æï¼æ¬æ为å主ååæç« ï¼è½¬è½½è¯·éä¸åæé¾æ¥ï¼
5ãæä½æ°æ®åºï¼èªå¨é ç½®äºJdbcTemplateæä½æ°æ®åº
å¯ä»¥ä½¿ç¨jdbcTemplate.queryForList(âselect * from smbms_addressâ);è¿æ ·çæ¹å¼æ¥æ¥è¯¢æ°æ®åºä¸çå 容
@Controller
public class Hellocontroller {
@Autowired
JdbcTemplate jdbcTemplate;
@ResponseBody
@GetMapping(value = "emp")
public String getemp(){
List<Map<String, Object>> maps = jdbcTemplate.queryForList("select * from smbms_address");
return maps.toString();
}
2ãæ´åDruidæ°æ®æº
æ¥éª¤ï¼
â 1ãå¨pom.xmlæ件ä¸å¯¼å ¥Druidçç¸å ³ä¾èµ
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.11</version>
</dependency>
â ä¹å¯ä»¥ç´æ¥å¯¼å ¥å¯å¨å¨
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
â 2ãå¨application.ymlæè application.propertiesæ件ä¸é 置使ç¨DruidDataSource
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
â 3ãå¨application.ymlæè application.propertiesé ç½®DataSourceä¿¡æ¯ï¼è¿éæ¯ymlçæ ¼å¼ï¼
â **注æï¼**è¿éçé ç½®ä¸å®è¦åï¼ä¸ç¶druidççæ§æ¯æ æ³è·åå°å¼çã
initialSize: 6
minIdle: 5
maxActive: 20
timeBetweenEvictionRunsMillis: 600000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
filters: stat,wall
maxPoo1PreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqIMillis=500
â 4ãå建druidconfigç±»ï¼ç±»åèªæï¼åºç¨ä¸é¢çé ç½®
@Configuration
public class druidconfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid(){
return new DruidDataSource();
}
}
â 5ãå¨druidconfigä¸é ç½®sql管çåå°çfilteråservlet
//é
ç½®servlet
//å¯ä»¥ä½¿ç¨æ³¨è§£@WebServletå®ç°ï¼å
·ä½å®ç°æ
¢æ
¢ç 究
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");//å°servlet注å
¥å®¹å¨ä¸å¹¶è®¾ç½®url为/druid/*
Map<String,String> map = new HashMap<>();//éè¿mapåæ¾åå§åé
ç½®æ件
map.put("loginUsername","admin");
map.put("loginPassword","123456");
map.put("allow","localhost");//é»è®¤å°±æ¯å
许ææ访é®
map.put("deny","192.168.0.1");//æç»ä¸é¢çå°å访é®
bean.setInitParameters(map);//åºç¨é
ç½®æ件
return bean;
}
//é
ç½®æ¦æªå¨filter
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String,String> map = new HashMap<>();
map.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(map);
bean.setUrlPatterns(Arrays.asList("/*"));//设置éè¦æ¦æªç请æ±ï¼ä¸ºäºçæ§sqlæ以æ¦æªææç请æ±
return bean;
}
3ãæ´åMybatis
å¯¼å ¥ç¸å ³çstarters
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
ä»çä¾èµå¦å¾ï¼
æ¥éª¤ï¼
â 1ï¼ãé ç½®æ°æ®æºç¸å ³å±æ§ï¼è§ä¸ä¸èçDruid
â 2ï¼ãç»æ°æ®åºå»ºè¡¨
â 3ï¼ãå建javaBean
â
4ã注解ç
/**
* @ClassName peachMapper
* @Author Peach
* @Date 2018/10/11 10:19
* @Version 1.0
**/
public interface peachMapper {
@Select(value = "select * from auditing_leave where id = #{id}")
public auditing_leave queryById(Integer id);
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert(value = "insert into auditing_leave(name_test) values(#{nameTest})")
public int insert(auditing_leave al);
}
注解çéè¿ç¼åæ¥å£å@Select注解æ¥å®ç°
å°é®é¢ï¼
1ãèªå¢é¿IDï¼éè¿ç»æ¹æ³ä¸æ·»å @Options(useGeneratedKeys = true, keyProperty = âidâ)å®ç°ï¼æ¤æ¹æ³ä¸å»ºè®®ä½¿ç¨äºé ç½®çmybatis
// @Options(useGeneratedKeys = true, keyProperty = "id")
@Insert(value = "insert into auditing_leave(name_test) values(#{nameTest})")
public int insert(auditing_leave al);
注æï¼è¿ééè¦æ³¨æï¼Mapperåæ°æ®åºé ç½®çèªå¢é¿æ¯ä¸åçï¼å¨æ°æ®åºé ç½®çèªå¢é¿åªéç¨äºæ°æ®åº
Mapperé ç½®çèªå¢é¿å¯ä»¥ç¨äºæå ¥åçè¿å
ä¾å¦ï¼controlleræå¦ä¸ä»£ç ï¼
@GetMapping("/emp")
@ResponseBody
public String addsome(auditing_leave al){
mapper.insert(al);
return al.toString();
}
使ç¨æ°æ®åºèªå¢é¿ï¼è®¿é®æ¤æ¹æ³è¿åç»æå¦ä¸
ä½æ¯æ°æ®åºä¸æ¯æidçï¼
使ç¨Mapperèªå¢é¿æ³¨è§£è¿åç»æå¦ä¸
æ°æ®ä¸ä¾ç¶æid
å¸ææä¹ æ¯ æå ¥ä¹åç´æ¥è°ç¨æå ¥è¿åç对象çåå¦æ³¨æä¸ä¸
2ãå ³äºé©¼å³°å½åæ³
æçmybatis-spring-boot-starterçæ¬æ¯1.3.2ï¼å®é»è®¤æ¯æ¯æ驼峰å½åçãæçSpringBootå½åçæ¬æ¯2.0.5
å¦ææ¯å ¶ä»çæ¬tçåå¦ï¼å¯è½éè¦ç¼åé 置类
//å¼å¯é©¼å³°å½åæ³
@Configuration
public class MybatisConfig {
@Bean
public ConfigurationCustomizer customizer (){
return new ConfigurationCustomizer() {
@Override
public void customize(org.apache.ibatis.session.Configuration configuration) {
configuration.setMapUnderscoreToCamelCase(true);
// éè¿ä½¿ç¨configuration.setxxxxxæ¹æ³å¯ä»¥èªå®ä¹mybatisçå±æ§
}
};
}
}
3ãå ³äºé 置类ç@Mapper注解
å¦ææ¯ä¸ä¸ªé 置类é½åä¸ä¸ª@Mapper注解æ¯ä¸æ¯å¾éº»ç¦ï¼å¯ä»¥å¨æ们èªå·±ç¼åmybatisconfigç±»æè SpringBootçå¯å¨ç±»ä¸æ·»å 注解@MapperScan(value = âä½ çMapperå çå ¨ç±»åâ)
@MapperScan(value = "com.example.class06practice.mapper")
5ãé ç½®çmybatis
æ¥éª¤ï¼
â 1ãç¼åMapperæ¥å£
@Mapper
public interface TestMapper {
public auditing_money getone(Integer id);
@Options(useGeneratedKeys = true, keyProperty = "id")//éè¿options设置idèªå¢é¿
@Insert(value = "insert into auditing_money(type) values(#{type})")
public int insert(auditing_money am);
}
â 2ãå¨resourcesç®å½ä¸å建mybatis主é ç½®æ件åmapperé ç½®æ件
â 主é ç½®æ件mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
â 对åºMapperçé ç½®æ件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.class06practice.mapper.TestMapper">
<select id="getone">
select * from auditing_money where id = #{id}
</select>
<insert id="insert" parameterType="com.example.class06practice.vo.auditing_money" >
insert into auditing_money(type) values (#{type})
</insert>
</mapper>
â 3ãå¨application.ymlé ç½®æ件ä¸æå®è¿ä¸¤ç§é ç½®æ件çä½ç½®
mybatis:
config-location: classpath:mybatis/mybatis-config.xml 主é
ç½®æ件çä½ç½®
mapper-locations: classpath:mybatis/Mapper/*.xml Mapperé
ç½®æ件çä½ç½®
//å°MAPPERçæ¥å¿çº§å«è°æ´å°debug级å«å°±å¯ä»¥å°sqlè¯å¥æå°åºæ¥
logging:
level:
com.example.class06practice.mapper: debug
6ãæ´åJPA
1ãä»ä¹æ¯JPAï¼
â JPAæ¯Java Persistence APIçç®ç§°ï¼ä¸æåJavaæä¹ å±APIï¼æ¯JDK 5.0注解æXMLæ述对象ï¼å ³ç³»è¡¨çæ å°å ³ç³»ï¼å¹¶å°è¿è¡æçå®ä½å¯¹è±¡æä¹ åå°æ°æ®åºä¸ã
Sunå¼å ¥æ°çJPA ORMè§èåºäºä¸¤ä¸ªåå ï¼å ¶ä¸ï¼ç®åç°æJava EEåJava SEåºç¨å¼åå·¥ä½ï¼å ¶äºï¼Sunå¸ææ´åORMææ¯ï¼å®ç°å¤©ä¸å½ä¸ã
å¾ç¤ºï¼
2ãæ´åSpringData JPA
JPA:ORM(å¯¹è±¡å ³ç³»æ å° Object Relational Mapping)
â 1ï¼ãå¯¼å ¥Jpaç¸å ³çstarteræè mavenä¾èµ
â 2ï¼ãç¼åä¸ä¸ªå®ä½ç±»ï¼Beanï¼åæ°æ®è¡¨è¿è¡æ å°ï¼å¹¶é 置好æ å°å ³ç³»ï¼
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)//èªå¢ä¸»é®
private Integer id;
@Column(name = "last_name",length = 50)
private String name;
@Column//é»è®¤ç±»åå°±æ¯å±æ§å
private String Email;
private Data birthday;
private String address;
//以ä¸çç¥getteråsetteræ¹æ³
}
â *注æï¼æ¤å¤éè¦æ³¨æçæ¯ @Idçå ä¸è¦å¯¼éäºï¼åºè¯¥æ¯javax.persistence.çå ï¼å¦æ导éåä¼æåºNo identifier specified for entity: com.example.springdemo.entity.AnyUserçå¼å¸¸ã
â å¿ é¡»æ³¨æï¼å¦ææ¤å¤æ³è¦èªå·±ç¼åå¤æçæ¥è¯¢è¯å¥ï¼ä¸ç¨å ç½®çæ¥è¯¢è¯å¥ï¼åéè¦ç¨å°@Query注解ï¼@Query注解éè¦è®¾ç½®å ¶ä¸çnativeQuery=trueå±æ§æè½æ£å¸¸ä½¿ç¨ã代ç å¦ä¸
@Query(value = âselect * from userâ,nativeQuery = true)
//spring-data-jpa çæ¬2.0.5以ä¸æ æ³ç»§æ¿JpaRepository,æ¹ä¸ºç»§æ¿Repository
// @org.springframework.stereotype.Repository
// @Component
public interface UserRepository extends Repository<User,Integer> {
User save(User user);
User findById(Integer id);
@Query(value = "select * from user",nativeQuery = true)
List getaa();
}
â 3)ãç¼åä¸ä¸ªDaoæ¥æä½å®ä½ç±»æ对åºçæ°æ®è¡¨ï¼Repositoryï¼
â 注æï¼spring-data-jpa çæ¬2.0.5以ä¸æ æ³ç»§æ¿JpaRepository,æ¹ä¸ºç»§æ¿Repository
//spring-data-jpa çæ¬2.0.5以ä¸æ æ³ç»§æ¿JpaRepository,æ¹ä¸ºç»§æ¿Repository
public interface UserRepository extends Repository<User,Integer> {
}
â 4ï¼ãåºæ¬çé ç½®ï¼jpaåºæ¬é ç½®é½æ¯ä»¥jpaå¼å¤´ç
jpa:
hibernate:
#设置æ°æ®è¡¨ççææ¹å¼ä¸ºupdata å¦ææåæ´æ°ï¼å¦æ没æåå建ä¸å¼
ddl-auto: update
#设置å¨æ§å¶å°æå°sqlè¯å¥
show-sql: true
â 5ï¼ãjapçå ç½®æ¥è¯¢è¯æ³
å ³é®è¯ | ç¤ºä¾ | 对åºçsqlç段 |
---|---|---|
| | |
| | |
| , , | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | (parameter bound with appended ) |
| | (parameter bound with prepended ) |
| | (parameter bound wrapped in ) |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
ä¸ãå¯å¨é ç½®åç
å 个éè¦çæ¶é´åè°æºå¶
é ç½®å¨META-INF/spring.factories
ApplicationContextInitializer iocå®¹å¨ ä¸ä¸æåå§åå¨
SpringApplicationRunListener spring åºç¨å¯å¨çå¬å¨
åªéè¦å å¨ioc容å¨ä¸ç
ApplicationRunner åºç¨å¯å¨å¨
CommandLineRunner å½ä»¤è¡å¯å¨å¨
å¯å¨æµç¨ï¼
1ãå建SpringApplication对象ï¼new SpringApplication(primarySources)
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
//ä¿åèµå¼ä¸»é
置类
this.resourceLoader = resourceLoader;
Assert.notNull(primarySources, "PrimarySources must not be null");
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
//å¤æå½åæ¯å¦ä¸ä¸ªwebåºç¨
this.webApplicationType = deduceWebApplicationType();
//ä»ç±»è·¯å¾ä¸æ¾å°META-INF/spring.factoriesä¸é¢ææçApplicationContextInitializerï¼ç¶åä¿åèµ·æ¥
setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInitializer.class));
setListeners((Collection)
//ä»ç±»è·¯å¾ä¸æ¾å°META-INF/spring.factoriesé
ç½®çææApplicationListener
getSpringFactoriesInstances(ApplicationListener.class));
//ä»å¤ä¸ªé
置类ä¸æ¾å°æmainæ¹æ³çé
置类ä½ä¸ºç¨åºç主é
置类
this.mainApplicationClass = deduceMainApplicationClass();
}
2ãè¿è¡runæ¹æ³
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
configureHeadlessProperty();
//è·åSpringApplicationRunListenersï¼ä»ç±»è·¯å¾ä¸META-INF/spring.factories
SpringApplicationRunListeners listeners = getRunListeners(args);
//åè°ææçè·åSpringApplicationRunListener.starting()æ¹æ³
listeners.starting();
try {
//å°è£
å½ä»¤è¡åæ°
ApplicationArguments applicationArguments = new DefaultApplicationArguments(
args);
//åå¤ç¯å¢
ConfigurableEnvironment environment = prepareEnvironment(listeners,
applicationArguments);
configureIgnoreBeanInfo(environment);
//å®æåä¼åè°SpringApplicationRunListener.environmentPrepared()æ¹æ³è¡¨ç¤ºç¯å¢åå¤å®æ
//æå°Bannerä¹å°±æ¯Springçé£ä¸ªå¤§çæåç»æçå¾æ
Banner printedBanner = printBanner(environment);
//å建ApplicationContextä¹å°±æ¯ioc容å¨å¨æ¤å³å®å建ä¸ä¸ªwebiocè¿æ¯ä¸ä¸ªæ®éçioc
context = createApplicationContext();
//å¤çå¼å¸¸æ¥å
exceptionReporters = getSpringFactoriesInstances(
SpringBootExceptionReporter.class,
new Class[] { ConfigurableApplicationContext.class }, context);
//åå¤ä¸ä¸æç¯å¢ å°environmentä¿åå°iocä¸ï¼èä¸è¿è¦è°ç¨applyInitializers()æ¹æ³
//åè°ä¹åææå·²ç»ä¿åçApplicationContextInitializerçinitialize()æ¹æ³
//åè°ææçSpringApplicationRunListenerçcontextPrepared()æ¹æ³
prepareContext(context, environment, listeners, applicationArguments,
printedBanner);
//prepareContextè¿è¡å®æä¹ååè°ææçSpringApplicationRunListenersçcontextLoaded()æ¹æ³ã
//æ¯å·æ°å®¹å¨ï¼ioc容å¨åå§åï¼å¦ææ¯webåºç¨ï¼è¿ä¼å建åµå
¥å¼çtomcat ï¼ï¼Spring注解ç
//æ«æãå è½½ãå建ææç»ä»¶çå°æ¹ï¼é
置类ãç»ä»¶ãèªå¨é
ç½®ï¼
refreshContext(context);
//ä»ioc容å¨ä¸è·åææçApplicationRunneråCommandLineRunnerè¿è¡åè°
//ApplicationRunnerå
åè°åè°CommandLineRunner
afterRefresh(context, applicationArguments);
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch);
}
//ææçspringApplicationRunListeneråè°started()æ¹æ³
listeners.started(context);
callRunners(context, applicationArguments);
}
catch (Throwable ex) {
handleRunFailure(context, ex, exceptionReporters, listeners);
throw new IllegalStateException(ex);
}
try {
listeners.running(context);
}
catch (Throwable ex) {
handleRunFailure(context, ex, exceptionReporters, null);
throw new IllegalStateException(ex);
}
//æ´ä¸ªSpringBootåºç¨å¯å¨å®æä¹åï¼è¿åå¯å¨çioc容å¨
return context;
}
3ãäºä»¶çå¬æºå¶
é ç½®å¨META-INF/spring.factories
ApplicationContextInitializer iocå®¹å¨ ä¸ä¸æåå§åå¨
SpringApplicationRunListener spring åºç¨å¯å¨çå¬å¨
åªéè¦å å¨ioc容å¨ä¸ç
ApplicationRunner åºç¨å¯å¨å¨
CommandLineRunner å½ä»¤è¡å¯å¨å¨
éè¦ä½¿ç¨è¿äºçå¬å¨åè·åå¯å¨å¨å¯å¨æ¶çåæ°çè¯ï¼åªéè¦ç¼åé 置类ï¼å®ç°ä¸é¢å¯¹åºçæ¥å£åå ¶æ¹æ³ï¼
ApplicationRunner åºç¨å¯å¨å¨åCommandLineRunner å½ä»¤è¡å¯å¨å¨éè¦å°è¯¥ç±»éè¿@Component注解å°ioc容å¨ä¸ï¼èApplicationContextInitializer iocå®¹å¨ ä¸ä¸æåå§åå¨åSpringApplicationRunListener spring åºç¨å¯å¨çå¬å¨åéè¦å¨resourceç®å½ä¸å建ä¸ä¸ªMETA-INFæ件夹ï¼å¨META-INFæ件夹ä¸å建spring.factoriesé ç½®æ件è¿è¡é ç½®å¦ä¸ï¼
#Initializers
org.springframework.context.ApplicationContextInitializer=\
com.example.practice1015.druid.listener.listener
org.springframework.boot.SpringApplicationRunListener=\
com.example.practice1015.druid.listener.helloSpringApplicationRunListener
ä¸ä¸ªCommandLineRunnerçä¾åï¼å ¶ä»ççå¬å¨åå¯å¨å¨é½æ¯å¦æ¤æ¥ç¼åï¼åªæ¯å¼å ¥æ¹å¼ä¸å
@Component
public class helloCommandLineRunner implements CommandLineRunner{
@Override
public void run(String... args) throws Exception {
System.out.println("CommandLineRunner æ£å¨çå¬"+args.length + "=="+Arrays.asList(args));
}
}
å «ãSpringBootèªå®ä¹startersï¼åºæ¯å¯å¨å¨ï¼
starterï¼
â 1ãè¿ä¸ªåºæ¯éè¦ç¨å°çä¾èµæ¯ä»ä¹
â 2ãå¦ä½ç¼åèªå¨é ç½®
@Configuration //åè¯SpringBootè¿ä¸ªæ¯ä¸ä¸ªé
置类
@ConditionalOnWebApplication //å¤æä¸äºConditionalOnXXXXï¼æå®æ¡ä»¶æç«çæ
åµä¸ï¼èªå¨é
ç½®çæè¿ä¸ªæ¯ä¸ä¸ªwebåºç¨
@AutoConfigureOrder //æå®èªå¨é
置类ç顺åº
@AutoConfigureAfter //é
ç½®å®å¨åªä¸ªèªå¨é
置类ä¹åæ§è¡
@Bean //ç»å®¹å¨ä¸æ·»å ç»ä»¶
@ConfigurationProperties //ç»åç¸å
³çxxxxPropertiesç±»æ¥ç»å®ç¸å
³çé
ç½®
@EnableConfigurationProperties //让xxxPropertiesçæ并å å
¥å°å®¹å¨ä¸
èªå¨é
置类è¦è½å è½½ï¼å¿
é¡»æéè¦èªå¨å¤¹æIDEç±»é
ç½®å¨å¨classpathä¸META-INFä¸çspring.factoriesä¸
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
â 3ã模å¼
å¯å¨å¨åªç¨æ¥åä¾èµå¯¼å ¥ï¼
ä¸é¨æ¥åä¸ä¸ªèªå¨é 置模åï¼
å¯å¨å¨ä¾èµèªå¨é ç½®ï¼å«äººåªéè¦å¼å ¥å¯å¨å¨ï¼Starterï¼
-mybatis-spring-boot-starterï¼èªå®ä¹å¯å¨å¨å-spring-boot-starterï¼
â 4ãå®ç°å¤§ä½æ¥éª¤ï¼
â 1ãå建空项ç®
â 2ãæ·»å æ°çModulesçmodel
â 3ãå¡«å好ModulesçGroupIdåArtifactid
â 4ãå建Spring InitializerçModulesï¼xxxx-spring-boot-starter-autoconfigerï¼ï¼ä¸éæ©ä»»ä½ç模åç¶åfinished
â 5ãå¨starterç项ç®ä¸çpomæ件ä¸å¼å ¥autoconfiger项ç®çä¾èµï¼ä½äºpomæ件ï¼
â 6ãå¨autoconfiger项ç®ä¸ååºå¦ä¸ä¿®æ¹ï¼
â å é¤åæç项ç®å¯å¨å¨åé ç½®æ件ï¼ä¸å æ件夹ï¼
â 7ãç¼åä½ çä¸å¡é»è¾å·²ç»propertiesæ对åºçé ç½®æ件类
â 8ãç¼åä¸ä¸ªxxxxxAutoConfigurationç±»ï¼å°ä½ çææä¸å¡é»è¾ç±»è£ é å°å®¹å¨ä¸
â 9ãå¨classpath:META-INF/spring.factoriesç±»ä¸ä¸é ç½®åºä½ å¾èªå¨é 置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.atguigu.starter.service.HelloServiceAutoConfiguration
â 10ãå°ä¸¤ä¸ªæ¨¡åå®è£ å°mavenä»åºä¸ä¾¿äºå¼ç¨ï¼å 为starterä¾èµäºxxxxautoconfigæ以ä¼å å®è£ xxxxautoconfigã
â 11ãæ¥ä¸æ¥å°±å¯ä»¥å»å ¶ä»ç¸ä¿¡éè¿å¼å ¥helloçstarteræ¥å¼ç¨helloserviceäº
ç»æï¼
â