springboot

spring Boot

https://spring.io/

spring boot用于开发

spring cloud(云)用于管理微服务

特征

  • 创建独立的弹簧应用
  • 直接嵌入 Tomcat、Jetty 或底图(无需部署 WAR 文件)
  • 提供有意见的"启动器"依赖关系,以简化生成配置
  • 尽可能自动配置弹簧和第三方库
  • 提供生产就绪功能,如指标、运行状况检查和外部配置
  • 绝对没有代码生成,也没有 XML 配置要求

spring的理念是什么

spring是为了解决企业级应用开发的复杂性而创建的,简化开发!

什么是部署

1. 将源代码生成可运行的软件包,例如 jar 包或 war 包等;
2. 将可运行的软件包放到目标环境上;
3. 配置目标环境使得软件包能够运行起来;

在ssm项目中所有的依赖都是自己来管理的,在spring boot中这些依赖都是成套的不需要自己来管理

<!--    starter-prent里面包含boot所有的starter(启动器)-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.1</version>
    </parent>

可以自己去写starter

命名要求:

官方的:spring-boot-starter-name

第三方:name-spring-boot-starter

spring boot默认扫描规则

建议把主启动类放在需要扫描包的上层

注解

@SpringBootApplication:放在主启动类上面

Spring Boot Hello Word

导包

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>test</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

2.controller

package com.example.test.pojo.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

@Slf4j/*日志*/
@RestController/*@ResponseBody和@Controller的合并*/
@RequestMapping("/user")/*网页总地址*/
public class UserController {
    /*get请求就用@GetMapping  post请求就使用@PostMapping*/
    @GetMapping("/insert")
    public String hello(){
        return "hello";
    }
}

run

@SpringBootApplication
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

}

hello的探究

pom文件
 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

它的父项目是
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath>../../spring-boot-dependencies</relativePath>
    </parent>
它来真正的管理spring boot应用里面的依赖版本

spring boot版本的仲裁中心;

以后我们导入版本是不需要写版本号的(没有在dependencies中管理的自然要写版本号)

导入依赖(导入启动器)
        <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

spring-boot-starter-web

spring-boot-starter:springboot场景启动器;帮我们导入了web模块正常运行所依赖的组件;

spring boot 将所有的功能场景都抽取出来,做成一个一个的starter(启动器),只需要在这些项目引用这些starter相关场景的所有依赖都会导入进来,要用什么功能就导入什么场景的启动器

主程序,主入口类
package com.example.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

}

@SpringBootApplication翻译过来是springboot应用 标注在那个类上表示那个类springboot主配置类

spring boot就应该运行这个main方法来运行spring boot程序

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}

**@SpringBootConfiguration ** spring boot的配置类

​ 标注在某个类上,表示这是一个springboot的配置类

@Configuration配置类上来标注这个注解

​ 配置类--------配置文件

​ 配置类也是容器中的一个组件@Component

@EnableAutoConfiguration 开启自动配置功能

​ 以前我们需要配置的东西,spring boot帮我们自动配置;@EnableAutoConfiguration 告诉spring boot开启自动配置功能;这样自动配置才能生效;

@AutoConfigurationPackage :自动配置包
​ @lmport(AutoConfigurationPackages.Registrar.class) :
Spring的底层注解@lmport ,给容器中导入一个组件 ;导入的组件由AutoConfigurationPackages.Registrar.class ;

