学习第一天:构造学习使用springboot的demo,纯属自己学习使用。
springboot采用的标准是优先于惯例的标准,这是核心,需要记住!!!
springboot的基础结构为:
src/main/java
下的程序入口:Chapter11Application
src/main/resources
下的配置文件:application.properties
src/test/
下的测试入口:Chapter11ApplicationTests
springboot的工程结构推荐为:
推荐的最佳实践为:
![09503973e62def03e9b24da360313c40.png](https://i-blog.csdnimg.cn/blog_migrate/7bf2609e29873d4e00d6223d7a6c97b2.png)
root package
:com.example.myproject
,所有的类和其他package都在root package之下。- 应用主类:
Application.java
,该类直接位于root package
下。通常我们会在应用主类中做一些框架配置扫描等配置,我们放在root package下可以帮助程序减少手工配置来加载到我们希望被Spring加载的内容 com.example.myproject.domain
包:用于定义实体映射关系与数据访问相关的接口和实现com.example.myproject.service
包:用于编写业务逻辑相关的接口与实现com.example.myproject.web
:用于编写Web层相关的实现,比如:Spring MVC的Controller等- Spring Boot的应用主类会自动扫描
root package
以及所有子包下的所有类来进行初始化
当我们创建一个springboot项目的时候,系统默认会为我们在src/main/java/resources目录下创建一个application.properties。可以把这个文件改成application.yml文件,两种文件格式都支持。
在配置文件中(application.yml)中进行写入配置:
test:
database:
username: root
password: root
axActive: 20
如果你需要读取配置文件的值只需要加@Value(“${属性名}”):
@RestController
public class MiyaController {
@Value("${test.database.username}")
private String username;
@Value("${test.database.password}")
private int password;
@RequestMapping(value = "/miya")
public String miya(){
return username+":"+password;
}
}
启动工程访问:localhost:8080/miya,浏览器显示出信息就正常了;
将配置文件的属性赋给实体类:
当有很多的属性的时候我们使用这些属性作为字段来创建javabean来实现
test:
database:
username: root
password: root
axActive: 20
定义一个javabean的类
@ConfigurationProperties(prefix = "test.database")
@Component
public class configBean {
private String username;
private String password;
private Integer axActive;
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public Integer getMaxActive() {
return axActive;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setMaxActive(Integer maxActive) {
this.axActive = maxActive;
}
}
在应用类或者application类中加入相应的注解:EnableConfigurationProperties
@RestController
@EnableConfigurationProperties
public class miyacontroller {
@Autowired
configBean conf;
@RequestMapping(value="/lucy")
public String LucyCon(){
return conf.getUsername()+">>>"+conf.getPassword()+">>>"+conf.getMaxActive();
}
}
PS:记录下出现的问题吧!我编辑好了执行的时候报错:
![b8c7db23aff22245254c239fbf2018f2.png](https://i-blog.csdnimg.cn/blog_migrate/c9c97e1a353559cf6f4ad1019b67e4d0.jpeg)
具体的解决办法如下:
从报错的情况分析为:注册的时候显示两次注册bean,问题出在先使用了@Component注册了bean,然后又使用了@EnableConfigurationProperties(configBean.class)进行了注册,这就导致了两次重复的注册bean的过程,因此如果使用@Component则就不要加configBean.class就可以了!
自定义配置文件
前面说的读取配置文件都是在application.xml上读取的,那么现实情况是,可能我们会使用自己定义的配置文件,因为不同的环境使用的配置文件可能不同,为了不每次都修改同一份配置文件,所以有必要这样进行操作。
自定义配置文件:
![dc3d85945b44b0cda93c04a1da330f6d.png](https://i-blog.csdnimg.cn/blog_migrate/010408ffc2ecbde6fc8ff1e21012f53b.jpeg)
配置文件内容如下:
com.app.username: WorldHello
com.app.password: poi
test.properties为自定义的配置文件,我们的目的是读取其中的配置文件并把内容显示在前端;
编写读取javabean的定义:
@Configuration
@PropertySource(value={"classpath:test.properties"})
@ConfigurationProperties(prefix = "com.app")
public class comapp {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
}
PS:注意的是其中的@符号对应的三个注释是必须的,其相应的的功能是导入相应的配置文件的路径信息并把这部分的信息显示出来;另外注意在javabean的类中定义的字段的名称应该和test.properties里面定义的字段的名称应该是一致的才可以;
编写controller:
@RestController
@EnableConfigurationProperties
public class testController {
@Autowired
comapp cp;
@RequestMapping("/comapp")
public String ComString(){
return "username:"+cp.getUsername()+"<---->"+"userpasswd:"+cp.getPassword();
}
}
实际的显示效果为:
![c0e72c863634169d83e206508e10af23.png](https://i-blog.csdnimg.cn/blog_migrate/d203854f699a729cd4a36109d38cb3fd.jpeg)
在现实的项目中可能会遇到的情况是:
A:开发环境需要一个配置文件
B:测试环境需要一个配置文件
C:可能的其他环境也需要个配置文件
针对上述的情况,我们在一个程序中需要满足多种配置文件的内容;
需要三种的配置文件,其入口还是从application.xml文件开始,在spring中写入相应的配置信息:
关注点:YAML与properties的配置的文件的不同点在哪些方面体现:
YAML有一些不足,其无法通过@PropertySource引用,在加载属性到内存的时候其是有序的,因此在一些需要配置文件顺序加载的情形下,使用YAML更加具有优势;
spring:
profiles:
active: test
![1c488e5ef007f7c360c090727d40eff3.png](https://i-blog.csdnimg.cn/blog_migrate/34bf23ffa2e7690fcee1a6aeb1dde83c.jpeg)
配置文件加上test代表测试用的配置文件,则在application.yml上配置这个测试的yml的路径,其余的按照默认编写:
server:
port: 8082
则更改了端口8082为前端的端口:
![0c07adc26f5a85b63b6f3b660e5d4e27.png](https://i-blog.csdnimg.cn/blog_migrate/d9b3477005a7840c426f22b63433017f.jpeg)
总结下:
Springboot中很重要的过程就是参数的自动配置:
完整的读取配置文件中的bean到程序的过程为:
1.读取配置文件中的某个字段:
a.在需要读取配置文件的类外部加上:@RestController
b.在类中的每个元素上加上:@Value("${具体路径下的具体内容}")
2.读取配置文件中的定义的某个字段下的配置信息:
a.定义的是相应的配置文件信息是带有阶层的过程;
b.@ConfigurationProperties(prefix = "test.database"):先在需要使用的实体类外面定义,读取的相应的头信息;
c.@Component:进行自动配置导入相应的bean信息的过程;
d.在需要调用这个实体类的相应的类的外部(也就是需要使用Autowired的部分):
使用:@RestControlle和@EnableConfigurationProperties在外部进行注释的过程;
3.读取新的配置文件的信息:
a.在定义的实体类的外部(就是需要引用bean创建对应对象的类的外部),使用
@Configuration
@PropertySource(value={"classpath:test.properties"})
@ConfigurationProperties(prefix = "com.app")
b.在需要调用这个实体类的相应的类的外部(也就是需要使用Autowired的部分):
使用:@RestControlle和@EnableConfigurationProperties在外部进行注释的过程;
特别鸣谢:
方志鹏的博客