SpringBoot基础的使用

SpringBoot | 详解SpringBoot配置文件及其原理 目录 一、配置文件 二、YAML语法 1、基本语法 2、值的写法 (1)、字面量:普通的值(数字,字符串,布尔) (2)、对象、Map(属性和值) (3)、数组(List、Set) 三、配置文件值注入 1、一个简单的示例 2、@Value获取值和@ConfigurationProperties获取值比较 3、数据校验 4、使用@PropertySource加载指定的配... 阅读详情

SpringBoot基础的使用

springboot的基础使用 和 内部原理

高级使用整合

进行web开发

 

springboot  

看下spring的所有项目:https://spring.io/projects

 

等等 就不一一介绍了

 

springboot 就是整合spring的一系列技术栈 进行简化 企业级开发

springboot 自动配置好相关的环境。用户可以使用封装好的框架进行开发

 

 

Spring全家桶”时代:   Spring Boot  J2EE一站式解决方案、Spring Cloud  分布式整体解决方案

 

优点:
– 快速创建独立运行的Spring项目以及与主流框架集成
– 使用嵌入式的Servlet容器,应用无需打成WAR包
– starters自动依赖与版本控制
– 大量的自动配置,简化开发,也可修改默认值
– 无需配置XML,无代码生成,开箱即用
– 准生产环境的运行时应用监控
– 与云计算的天然集成

 

微服务  一个应用是一组小服务  可以通过http方式进行互通

 

spring的技术栈架构:

   Springboot  -- >  spring cloud -->  spring cloud data flow

 

 

博主的环境是 jdk8  maven3.0   idea2018


 

给maven的settings配置文件中的profiles标签添加属性:

 

那如何设置默认使用JDK1.8呢? 
  在settings文件中配置即可。具体代码如下:

<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.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>  
</properties>
</profile>

 

创建一个maven工程

 导入springboot相关的依赖

 

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
</parent>
导入spring boot的依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

 

主程序:

 

@SpringBootApplication
public class HelloWorldApp {
    public static void main(String[] args) {
        SpringApplication.run(HelloWorldApp.class);
    }
}

控制层:

@Controller
public class HelloController {

    @ResponseBody
    @RequestMapping
    public String hello(){
        return "hello Toov5";
    }
}

 

http://localhost:8080/

 

 如何进行部署呢?

   导入springboot的maven插件

作用: 将应用打包成一个可执行的jar包。 将这个应用大成jar包,直接使用java - jar命令进行

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

 

通过生命周期进行打包:

 

 package:

 

 配置的maven插件 spring-boot-maven-plugin 介入

target:

 

 将其复制出来:

 

 运行:

通过java -jar 运行

 

打开那个jar包:

 

 BOOT-INF 目录:

lib 就是springboot等依赖jar包 并携带了嵌入式tomcatjar包

 

 classes:

 

 

原理:

pom:

 作为依赖管理的 有很多依赖的 整理好了

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>

 

 点击进入这个父项目还是依赖一个父项目的,真正管理spring boot应用里面的所有依赖版本呢

以后我们导入依赖默认是不需要写版本的

 

出来父项目还有一个依赖

<artifactId>spring-boot-starter-web</artifactId>

点击进入:

可以看到好多依赖:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
    </dependencies>

帮我们导入了web模块正常运行所依赖的组件

 

当然spring boot里面还有更多的这样的 Starters 好多的启动器

官网列表参考: https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#using-boot-starter

springboot 将所有的功能场景 抽取出来 做成一个个的starters,只需要根据场景功能依赖导入。

 

 

关于主程序的入口类:


 

@SpringBootApplication

 spring boot启动运行这个类的main方法

 

这是个组合注解:

  

