SpringBoot入门(2)-部分注解和配置文件

1. 主要的部分注解记录

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

上面的主程序中的注解@SpringBootApplication,表示这是一个Springboot应用程序;所以主入口的类必须要用这个注解修饰;这个注解又有很多的注解修饰;

@Target(ElementType.TYPE)//能够修饰的类型,Type是类
@Retention(RetentionPolicy.RUNTIME)
@Documented//保证在javadoc文档中出现注解,默认注解不显示
@Inherited//保证类的继承伴随着注解的继承
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}

最上面的四个注解是元注解,上面基本上都做了简单的解释(以前记录过一篇和注解相关的博客);

  1. @SpringBootConfiguration注解从后面的Configuration,可以看出应该是一个配置类的注解(SpringBoot配置类);看一下这个注解的底层:
  •  	@Target(ElementType.TYPE)//一个元注解
     	@Retention(RetentionPolicy.RUNTIME)
     	@Documented
     	@Configuration//Spring中的配置类注解;
     	public @interface SpringBootConfiguration {	
     	}
    
  • 上面就是注解@SpringBootConfiguration的底层修饰;
  1. @EnableAutoConfiguration注解从名字就可以了解为自动配置类注解;到它的底层一看:
    •   @Target(ElementType.TYPE)
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        @Inherited
        @AutoConfigurationPackage
        @Import(AutoConfigurationImportSelector.class)
        public @interface EnableAutoConfiguration {
      
    • 前面四个依旧是元注解,但是@AutoConfigurationPackage注解底层有一个@Import(AutoConfigurationPackages.Registrar.class)注解,这个@Import注解是一个导入组件的一个注解(不深究,目前看在深也不怎么懂),大致知道这个注解可以导入@SpringBootApplication这个注解修饰的类以及当前包下的所有包和类;
    • @RestController这个注解其实就是@Controller@ResponseBody的组合;
1. 配置一个资源文件(非全局配置文件)专门存放部分数据进行赋值
  • @PropertySource:用来加载指定的配置文件;
@ConfigurationProperties(prefix = "pre")/*这个注解和下面的
注解一起使用,这个注解指定配置文件中的开头是什么;详细,看配置文件*/
@PropertySource(value = "classpath:persom.properties")//指定配置文件的路径
@Component
public class User {
    private int lastname;
    private String age;
    private List<Integer> idlist;
    private Person person;
    //后面的getter和Setter方法就不写了;不然篇幅太长;
    }

然后就是配置文件:

##这些属性前面必须要添加per,这个per就是注解@ConfigurationProperties的prefix属性的值(必须保持一致,不然取不到值);
##
per.lastname=神
per.age=21
#list 集合可以通过逗号将值分隔开来,如果是map集合,则是一个一个写,map.key=value
per.idlist=12,1,4
per.person.id=2
per.person.address=dsadsf@.com

最后测试的时候可以取到值,这里就不写测试相关的的,因为只需要再测试类中定义一个当前实体类,然后用@Autowired将实例对象自动配置就可以了;最后输出就可以看到结果;

在这里需要注意的就是@PropertySource@ConfigurationProperties是一起使用的,一个指定配置文件路径,一个指定属性值的位置;
但是如果@ConfigurationProperties注解单独使用那么加载的就是系统默认核心配置里面的信息;


  • @ImportResource:导入Spring的配置文件,让里面的配置文件生效; 如果想要这个自己创建的Spring文件生效,就必须要将这个注解放在Springboot的主入口那里,就是那个SpringBoot自带的启动程序;
    如下:
//也就是被SpringBootApplication注解修饰的类上面;
@ImportResource
@SpringBootApplication
public class NewdemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(NewdemoApplication.class, args);
    }
}

在使用这个注解的时候,我才终于了解到,就算不开启Spring扫描,但是使用注解,一样是有效的;也就是说全注解的情况下,好像这个导不导入Spring配置文件还真无所谓;


  • @Bean注解:是学习Spring时候的一个注解,当时好像没有学多少,现在补充一下:这个注解一般在配置类(由@Configuration修饰的类)中使用,用处是将返回值添加到容器中,然后容器中默认的id就是方法名;这个注解就和 标签<bean>一样使用,标签的id属性,是类的方法名,标签的class就是它的返回值,这样就清楚了吧;

2. SpringBoot项目的基本目录结构


其中:
业务逻辑写在src的java的与Springboot主入口同级的包下面(如上图,就是写在newdemo包下);
resource目录的static文件夹:用来存放静态文件,如css,js等
templates文件夹:用来保存模板页面,由于SpringBoot使用的是内嵌的Tomcat,所以默认不支持JSP页面,但是可以使用一些模板(freemarker等);后面再了解去了;
application.properties文件:SpringBoot的配置文件;

3. SpringBoot中的配置文件

SpringBoot使用的全局配置文件application.propertiesapplication.yml;

3.1 YAML语法
server:   
  port: 8081

一般yml就是按这种格式书写;还有一种书写的方式是key: value,在分号后面必须要有一个空格,将两个分开,否则就会报错;

3.2 对于普通的值(例如:String,数字等)