将主配置类( @SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;

EnableAutoConfigurationlmportSelector :导入哪些组件的选择器;
将所有需要导,入的组件以全类名的方式返回;这些组件就会被添加到容器中;
会给容器中导入非常多的自动配置类( xxxAutoConfiguration) ; 就是给容器中导入这个场景需要的所
有组件,并配置好这些组件;

有了自动配置类,免去了我们手动编写配置注入功能组件等的工作;
SpringFactoriesL oader.loadFactoryNames(EnableAutoConfiguration.lass,classLoader);
Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,
将这些值作为自动配置类导入到容器中,

自动配置类就生效,帮我们进行自动配置工作;以前我们需要自己配置的
东西,自动配置类都帮我们配置;

J2EE的整体整合解决方案和自动配置都在spring-boot- autoconfigure-1.5.9.RELEASE.jar

使用Spring Initializer快速创建Spring Boot项目

IDEA都支持使用Spring的项目创建向导快速创建一个Spring Boot项目;
选择我们需要的模块;向导会联网创建Spring Boot项目;

默认生成的Spring Boot项目;

  • 主程序已经生成好了,我们只需要我们自己的逻辑

  • resources文件夹中目录结构

  • static :保存所有的静态资源; js CSS images ;

  • templates :保存所有的模板页面; ( Spring Boot默认jar包使用嵌入式的Tomcat ,默认不支持]SP页
    面) ;可以使用模板引擎( freemarker, thymeleaf ) ;

  • application.properties : Spring Boot应用的配置文件;

spring boot配置

配置文件

spring boot使用全局的配置文件,配置文件名是固定的;

  • application.properties
  • application.yml

配置文件的作用:

修改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: 81

xml:

<server>
   <port>81</port>
</server>
YAML语法:

k: v 表示一对键值段(必要要有空格)

以空格来分层级关系,只要左对齐的一列数据都是同一个层级(下面示例)。

server:
    port: 80
    poth: /hello

属性和值也是大小写敏感:

值的写法
字面量:普通值(数字,字符串,布尔)

字符串默认不用加上单引号或者双引号;
“”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: “zhangsan \n lisi” :输出; zhangsan换行lisi

​ ":单引号;会转义特殊字符,特殊字符最终只是一 个普通的字符串数据
​ name: ‘zhangsan \n lis’ :输出; zhangsan \n lisi

对象和Map(属性和值)映射过来就是键值段

k: v在下一-行来写对象的属性和值的关系;注意缩进
对象还是k: v的方式

friends:
   lastName: zhangsan
   age: 20

行内写法:

friends: {  lastName: zhangsan,age: 20} 
数组(List, set);

用- 一个表示数组值

Animals
   - dog
   - cat

行内写法:

Animals: [dog,cat]
ConfigurationProperties注解

在application.yml实际操作:

导入文件处理器:配置文件处理就有提示了

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

@Component ->这个主键是容器组件,才能提供@ConfigurationProperties功能

@Data这个是一个引擎注解,自动生成set get方法和toString方法

@ConfigurationProperties(prefix = “person”) 告诉spring boot从配置文件哪里映射prefix从哪里开始

@Component
@Data
@ConfigurationProperties(prefix = "person")
public class Person {
    private String username;
    private Map<String,Object>map;
    private List<Object>list;
    private Date time;
    private Object[] array;
    private Dog dog;
}

yaml:

person:
  username: 王孟涛
  map: {k1: v1,k2: v2}
  list: 集合
  time: 2020/2/9
  array:
    - 数组1
    - 数组2
    - 数组3
  dog:
    username: 小杨
    age: 19

如果在application.properties中:

注意idea默认是以utf-8来编译的

如果乱码就设置

settings

File Encodings

设置成uft-8

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zs9VhMoN-1652497282926)(C:\Users\34912\Desktop\java 笔记\框架\img\1612839089063.png)]

person.username=小王
person.time=2020/07/12
person.array=array1
person.map.ke1=v1
person.map.ke2=v2
person.dog.username=小杨
person.dog.age=20
person.list=l1,l2,l3

@value和ConfigurationProperties注解的区别

 @Value("${username}")
    private String username;
  @Value("#{12+12}")
    private int age;