@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}
)}
)
public @interface SpringBootApplication {

 

@EnableAutoConfiguration : 开启自动配置

以前我们需要配置的,Spring Boot帮我们自动实现配置

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage: 自动配置包
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})  //spring 的底层注解
public @interface AutoConfigurationPackage {
}
@Import({Registrar.class})  给容器中导入一个组件,导入的组件由 Registrar.class
 @Order(-2147483648)
    static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
        Registrar() {
        }

        public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {    //注册一些bean定义信息
            AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
        }

        public Set<Object> determineImports(AnnotationMetadata metadata) {   //注解标注的元信息
            return Collections.singleton(new AutoConfigurationPackages.PackageImport(metadata));
        }
    }

打个断点运行下:

可以看到注解的元信息!

选中并且计算:

@AutoConfigurationPackage: 的作用是 将主配置类的所在包以及下面的所有的组件扫描到Spring容器
 
关于@Import的注解
@Import(EnableAutoConfigurationImportSelector.class)
给容器中导入一些组件
EnableAutoConfigurationImportSelector: 导入哪些组件选择器

类代码就只有一个方法:
@Deprecated
public class EnableAutoConfigurationImportSelector
        extends AutoConfigurationImportSelector {

    @Override
    protected boolean isEnabled(AnnotationMetadata metadata) {
        if (getClass().equals(EnableAutoConfigurationImportSelector.class)) {
            return getEnvironment().getProperty(
                    EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY, Boolean.class,
                    true);
        }
        return true;
    }

点击进入:

父类有个方法:

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
   if (!isEnabled(annotationMetadata)) {
      return NO_IMPORTS;
   }

Spring容器到底要导入哪些组件,以Spring 数组的方式返回组件的全类名,这些组件就会被添加到容器中

打个断点看下

可以看到一共有96个组件

会给容器中 导入非常多的自动配置类(xxAutoConfiguration),就是给容器中导入这个场景所需要的所有组件,并配置好这些组件。

有了自动配置类,就免去了手动编写配置和注入功能组件等工作

 

主要原因是调用了这个方法:

然后;

然后:

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
        String factoryClassName = factoryClass.getName();
        try {
            Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :    //用类加载器获取资源
                    ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
            List<String> result = new ArrayList<String>();
            while (urls.hasMoreElements()) {
                URL url = urls.nextElement();
                Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));   //把这个资源当成properties文件
                String factoryClassNames = properties.getProperty(factoryClassName);   //获取到工厂的名字
                result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
            }
            return result;
        }
        catch (IOException ex) {
            throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
                    "] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
        }
    }

 

位置信息:

catch (IOException ex) {
            throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
                    "] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
        }

持续点击:

public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

从类路径下获取EnableAutoConfituration指定的值

 

 

 这些就是导入的自动配置类。

总结: Spring Boot启动的时候从类路径下的 META-INF/spring.factories中获取EnableConfiguration指定的值,将这些值作为自动配置类导入到容器中。自动配置类就生效了,帮我们进行自动配置工作。


我们现在用的是web应用想关的

点击进入

 

 

@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class,
        WebMvcConfigurerAdapter.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
        ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {

    public static final String DEFAULT_PREFIX = "";

    public static final String DEFAULT_SUFFIX = "";
 
    @Bean    //给容器添加一个组件
    @ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
    public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
        return new OrderedHiddenHttpMethodFilter();
    }

    @Bean
    @ConditionalOnMissingBean(HttpPutFormContentFilter.class)
    @ConditionalOnProperty(prefix = "spring.mvc.formcontent.putfilter", name = "enabled", matchIfMissing = true)
    public OrderedHttpPutFormContentFilter httpPutFormContentFilter() {
        return new OrderedHttpPutFormContentFilter();
    }

    // Defined as a nested config to ensure WebMvcConfigurerAdapter is not read when not
    // on the classpath
    @Configuration
    @Import(EnableWebMvcConfiguration.class)
    @EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })
    public static class WebMvcAutoConfigurationAdapter extends WebMvcConfigurerAdapter {

        private static final Log logger = LogFactory
                .getLog(WebMvcConfigurerAdapter.class);

        private final ResourceProperties resourceProperties;

        private final WebMvcProperties mvcProperties;

        private final ListableBeanFactory beanFactory;

        private final HttpMessageConverters messageConverters;

        final ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer;

        public WebMvcAutoConfigurationAdapter(ResourceProperties resourceProperties,
                WebMvcProperties mvcProperties, ListableBeanFactory beanFactory,
                @Lazy HttpMessageConverters messageConverters,
                ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider) {
            this.resourceProperties = resourceProperties;
            this.mvcProperties = mvcProperties;
            this.beanFactory = beanFactory;
            this.messageConverters = messageConverters;
            this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider
                    .getIfAvailable();
        }

        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            converters.addAll(this.messageConverters.getConverters());
        }

