https://start.spring.io/actuator/info (boot与cloud的对应关系)
1.springboot项目简介
1.1自动装配
1.1.1自动装配基本原理
1.SpringBoot启动会加载大量的自动配置类。
2.@EnableAutoConfiguration注解:
2.1其中的@AutoConfigurationPackage注解通过
@Import(AutoConfigurationPackages.Registrar.class)注解向IOC容器进行了bean的注入
2.2该注解也@Import(AutoConfigurationImportSelector.class)了AutoConfigurationImportSelector,
进而调用了
selectImports方法-->
getAutoConfigurationEntry方法-->
getCandidateConfigurations方法-->
SpringFactoriesLoader.loadFactoryNames方法-->通过SPI进行配置文件加载




1.1.2运用自动装配自定义starter
上述介绍了spring-boot自动配置的原理, 这里再次简述下:
1.SpringBoot 在启动时会去依赖的starter包中寻找 resources/META-INF/spring.factories 文件,
然后根据文件中配置的Jar包去扫描项目所依赖的Jar包,这类似于 Java 的 SPI 机制。
2.根据 spring.factories配置加载AutoConfigure类。
3.根据 @Conditional注解的条件,进行自动配置并将Bean注入Spring Context 上下文当中。
我们也可以使用@ImportAutoConfiguration({MyServiceAutoConfiguration.class}) 指定自动配置哪些类。

定义pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.starter</groupId>
<!-- Spring官方的Starter一般采取spring-boot-starter-{name} 的命名方式,
如 spring-boot-starter-web 。
而非官方的Starter,官方建议 artifactId 命名应遵循{name}-spring-boot-starter 的格式。
例如:ysc-spring-boot-starter -->
<artifactId>demo-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo-spring-boot-starter</name>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 作用是编译时生成 spring-configuration-metadata.json ,此文件主要给IDE使用 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>
</project>
服务类
package com.starter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* 编写我们的Service类
*/
public class DateUtils {
private String dateFormat;
public DateUtils(String dateFormat) {
this.dateFormat = dateFormat;
}
public String parseTime() {
return DateTimeFormatter.ofPattern(dateFormat).format(LocalDateTime.now());
}
}
配置文件读取类
package com.starter.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* 编写配置文件读取类
*/
@ConfigurationProperties("com.starter")
public class DemoServiceProperties {
private String dateFormat;
public String getDateFormat() {
return dateFormat;
}
public void setDateFormat(String dateFormat) {
this.dateFormat = dateFormat;
}
}
编写AutoConfigure类
package com.starter.config;
import com.starter.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 编写AutoConfigure类
*
* @ConditionalOnClass,当classpath下发现该类的情况下进行自动配置。
* @ConditionalOnMissingBean,当Spring Context中不存在该Bean时。
* @ConditionalOnProperty(prefix = "com.starter",value = "enabled",havingValue = "true"),当配置文件中com.starter.enabled=true时。
*
*/
@Configuration
@ConditionalOnClass(DateUtils.class)
@EnableConfigurationProperties(DemoServiceProperties.class)
public class DemoAutoConfigure {
@Autowired
private DemoServiceProperties properties;
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "com.starter", value = "enabled", havingValue = "true")
DateUtils starterService (){
return new DateUtils(properties.getDateFormat());
}
}
resources/META-INF/spring.factories 文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.starter.config.DemoAutoConfigure
定义好starter后,执行mvn install命令, 打包到本地, 或上传到公司私服即可

其他工程引用时
pom.xml
<dependency>
<groupId>com.starter</groupId>
<artifactId>demo-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
application.yml
com:
starter:
date-format: yyyyMMddHHmmss
enabled: true
@Autowired引入即可
package com.zy.netty;
import com.starter.DateUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootNettyDemoApplicationTests {
@Autowired
private DateUtils dateUtils;
@Test
public void contextLoads() {
System.out.println("----------------------------");
System.out.println(dateUtils.parseTime());
System.out.println("----------------------------");
}
}
SpringBoot中的所有@Conditional注解及作用
@ConditionalOnBean:当容器中有指定的Bean的条件下
@ConditionalOnClass:当类路径下有指定的类的条件下
@ConditionalOnExpression:基于SpEL表达式作为判断条件
[如:@ConditionalOnExpression("${mq.cumsumer.enabled}==1&&${rabbitmq.comsumer.enabled:true}&&'${mq.comsumer}'.equals('rabbitmq')")]
@ConditionalOnJava:基于JVM版本作为判断条件
@ConditionalOnJndi:在JNDI存在的条件下查找指定的位置
@ConditionalOnMissingBean:当容器中没有指定Bean的情况下
@ConditionalOnMissingClass:当类路径下没有指定的类的条件下
@ConditionalOnNotWebApplication:当前项目不是Web项目的条件下
@ConditionalOnProperty:指定的属性是否有指定的值
@ConditionalOnResource:类路径下是否有指定的资源
@ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者在有多个Bean的情况下,用来指定首选的Bean @ConditionalOnWebApplication:当前项目是Web项目的条件下
2.application.properties/yml配置文件
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties
https://www.cnblogs.com/niechen/p/9027804.html?utm_source=tuicool&utm_medium=referral (自动装配)
https://blog.csdn.net/qq_31463999/article/details/81628891
https://www.cnblogs.com/cowboys/p/9585452.html (自定义starter)
https://www.cnblogs.com/yuansc/p/9088212.html
https://www.jianshu.com/p/9a08417e4e84 (学习目录大全)
http://www.ityouknow.com/spring-cloud(学习目录大全)
网友评论