功能@ConfigurationProperties@value
特点批量注入配置文件的属性一个个指定
松散绑定 (松散语法)支持不支持
spEL(#{12+12})不支持支持
JSR303数据校验(@Validated)支持不支持
复杂类型的封装(map等)支持不支持

配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value ;
如果说,我们专门编写了- -个javaBean来和配置文件进行映射;

配置文件注入值数据校验
@Component
@Data
@Validated
@ConfigurationProperties(prefix = "person")
public class Person {
    @Email//取校验是不是收到的是邮箱信息
    private String username;
    private Map<String,Object>map;
    private List<Object>list;
    private Date time;
    private Object[] array;
    private Dog dog;
}
@PropertySource与@ImportResource

Property(性能)Source(来源)

@PropertySource(value = {“classpath:person.propeties”})加载指定配置文件

@PropertySource(value = {"classpath:person.propeties"})
@Component
@Data
@ConfigurationProperties(prefix = "person")
public class Person {

    private String username;
    private Map<String,Object>map;
    private List<Object>list;
    private Date time;
    private Object[] array;
    private Dog dog;
}

person.propertes的配置文件

person.username=小王
person.time=2020/07/12
person.array=array1
person.map.ke1=v1
person.map.ke2=v2
person.dog.username=小杨
person.dog.age=20
person.list=l1,l2,l3

@ImportResource

@ImportResource :导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别; .
想让Spring的配置文件生效,加载进来; @ImportResource标注在一个配置类 上

<?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.wang.springbootyaml.service.HelloService">

    </bean>
</beans>

主运行类上面

@ImportResource(locations = {"classpath:beans.xml"})
//导入spring的配置文件让他生效

spring boot 推荐给容器加组件的方式:

1.配置类==spring配置文件

/*
* @Configuration  指名当前类是一个配置类:就是用来替代之前的spring配置文件
* */
@Configuration
public class MyConfig {
    /*方法的返回值添加到对象中;容器中这组件默认id就是方法名*/
    @Bean
    public HelloService helloService(){
        System.out.println("配置类启动");
        return new HelloService();
    }

配置文件占位符

UUID(Universally Unique Identifier)全局唯一标识符,定义为一个字符串主键,采用32位数字组成,编码采用16进制,定义了在时间和空间都完全惟一的系统信息。

 #生成一个随机整数
 person.username=王${random.int}
 person.time=2020/07/12
 person.array=array1${random.uuid}
 person.map.ke1=v1
 person.map.ke2=v2
 person.dog.username=${person.username}小杨
#如果没有配置person.abc:12   :后面就是给的默认值  只会拼接不会相加   如果没有给默认值会报错
 person.dog.age=20 ${person.abc:12}
 person.list=l1,l2,l3

profile

多profile文件

我们在主配置文件编写的时候,文件名可以是 application-{profile}.porperties/yml

application.properties 默认情况使用这个配置文件

application-dev.properties

application-prod.properties

yml的配置方法
#默认是第一个的配置
#---这个是分割开每一个部分是独立的配置
#spring: profiles: dev  给这个配置取名字
server:
  port: 8080
spring:
  profiles:
    active: pord
---
server:
  port: 8081

spring:
  profiles: dev
---
server:
  port: 8082
spring:
  profiles: pord
激活profile
  1. 在配置文件中指定:
spring.profiles.active=prod
  1. 命令行:

​ --spring.profiles.active=prod

这个的优先级大于spring.profiles.active=prod

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jQYq7lvZ-1652497282928)(C:\Users\34912\Desktop\java 笔记\框架\img\1613093036559.png)]

cmd配置命令符

先打包打成packge

打包默认使用第一个配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fSOujpgN-1652497282928)(C:\Users\34912\Desktop\java 笔记\框架\img\1613093463294.png)]

虚拟机参数;

-Dspring.profiles.active=prod

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EPM0abze-1652497282929)(C:\Users\34912\Desktop\java 笔记\框架\img\1613093829099.png)]

配置文件加载位置

springboot启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置
文件
file…/config/
-file:./ .
-classpath:/config/
-classpath:/

优先级由高到低,改优先级的配置会覆盖低优先级

越在外面的配置,优先级越大,包括的东西也越多

spring boot会从这四个位置全部加载主配置文件,会出现一种状况互补配置

外部配置文件加载顺序

SpringBoot也可以从以下位置加载配置;优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会
形成互补配置

1.命令行参数

java -jar spring boot-02-config-02-0.0.1-SNAPSHOT.jar -server.port=8087 --server .context path=/abc

多个参数使用空格分开;–配置项=值