以前我们需要自己配置的组件,自动配置类都帮我们配置了。

SpringBoot 对所有J2EE的大整合

所有解决方案都在这里摆着,自动配置都在这个包里面:

如果不满意我们还可以自己修改这些配置

 

 

使用IDEA可以使用创建向导快速创建Spring boot项目,大家可以自行百度查找教程。

 

注意Spring Boot 默认jar包使用嵌入式的Tomcat,默认不支持JSP页面

 

Spring Boot默认一切都是配置好的

可以通过配置文件进行修改,比如端口号之类的:  server.port=8089

 

配置文件:

SpringBoot使用一个全局的配置文件,配置文件名是固定的;
•application.properties
•application.yml

配置文件的作用:Spring Boot在底层都给我们配置好了。修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;

 

yml语法:

k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的

 

 左边能对齐的都是一个层级的

server:
    port: 8081
    path: /hello

 

 注意 属性和值都是大小写敏感的! 玩的是空格!

 

值的写法
字面量:普通的值(数字,字符串,布尔)
k: v:字面直接来写;
字符串默认不用加上单引号或者双引号;
"":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: "zhangsan \n lisi":输出;zhangsan 换行 lisi
'':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi

这些值最终都会被封装到Java Bean来进行获取

类型:

对象(属性和值) 也就是键值对

数组 list set

 

 

对象或者Map(属性和值)(键值对):
k: v:在下一行来写对象的属性和值的关系;注意缩进
对象还是k: v的方式

 

friends:
    lastName: zhangsan        
    age: 20 

行内写法

  friends: {lastName: zhangsan,age: 18}

 

 

数组(List、Set):
用- 值表示数组中的一个元素

 

pets:
 ‐ cat
 ‐ dog
 ‐ pig

行内写法

pets: [cat,dog,pig]

格式对应好了,鼠标点击上去时候会有显示:

 

 

将配置文件中配置的每一个属性的值,映射到这个组件中

 yml:

server:
  port: 8088

person:
  lastName: zhangsan
  age: 18
  boss: false
  birth: 2019/12/12
  maps: {kye1: value1,k2: 12}
  lists:
   - joe
   - jack
  dog:
    name: java
    age: 36

 

 Bean: 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能。

@Component
@ConfigurationProperties(prefix = "person")  //这个配置类中的属性都是 配置文件中的属性 相关属性绑定
public class Person {

    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getBoss() {
        return boss;
    }

