SpringBoot目录
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 {
}
最上面的四个注解是元注解,上面基本上都做了简单的解释(以前记录过一篇和注解相关的博客);
@SpringBootConfiguration
注解从后面的Configuration,可以看出应该是一个配置类的注解(SpringBoot配置类);看一下这个注解的底层:
-
@Target(ElementType.TYPE)//一个元注解 @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration//Spring中的配置类注解; public @interface SpringBootConfiguration { }
- 上面就是注解
@SpringBootConfiguration
的底层修饰;
@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.properties
和application.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. 配置文件的占位符
在配置文件中可以通过占位符来进行很多数据的杂合使用;比如第二个属性(后面属性)可以获得第一个属性(前面属性)的值
;- 可以进行各种取值(比如随机数);
${random}
- 占位符可以使用":"指定值;${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. 配置文件的加载
优先级高的配置文件会覆盖优先级低的配制文件;
优先级的顺序如下:(直接放张图,方便理解;)
除此之外,配置文件还存在互补机制,也就是说高优先级的配置文件,不存在的配置,如果低优先级的存在,那么低优先级的那个配置也可以实现;
7. SpringBoot还可以用以下方法加载配置
- 一个就是上面说过的命令行加载;前面写过,在用java命令执行jar包的时候,最后添上命令就可以了;例如:
java -jar jar包名 --server.port=3234 --server.servlet.context-path=/hee;
多个配置用空格分开; - 还有就是可以加载jar包的外部文件配置文件,也就是在jar包外写一个配置文件,然后启动的时候只要jar包和配置文件放在同一个目录下,那么就会生效,当然也会存在优先级的问题(含有profile名的配置文件优先级高,其次是外部配置文件优先级比内部的高);
- 官方文档里面有:
注意点:
spring.config.location
来改变默认配置文件的位置;但是这个命令一般可以用于项目已经打包的情况下;