2.来自java:comp/env的JNDI属性
3.Java系统属性( System.getProperties() )
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值

由jar报外向jar包内寻找:

优先加载带profile的:

6.jar包外部的application-profile}.properties或application.ym(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件

在来加载不带profile的:

8.jar包外部的application.properties或application.ym(不带spring.profile)配置文件
9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10.@Configuration注解类.上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性

参考官方文档

自动装配的原理

配置文件到底写什么,怎么写,自动装配原理

配置文件能配置的属性参照

自动配置原理:

  1. spring boot 启动时,加载主配置类,开启自动配置功能 @EnableAutoConfiguration
  2. @EnableAutoConfiguration作用:
  • ​ 利用 AutoConfigurationImportSelector给容器导入一些组件,
  • ​ 可以插件selectImports()方法的内容;
  • ​ List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置

​ SpringFactoriesLoader.loadFactoryNames() 它是

​ 扫描类路径下jar包类路径下的 META-INF/spring.factories

​ 把扫描到的这些文件的内容包装成properties对象

​ 从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中

将类路径下的META-INF/spring.factories里面使有的配置EnableAutoConfiguration的值加入到容器中,

# Auto Configure
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.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
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.CassandraReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\
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.ElasticsearchRestClientAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
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.http.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\
org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\
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.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\
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.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\
org.springframework.boot.autoconfigure.r2dbc.R2dbcTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\
org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\
org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\
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.client.RestTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration

每一个这样的xxxAutoConfiguration类都是容器中的- 一个组件,都加入到容器中;用他们来做自动配置;

每一个自动配置类进行自动配置功能;

以**HttpEncodingAutoConfiguration(http编码自动配置)**为例解释自动配置原理;

@Configuration //表示这是一 一个配置类,以前编写的配置文件一样,也可以给容器中添加组件
@EnableConfigurationProperties (HttpEncodingProperties.class) //启动指定类的ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;并把HttpEncodingProperties加入到ioc容器中

@ConditionalOnWebApplication //Spr ing底层@Conditional注解( Spring注解版), 根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效;判断当前应 用是否是web应用,如果是,当前配置类生效

@ConditionalOnClass (CharacterEncodingFilter.class) //判断当前项目有没有这个类CharacterEncodingFilter ; SpringMVC中进行乱码解决的过滤器; 

@ConditionalOnProperty(prefix = "spring. http. encoding", value = "enabled",matchIfMissing =true) //判断配置文件中是否存在某个配置 spring . http. encoding . enabled ;如果不存在,判断也是成立的
//即使我们配置文件中不配置pring . http. encoding. enabled=true,也是默认生效的; 
public class HttpEncodingAutoConfiguration {
    
    //他已经和SpringBoot的配置文件映射了
private final HttpEncodingProperties properties;
//只有一一个有参构造器的情况下,参数的值就会从容器中拿
public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
this.properties = properties;
}
@Bean
//给容器中添加一一个组件,这个组件的某些值需要从properties中获取
@ConditionalOnMissingBean(CharacterEncodingFilter.class)
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类中封装者’;配置文件能配置什么就可以参照某个功
能对应的这个属性类

@ConfigurationProperties(prefix = "spring. http. encoding") //从配置文件中获取指定的值和bean的属性
进行绑定
public class HttpEncodingProperties {
public static final Charset DEFAULT CHARSET = Charset. forName("UTF-8");

精髓:

1)、SpringBoot启动会加载大量的自动配置类

2)、我们看我们需要的功能有没有SpringBoot默认写好的自动配置类;

3)、我们再来看这个自动配置类中到底配置了哪些组件; (只要我们要用的组件有,我们就不需要再来配置了)

4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值;

xxxxAutoConfigurartion :自动配置类;

给容器中添加组件

xxxxProperties:封装配置文件中相关属性;

细节

1、@Conditional派生注解 ( Spring注解版原生的@Conditional作用)

作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;