    public void setBoss(Boolean boss) {
        this.boss = boss;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "lastName='" + lastName + '\'' +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

 

 一直在提示:

  打开之

  提示:

 

You can easily generate your own configuration metadata file from items annotated with @ConfigurationProperties by using the spring-boot-configuration-processor jar. The jar includes a Java annotation processor which is invoked as your project is compiled. To use the processor, include a dependency on spring-boot-configuration-processor.

 帮我们生成一些配置文件的元数据信息

With Maven the dependency should be declared as optional, as shown in the following example:

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

导入配置文件处理器,配置文件进行绑定就会有提示

 

 

测试

/**
 * 单元测试 SpringRunner 是spring提供的驱动器跑 而不是Junit
 * 可以在测试期间很方便的类似编码一样进行自动注入等
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootApplicationTests {
    @Autowired
    Person person;
    @Test
    public void contextLoads() {
        System.out.println(person);
    }

}

 打印:

可以看到值都可以获取到

 

idea默认使用的properties使用的是utf-8编码,而properties需要的是ascii码 。idea需要进行设置编码转换

 

 

另外的获取值的方式:

    @Value

注意 #{SpEL} 是Spring表达式  @value 和 xml配置的bean属性都可以 使用这个表达式

Bean: 注释掉自动配置的注解  @ConfigurationProperties(prefix = "person")  

@Component
//@ConfigurationProperties(prefix = "person")  //这个配置类中的属性都是 配置文件中的属性 相关属性绑定
public class Person {
    /**
     * <bean class="Person">
     *      <property name="lastName" value="Toov5Java"></property>
     *     </bean>
     */
    @Value("${person.last-name}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age;
    @Value("true")
    private Boolean boss;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getBoss() {
        return boss;
    }

    public void setBoss(Boolean boss) {
        this.boss = boss;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "lastName='" + lastName + '\'' +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

 

运行:

 

可以看出 可以一一对应
但是 如果用注解的话 一统绑定


@Value获取值和@ConfigurationProperties获取值比较

    

 

 配置文件yml还是properties他们都能获取到值;

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

 

@Validated
@Component
@ConfigurationProperties(prefix = "person")  //这个配置类中的属性都是 配置文件中的属性 相关属性绑定
public class Person {
    /**
     * <bean class="Person">
     *      <property name="lastName" value="Toov5Java"></property>
     *     </bean>
     */
    @Email
    @Value("${person.last-name}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age;
    @Value("true")
    private Boolean boss;
    private Date birth;

 

通过@Value 获取 配置文件中的 map 是获取不到的

 

另外的绑定数值相关的注解:

   1)@PropertySource

   2)@ImportResource&@Bean

 

1) @PropertySource 加载指定的配置文件;

   注意:

@ConfigurationProperties(prefix = "person")  默认是从全局配置文件中获取值

如果项目很大,所有配置文件都放在一个配置文件中,就很复杂了。

如果写一个与Spring boot无关的配置文件  需要声明引入之

person.properties:

person.last-name=toov5Java
person.age=18
person.birth=2019/3/4
person.boss=false
person.maps.k1=v1
person.maps..k2=23
person.lists=a,b,c
person.dog.name=lovely
person.dog.age=2

 

测试:

 

 2)@ImportResource: 导入Spring的配置文件,让配置文件里面的内容生效

   

我们在spring boot项目里面配置xml:

<?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="helloToov5" class="com.toov5.Bean.HelloToov5"></bean>
</beans>

 

在ioc容器中是没有这个bean的!

 

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

 

标记在我们项目中的主配置类上面

@ImportResource(locations = "classpath:beans.xml")   //导入Spring的配置文件让其生效
@SpringBootApplication
public class SpringbootApplication {

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

}

 

运行:

 

 springboot不推荐上面的方式,推荐如下:

   给容器添加组件,需要配置类:

@Configuration  //指明当前类是个配置类 代替spring的配置文件<bean
public class MyAppConfig {

    //将方法的返回值添加到容器中;容器中这个组件默认的id 就是方法名字
    @Bean
    public HelloToov5 helloToov5(){  //ioc中注册的名字与方法名字有关!!
        System.out.println("容器添加了组件HelloToov5");
         return new HelloToov5();
    }

}

Bean的组件:

public class HelloToov5 {
}

 

  不通过xml了,通过全注解的方式

 

 

 关于配置文件的占位符:

  博主在开发时候,在url拼接时候经常使用奥。

  1、随机数

 

${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}

 

2、占位符获取之前配置的值,如果没有可以是用:指定默认值

 

person.last‐name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15

 

 

Bean:

@Component
//@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")  //这个配置类中的属性都是 配置文件中的属性 相关属性绑定
public class Person {

    @Value("${person.last-name}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age;
    @Value("true")
    private Boolean boss;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getBoss() {
        return boss;
    }

    public void setBoss(Boolean boss) {
        this.boss = boss;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "lastName='" + lastName + '\'' +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

运行结果:

2019-04-21 10:43:41.664  INFO 12396 --- [           main] c.t.s.SpringbootApplicationTests         : Starting SpringbootApplicationTests on RE5RLZUU8MPSW7A with PID 12396 (started by Administrator in D:\eclipse_pj\foodProject\springboot)
2019-04-21 10:43:41.665  INFO 12396 --- [           main] c.t.s.SpringbootApplicationTests         : No active profile set, falling back to default profiles: default
容器添加了组件HelloToov5
2019-04-21 10:43:43.730  INFO 12396 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-04-21 10:43:44.038  INFO 12396 --- [           main] c.t.s.SpringbootApplicationTests         : Started SpringbootApplicationTests in 2.762 seconds (JVM running for 3.895)
Person{lastName='toov540738455-ecc8-4efa-9874-bd7a2504d87a}', age=-208365648, boss=false, birth=Mon Mar 04 00:00:00 CST 2019, maps={k1=v1, k2=23}, lists=[a, b, c], dog=Dog{name='toov5a34d8625-3715-4d17-8ccb-8617f68e13ef}_lovely', age=18}}
2019-04-21 10:43:44.266  INFO 12396 --- [       Thread-2] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

 

总结: 占位符获取之前配置的值,如果没有可以是用:指定默认值

 比如:

 

 

 

 

 Profile


 

 1)多Profile文件

我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties 或者是 yml
默认使用application.properties的配置;

启动后默认:

如何激活:
方式一:

运行结果:

 

方式二 是对于yml支持多文档块方式,不用写多个环境下的 properties 配置文件了,一个就可以搞定

 ”---“  是yml特有的文档块标记   document1  document2...

 

 1)在配置文件中指定 spring.profiles.active=dev

server:
  port: 8088
spring:
  profiles:
    active: dev

---
server:
  port: 6666
spring:
  profiles: dev

---
server:
  port: 777
spring:
  profiles: prod

 

 激活指定yml的profile

 

2)虚拟机参数;
 

server:
  port: 8088
spring:
  profiles:
    active: dev

---
server:
  port: 6666
spring:
  profiles: dev

---
server:
  port: 777
spring:
  profiles: prod

3) 虚拟机参数方式

4) jar包 命令行方式运行:

