美文网首页spring全家桶
springboot2.x & springcloud:入门篇

springboot2.x & springcloud:入门篇

作者: suxin1932 | 来源:发表于2019-02-17 09:51 被阅读0次

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进行配置文件加载
启动类.png @SpringBootApplication.png @EnableAutoConfiguration.png RedisAutoConfiguration.png

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}) 指定自动配置哪些类。
自定义starter工程结构.png

定义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命令, 打包到本地, 或上传到公司私服即可

mvn install.png

其他工程引用时
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(学习目录大全)

相关文章

网友评论

    本文标题:springboot2.x & springcloud:入门篇

    本文链接:https://www.haomeiwen.com/subject/tpaweqtx.html