直接像上面描述的一样,直接通过key: value进行书写,除此之外,就算是字符串也不需要使用单引号或者双引号;
而且,使用单引号和双引号也是有区别的;单引号会转义特殊字符,也就是单引号里面有什么,就输出什么;但是双引号不一样,双引号不会转义特殊字符,比如:“dd\tdd”,那么输出的时候就是"dd dd";可以通过输出简单的演示;

3.3 对于一个对象如何使用
# 如果是一个User对象,有name,age属性;
User: 
 	name: dxs
 	age: 21
#行内写法:
User:{name: dxs,age: 21}

上面就是对象的基础写法;

3.4 对于一个数组,容器如何写;
#假如一个User数组,其中有java,Python;可以这样描述;
User:
	- java
	- Python
#行内写法:
User:[java,Python]
3.5 将yml配置文件中的值注入到bean中

先创建一个实体类;这里只是放属性了,另外的getter和setter方法还有toString方法就不放上来了,不然太多了;

/*@ConfigurationProperties(prefix = "user")
用来导入配制文件内容到实体类中;prefix属性表示最开始的位置,
类似于yml里的一个头;*/
@ConfigurationProperties(prefix = "user")
@Component//Spring里面用来实例化实体类;
public class User {
    private String lastname;
    private String age;
    private List<Integer> idlist;
    private Person person;
    }
/******************上面的Person属性类************************/    
@Component
public class Person {
    private int id;
    private String address;
}

然后在yml配置文件中如下配置:

user:
  lastname: 神秘的天
  age: 21
  idlist:
    - 1
    - 3
  person:
    id: 1
    address: ddskdf@d

最后在SpringBoot的单元测试中进行测试;

@SpringBootTest
class NewdemoApplicationTests {
    @Autowired//Spring里面的自动配置对象
    private User user;
    @Test
    void contextLoads() {
        System.out.println(user);
    }
}

结果:

在这里我发现属性不能是name,否则就会导致一直取不到,之所以取不到;如下:
也就是说,系统的配置文件已经规定好了user.name,所以以后起名字一定不要冲突了;
除此之外,@ConfigurationProperties注解可以支持JRS303数据校验;

4. 配置文件的占位符

  1. 在配置文件中可以通过占位符来进行很多数据的杂合使用;比如第二个属性(后面属性)可以获得第一个属性(前面属性)的值
  2. 可以进行各种取值(比如随机数);${random}
  3. 占位符可以使用":"指定值;${pre.lastname:dd},这个的属性值就是lastname=dd;

5. 在SpringBoot中设置多个核心配置文件(如何切换使用)

由于设计程序有很多的步骤,比如开发,测试等,每一个不同的步骤下,都可以有自己的环境;这时就需要多profile文件了,当然配置文件名可以这样命名application-(profile).properties,例如:application-dev.properties(开发时的环境);
配置文件一般默认的就是创建那个SpringBoot项目的时候,自动创建的那个application.properties资源文件;

5.1 在默认配置文件激活其它配置文件的方式

在默认的配置文件(application.properties)中,添加如下配置:

#这个就可以将配置环境换成application-dev.properties;
spring.profiles.active=dev 
5.2 在yml配置文件激活其它环境的方法

在yml配置文件中,有一个文档块模式,用语言来描述,就是值可以通过"---",三条小横线将yml配置文件分成多个部分,这时就不需要再创建那么多的profile配置文件了,上一种方法每一个环境都需要一个配置文件,很复杂,再这里就可以这样,如下;

server:
  port: 8081
spring:
  profiles:
    active: dev
---
#开发时使用的端口
server:
  port: 9093
#尝试了一下,只需要profiles的值和上面的一致,就可以运行成功,到底了我都不清楚有多少的环境;
spring:
  profiles: dev
---
server:
  port: 7878
spring:
  profiles: prod

结果:

5.3 激活profile的另一种方式

重新进入执行环境;


这个激活profile的方式会比其它的激活方式优先,也就是说当有两种或者多种激活方式时,以这种激活方式为准;

上面那种方式,如果在命令行就是如下操作,java -jar 打包的jar包名 --spring.profiles.active=dev;
上面指定的是命令行参数,下面来指定虚拟机参数;
参考文件还是上面那个yml文件;


运行结果和上面的一样,都能达到预期要求;

6. 配置文件的加载

  1. 优先级高的配置文件会覆盖优先级低的配制文件;
    优先级的顺序如下:(直接放张图,方便理解;)

除此之外,配置文件还存在互补机制,也就是说高优先级的配置文件,不存在的配置,如果低优先级的存在,那么低优先级的那个配置也可以实现;

7. SpringBoot还可以用以下方法加载配置

  1. 一个就是上面说过的命令行加载;前面写过,在用java命令执行jar包的时候,最后添上命令就可以了;例如:java -jar jar包名 --server.port=3234 --server.servlet.context-path=/hee;多个配置用空格分开;
  2. 还有就是可以加载jar包的外部文件配置文件,也就是在jar包外写一个配置文件,然后启动的时候只要jar包和配置文件放在同一个目录下,那么就会生效,当然也会存在优先级的问题(含有profile名的配置文件优先级高,其次是外部配置文件优先级比内部的高);
  3. 官方文档里面有:

注意点:

spring.config.location来改变默认配置文件的位置;但是这个命令一般可以用于项目已经打包的情况下;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神秘的天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值