java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
可以直接在测试的时候,配置传入命令行参数

 

 

 关于SpringBoot配置文件加载位置


 

 

springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文
件
–file:./config/
–file:./      (当前项目根目录)
–classpath:/config/
–classpath:/
四个位置优先级由高到底,高优先级的配置会覆盖低优先级的配置;

测试:

启动打印:

 根目录下的测试:

 

启动:

根目录下的 config文件夹下的优先级是最高的:

配置文件:

结果:

 

总结:

配置文件可以放在此位置,也可以指定位置。

 

小结:

SpringBoot会从这四个位置全部加载主配置文件(高低优先级都会加载的);互补配置;
我们还可以通过spring.config.location来改变默认的配置文件位置
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默
认加载的这些配置文件共同起作用形成互补配置;
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties

 

 通过高优先级覆盖一部分内容:

随便写一个controller:

@RestController
public class Hello {

    @RequestMapping("/hello")
    public String hello(){
        return "hello Toov5 file!";
    }
}

 

按照上面所述的,在项目 config 目录下面配置访问路径:

启动后访问:

 

 

 高优先级配置部分内容,低优先级配置全部内容的思想

 

运维常用:

还可以通过spring.config.location 修改默认的配置文件位置,打成jar包后 仅仅修改一部分内容 内容配置文件在 :G:/application.properties

    java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties

其他的配置可以不变哦~

 

Spring boot外部配置文件的加载顺序,有很多种

 参考:https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config

 

总结: 按照优先级从高到低,高优先级的配置覆盖低优先级的配置。配置之间形成互补。