条件注解对应的Condition 处理类处理逻辑
@ConditionalOnBeanOnBeanConditionSpring容器中是否存在对应的实例。可以通过实例的类型、类名、注解、昵称去容器中查找(可以配置从当前容器中查找或者父容器中查找或者两者一起查找)
@ConditionalOnClassOnClassCondition类加载器中是否存在对应的类。可以通过Class指定(value属性)或者Class的全名指定(name属性)如果是多个类或者多个类名的话,关系是”与”关系,也就是说这些类或者类名都必须同时在类加载器中存在
@ConditionalOnExpressionOnExpressionCondition判断SpEL 表达式是否成立
@ConditionalOnMissingBeanOnBeanConditionSpring容器中是否缺少对应的实例。可以通过实例的类型、类名、注解、昵称去容器中查找(可以配置从当前容器中查找或者父容器中查找或者两者一起查找)
@ConditionalOnMissingClassOnClassCondition跟ConditionalOnClass的处理逻辑一样,只是条件相反,在类加载器中不存在对应的类
@ConditionalOnPropertyOnPropertyCondition应用环境中的屬性是否存在。提供prefix、name、havingValue以及matchIfMissing属性。prefix表示属性名的前缀,name是属性名,havingValue是具体的属性值,matchIfMissing是个boolean值,如果属性不存在,这个matchIfMissing为true的话,会继续验证下去,否则属性不存在的话直接就相当于匹配不成功
@ConditionalOnResourceOnResourceCondition是否存在指定的资源文件。只有一个属性resources,是个String数组。会从类加载器中去查询对应的资源文件是否存在
@ConditionalOnSingleCandidateOnBeanConditionSpring容器中是否存在且只存在一个对应的实例。只有3个属性value、type、search。跟ConditionalOnBean中的这3种属性值意义一样
@ConditionalOnWebApplicationOnWebApplicationCondition应用程序是否是Web程序,没有提供属性,只是一个标识。会从判断Web程序特有的类是否存在,环境是否是Servlet环境,容器是否是Web容器等

自动配置必须要在一定环境下才会生效

​ 我怎么才能知道那些自动配置类生效

​ 在配置中启用debug=true属性;来让控制台来打印自动配置报告,

CONDITIONS EVALUATION REPORT
============================


Positive matches:(匹配成功)
-----------------

   AopAutoConfiguration matched:
      - @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)

   AopAutoConfiguration.ClassProxyingConfiguration matched:
      - @ConditionalOnMissingClass did not find unwanted class 'org.aspectj.weaver.Advice' (OnClassCondition)
      - @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)
          
          
                                        
Negative matches:(没有匹配成功)
-----------------

   ActiveMQAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)

   AopAutoConfiguration.AspectJAutoProxyingConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required class 'org.aspectj.weaver.Advice' (OnClassCondition)


日志

市面上的日志框架;

JUL、JCL、Jboss-logging. logback. log4j、 log4j2、 s4…

日志门面(日志的抽象层)日志实现
JCL ( Jakarta Commons Logging) SLF4j ( Simple LoggingFacade for Java ) jboss-loggingLog4j JUL ( java.util.logging ) Log4j2 Logback

左边选一个门面(抽象层)、右边来选一个实现;

日志门面: SLF4J ;

日志实现: Logback ;

SpringBoot :底层是Spring框架, Spring框架默认是用JCL ;

SpringBoot选用SLF4j和logback ;

SLF4j使用

1. 如何在系统中使用SLF4j

以后开发的时候,日志记录方法的调用,不应该来直接调用日志对方的实现类,而是调用日志抽象层里面的方法;给系统里面导入slf4j和jar和 logback的实现jar

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");
  }
}

图示:导包需要

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tVBzca0c-1652497282930)(C:\Users\34912\Desktop\java 笔记\框架\img\concrete-bindings.png)]

每一个日志的实现框架都有自己的配置文件。使用slf4j以后 ,配置文件还是做成日志实现框架的配置文件;

2.遗留问题

如何统一使用SLF4J

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HY9ixCAn-1652497282930)(C:\Users\34912\Desktop\java 笔记\框架\img\legacy.png)]

如何让系统中所有的日志都统一到sIf4j ;