1. 命令行参数
2. 来自java:comp/env的JNDI属性
3. Java系统属性(System.getProperties())
4. 操作系统环境变量
5. RandomValuePropertySource配置的random.*属性值
6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10. @Configuration注解类上的@PropertySource
11. 通过SpringApplication.setDefaultProperties指定的默认属性

 

1 配置可以放在命令行参数上,打包后访问。 打包只涉及到:

符合maven工程规范

  

 其余的不打包。

 打包后执行:

所有的配置都可以在命令行上进行指定 (有几个参数 添加几个,多个配置用空格分开)
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar  --server.port=8087 --server.context-path=/abc  

如果太多就不合适了

专门写一个配置文件  写在jar包外面

不用输入任何参数

 

注意:

  优先加载带profile的

  再加载不带profile的 

 

所有支持的配置加载来源有很多,可以参考官方文档:https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config

 

关于自动配置原理:https://www.cnblogs.com/toov5/p/10728261.html

 

posted @ 2019-04-21 00:52 toov5 阅读(...) 评论(...) 编辑 收藏

SpringBoot系列:Spring Boot集成Spring Cache,使用EhCache 其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。Kafka入门为什么选择KafkaKafka的安装、管理和配置。 阅读详情

相关推荐

springBoot 入门(二)—— 使用 spring.profiles.active来区分配置