1、将系统中其他日志框架先排除出去;

2、用中间包来替换原有的日志框架;

3、我们导入slf4j其他的实现

spring boot 日志关系
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

spring boot 使用它来做日志功能

  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-logging</artifactId>
      <version>2.4.2</version>
      <scope>compile</scope>
    </dependency>

底层依赖关系:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZF6FSR7X-1652497282931)(C:\Users\34912\Desktop\java 笔记\框架\img\image-20210222103236118.png)]

总结:

1 )、SpringBoot底层也是使用slf4j+logback的方式进行日志记录

2)、SpringBoot也把其他的日志都替换成了slf4j ;

3)、中间替换包?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Vn9p6Ze-1652497282931)(C:\Users\34912\Desktop\java 笔记\框架\img\image-20210222105113976.png)]

如果我们要引入其他框架?-定要把这个框架的默认日志依赖移除掉?
Spring框架用的是commons-logging ;

                <dependency>
                     <groupId>org. springfr amework</ groupId>
                     <artifactId> spring-core</artifactId>
                     <exclusions>
                          <exclusion>
                               <groupId> commons-logging</groupId>
                               < artifactId> commons- logging</artifactId>
                          </exclusion>
                      </exclusions>
                </dependency>


SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只

需要把这个框架依赖的日志框架排除掉;

日志使用

@RunWith(SpringRunner.class)
@SpringBootApplication
public class SpringBootLoggingApplication {
        Logger logger = LoggerFactory.getLogger(getClass());
        //日志级别
        //从低到高 trace<debug<info<warn<error
        //可以调节日志的输出级别
        @Test
                public void test(){
                logger.trace("这是trace");
                logger.debug("这是debug");
                logger.info("这是info");
                logger.warn("这是warn");
                logger.error("这是error");
        }
}

logging.level.com.wang=warn
#不指定路径在本项目中生成日志
#指定路径在路径下生成日志
#logging.file=D:/spring.log
#指定路径
logging.path=spring/log
#设置文件的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-51eve1 === %logger{50} ==== %msg%n

日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level :级别从左显示5个字符宽度
%logger{50}表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符

你可以用thymeleaf 用这个引擎在做,类似jsp 但是比jsp好很多,直接就可以在网页运行,不需要tomcat

但是又一些语法

如:th:text

th:href

th:src

很多,thymeleaf官网有介绍,你明天可以试试这个引擎,

动态的要建立在temp这个文件夹下面,不然spring Boot 找不到,static这个是css js sass less 图片等静态类容放的文件夹!欧克我还是先学springboot学完了在学这些东西,把 css js 可以学, less sass 不用,学多了装不下,容易忘,




SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只

需要把这个框架依赖的日志框架排除掉;





## 日志使用

```java
@RunWith(SpringRunner.class)
@SpringBootApplication
public class SpringBootLoggingApplication {
        Logger logger = LoggerFactory.getLogger(getClass());
        //日志级别
        //从低到高 trace<debug<info<warn<error
        //可以调节日志的输出级别
        @Test
                public void test(){
                logger.trace("这是trace");
                logger.debug("这是debug");
                logger.info("这是info");
                logger.warn("这是warn");
                logger.error("这是error");
        }
}

logging.level.com.wang=warn
#不指定路径在本项目中生成日志
#指定路径在路径下生成日志
#logging.file=D:/spring.log
#指定路径
logging.path=spring/log
#设置文件的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-51eve1 === %logger{50} ==== %msg%n

日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level :级别从左显示5个字符宽度
%logger{50}表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符

你可以用thymeleaf 用这个引擎在做,类似jsp 但是比jsp好很多,直接就可以在网页运行,不需要tomcat

但是又一些语法

如:th:text

th:href

th:src

很多,thymeleaf官网有介绍,你明天可以试试这个引擎,

动态的要建立在temp这个文件夹下面,不然spring Boot 找不到,static这个是css js sass less 图片等静态类容放的文件夹!欧克我还是先学springboot学完了在学这些东西,把 css js 可以学, less sass 不用,学多了装不下,容易忘,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值