背景 很多时候,我们项目在开发环境和生成环境的环境配置是不一样的,例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据,这时候,我们可以利用profile在不同的环境下配置用不同的配置文件或者不同的配置。 spring boot 提供 spring boot允许你通过命名约定按照一定的格式(application-{profile}.propert...

15万+

SpringBoot配置文件中spring.profiles.active配置详解

SpringBoot配置文件中spring.profiles.active配置详解 1、多环境配置 我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。 对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring

南瓜的博客 8万+

自动驾驶仿真:Carsim、NI和VTD联合仿真课题二

文章目录前言一、设备配置1、硬件需求2、网络配置二、Carsim工程配置1、创建工程2、创建数据库3、参数配置三、VTD工程配置1、创建工程四、Veristand工程配置1、创建工程五、运行程序 前言 上篇文章《Carsim、NI和VTD联合仿真课题一》简单地介绍了三者之间的联合框架,以及NI与VTD之间简单的组包与拆包指导。这篇文章将要讲述的是如何将三个软件联合起来,如何设置软件参数,用最简单的方法把仿真车开起来。 一、设备配置 1、硬件需求 注:真正的做智能驾驶仿真项目,至少需要两台电脑,一台实时机

zataji的博客 1万+

【java】SpringBoot 项目指定配置环境: -Dspring.profiles.active=dev 与 --spring.profiles.active=dev 选哪个?

`-Dspring.profiles.active=dev` 指定的环境变量不起作用?`Dspring.profiles.active=dev` 与 `--spring.profiles.active=dev·`选哪个?在Spring-Boot 项目启动时,推荐使用 `--` ,如 `--spring.profiles.active=dev`

小子宝丁的博客 4844

两相变频交错PFC实战:从论文理论到PSIM仿真的完整避坑指南

本文详细解析了两相变频交错PFC技术从理论到PSIM仿真的完整实现过程,特别针对CRM模式下的BOOST PFC设计挑战提供实用解决方案。涵盖周期值比较法与RS触发器法的对比实施、PSIM仿真中的过零处理与收敛性优化等核心问题,并给出硬件实现的进阶建议,助力工程师高效完成高功率密度PFC设计。

weixin_30632089的博客 422

C++/WinRT入门指南:现代Windows原生开发的核心技术

Windows运行时(WinRT)是微软为现代Windows应用开发设计的一套跨语言API框架,它基于COM技术原理构建,提供了统一的二进制接口标准。这项技术的核心价值在于让开发者能够以原生性能调用系统级功能,同时保持跨语言兼容性。在工程实践中,C++/WinRT作为官方推荐的C++语言投影,通过标准C++语法封装WinRT API,显著降低了开发复杂度。特别是在异步编程场景中,结合C++20协程特性,能够大幅提升代码可读性和维护性。对于需要高性能图形处理、系统集成或跨平台兼容的桌面应用开发,掌握C++/W

weixin_33910191的博客 1198

spirng boot使用spring.profiles.active=dev运行,Bee自动选择active对应的配置文件

【代码】spirng boot使用spring.profiles.active=dev运行,Bee自动选择active对应的配置文件。

abckingaa的博客 748

StarWind V2V Converter v9 虚拟磁盘转换工具使用教程 (转)

StarWind V2V Converter v9.0.1.268 是一款免费的虚拟磁盘转换工具,支持不同管理程序间的虚拟机镜像格式转换,包括VMDK、VHD/VHDX、IMG和QCOW2等格式。该工具具有窗口修复模式、零拷贝转换和管理程序切换等特色功能,能够轻松实现物理机到虚拟机的转换,并兼容主流管理程序如Hyper-V、ESXi等。使用教程详细介绍了从本地文件选择到格式转换的完整操作流程,转换过程简单高效且不影响原虚拟磁盘数据。

hsh的专栏 1482

SpringBoot——JavaConfig、Spring Boot的使用

SpringBoot是Spring中的一个成员, 可以简化Spring,SpringMVC的使用。他的核心还是IOC容器。特点:创建spring应用内嵌的tomcat, jetty , Undertow提供了starter起步依赖,简化应用的配置。比如使用MyBatis框架 , 需要在Spring项目中,配置MyBatis的对象 SqlSessionFactory , Dao的代理对象。......

胖虎虎 1208

微信小程序 - 最新图片组拖拽排序更换位置功能,类似微信朋友圈九宫格图片的拖动排序效果,微信小程序实现九宫格图片拖拽调换位置,小程序详细实现图像拖曳拖动切换位置排序功能(详细示例代码,一键复制开箱即用

微信小程序,wechat,小程序,图片排序,图像排序,九宫格拖拽排序,拖曳,拖动,拖拽,仿微信朋友圈,朋友圈宫格图片排序,微信朋友圈图片拖动排序效果,实现九宫格图片拖拽,图像拖拽排序组件插件,小程序实现拖拽图片切换图片位置,图片拖动互换位置,图像拖拽切换位置,九宫格图片组合拖动排序,交换九宫格图片的位置,小程序上传图片后,如何实现拖拽排序功能,小程序怎么实现图片拖拽排序,微信小程序图片上传,九宫格拖拽组件,选择图片并拖动_微信小程序图片拖拽,微信小程序长按拖拽排序,图像的拖拽移动,多图拖拽排序功能,实现九宫

✅ 精选推荐文章 4454

【踩坑记录】colmap中的相机位姿的坐标系定义及其可视化结果的隐含转换

1 坐标系定义及转换   首先介绍一下世界坐标系和相机坐标系之间的转换,它们之间是存在一个转换关系的。现假设空间中一点X,它在相机坐标系下的坐标是Xcamera,在世界坐标系下的坐标是Xworld。假设它通过R和t实现从相机坐标系到世界坐标系之间的转换: Xworld = RXcamera + t   那么,由上式,我们可以推得从世界坐标系向相机坐标系的转换关系(RT=R-1,所以通常直接使用RT即可): Xcamera = RTXworld - RTt   所以,两个坐标系之间的转换,需要看其具体

zeeq的博客 2万+

SpringBoot——Spring Boot 中使用 Servlet

1 Spring Boot 中使用 Servlet Spring Boot 中使用 Servlet有两种方式 方式一:通过注解扫描方式实现 方式二:通过 SpringBoot 的配置类实现(组件注册) 2 方式一:通过注解扫描方式实现 创建一个servlet类 package com.liuhaiyang.springboot.servlet; import javax.servlet.ServletException; import javax.servlet.annotation..

莫得感情得码农 7183

1、电路分析知识全解析:从基础到实践应用

本博客全面解析电路分析知识体系,涵盖从基础的电压、电流、电阻概念到复杂的交流电路、瞬态分析和高级应用如滤波器与变压器等内容。适合电子技术专业学生和技术爱好者学习,提供详细的知识结构、学习路径、实践示例以及丰富的学习资源,包括计算机模拟工具Multisim和PSpice的使用指导。通过理论与实践结合,帮助学习者掌握电路分析的核心技能,为电子工程和电力系统等相关领域打下坚实基础。

iii12的专栏 159

Spring Boot学习笔记【三】——使用springboot【基础】

13. 构建系统 强烈建议您选择支持依赖关系管理且可以使用发布到“Maven Central”存储库的工件的构建系统。 我们建议您选择Maven或Gradle。 可以让Spring Boot与其他构建系统(例如Ant)一起工作,但它们并没有得到特别好的支持。 13.1 Dependency Management 每个版本的Spring Boot都提供了它支持的依赖项的精选列表。 实际上,您不需要为...

茨时代べ 的博客 442

27、超声成像技术与原理全面解析

本博客全面解析了超声成像技术与原理,涵盖声学材料特性、超声成像系统的基本概念与组成、关键技术如多普勒和聚焦技术、超声换能器的设计与原理、图像处理方法、系统校准与质量控制,以及超声成像的应用领域和发展趋势。旨在为医学诊断、工业检测和海洋声学等领域的研究人员和工程师提供深入的技术参考和指导。

z2a3b4c5d的博客 494

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SpringBoot基础-了解Spring Boot及其常用注解

介绍Spring Boot基础知识;了解Spring Boot、常用注解、starter等。

chen 604

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SpringBoot中Thymeleaf的基础使用

如何在springboot中引入thymeleaf、thymeleaf基础语法

m0_62909831的博客 1214

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SpringBoot基础——Spring Boot与日志

一、日志框架 市场上存在非常多的日志框架。JUL(java.util.logging),JCL(Apache Commons Logging),Log4j,Log4j2,Logback、SLF4j、jboss-logging等。 Spring Boot在框架内容部使用JCL,spring-boot-starter-logging采用了 slf4j+logback的形式,Spring Boot也能自...

热爱永不过时! 245

SpringBoot Redis 基础使用

redis是一个key-value。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。

QAZ412803的博客 1281

SpringBoot基础

SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。

weixin_42158569的博客 204

springboot 创建地址_使用 SpringBoot Admin监控Spring Boot 服务

简介SpringBoot-Amind是什么?Spring Boot Admin 是一个管理和监控 Spring Boot 应用程序的开源软件。,可监控的信息包含:应用状态、内存、线程、堆栈等等,比较全面的监控了 Spring Boot 应用的整个生命周期。并且可以将这些信息用一个前端界面展示,方便我们理解。spring-boot-admin示例 springboot版本 1.5.21Admin S...

weixin_39661129的博客 317

SpringBoot基础的依赖说明

SpringBoot基础的依赖说明前言 前言 前阵子,为了赶进度,项目在构建的时候,没有仔细研究相关依赖的特性、用处,而是囫囵吞枣,这边copy一点,那边copy一点,结果被大佬小小的批了一顿,实在不应该,项目再赶,也需要挤时间去了解。 ...

legendaryhaha的博客 4808

springboot 替换tomcat_Spring Boot 基础

开始使用 Spring Boot 编写能直接运行的 Spring 应用程序Spring Boot 是一个轻量级框架,可以完成基于 Spring 的应用程序的大部分配置工作。在本教程中,将学习如何使用 Spring Boot 的 starter、特性和可执行 JAR 文件结构,快速创建能直接运行的基于 Spring 的应用程序。简单介绍 Spring Boot 后,我将引导您设置并运行两个 Spri...

weixin_39560924的博客 479

Springboot 的基础使用9 日志的使用

Springboot日志的使用

qq_55538458的博客 334
上一篇: Spring AOP源码分析
下一篇: Springboot与日志
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值