第一部分:@ConfigurationProperties部分
@ConfigurationProperties是springboot的一个注解,其内的前缀属性值prefix为必输项。
该注解表明:如果被该注解修饰的类,被声明到spring容器中注册成为一个该类所对应的实例对象,则会去扫描springboot的默认配置文件application.yml文件,获取这个前缀下的所有属性的值,如果在该类中有同名属性则直接对该属性的值进行注入。
但是这个注解本身是不会导致被注解的该类注册到spring容器中的,需要配合其他注解进行使用。
一、@ConfigurationProperties + @Component(@Configuration)
(点进@Configuration注解可观察到其内部包含了@Component注解,该注解为配置文件类所主要使用。)
举例说明:
1、在application.yml默认配置文件写入:
test1:
info: goodjob
2、创建配置类:
@Data
@Configuration
@ConfigurationProperties(prefix = "test1")
public class MyConfig {
private String info;
}
3、在测试类中获取info结果
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {UserApplication.class})
public class MyTest {
@Autowired
private MyConfig myConfig;
@Test
public void test1(){
System.out.println("info:"+myConfig.getInfo());
}
}
可见,application.yml配置文件中的info的值已经注入到MyConfig类中的info属性上。
二、@ConfigurationProperties + @Bean
(这里提一下@Bean注解和@Component注解,两者最终都是产生一个bean实例对象注册到spring容器中,但@Component是用于修饰类,表示这个类产生一个实例对象,只能用于自己编写的类;而@Bean是用于修饰方法,表示这个方法返回的实例对象会被注册到spring容器中,可以用于引入第三方库中的类的实例对象的引入,更加灵活。)
举例说明:
1、先创建一个普通的无注解类(除lombok)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Worker {
private String username;
private String password;
}
2、在application.yml中写入配置信息:
test2:
username: jack
password: bigsmall
3、创建配置类:
@Data
@Configuration
public class MyConfig {
@Bean
@ConfigurationProperties(prefix = "test2")
public Worker worker(){
return new Worker();//在这里返回worker对象时,有一个问题,如果这里直接利用有参构造传入值,最终在测试类中是不起作用的,会被注入的值覆盖掉。所以spring注入属性的的值,是在类实例化对象之后进行的。
}
}
4、测试类进行测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {UserApplication.class})
public class MyTest {
@Autowired
private MyConfig myConfig;
@Test
public void test1(){
System.out.println("info:"+myConfig.worker());
}
}
可以发现,Worker类的属性均已被注入数据。
三、@ConfigurationProperties注解普通类,待@EnableConfigurationProperties引入后定义为bean
举例说明:
1、创建普通类,写入@ConfigurationProperties注解,表示该类一旦被实例就会注入属性的值
@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "test2")
public class Worker {
private String username;
private String password;
}
2、写入yml配置文件
test2:
username: jack
password: bigsmall
3、完成配置类,@EnableConfigurationProperties注解将Worker实例化为bean对象
@Data
@Configuration
@EnableConfigurationProperties({Worker.class})
public class MyConfig {
private String info;
@Bean
public Worker worker(){
return new Worker();
}
}
4、测试如上。
四、内部类直接对应配置文件
abc:
player1:
username: jack
password: bigsmall
@Data
@Configuration
@ConfigurationProperties(prefix = "abc")//前缀与配置文件abc对应
public class MyConfig {
private Player player1 = new Player();//属性名与配置文件player1对应
@Data
public class Player{
private String username;//内部类属性名与配置文件username对应
private String password;//内部类属性名与配置文件password对应
}
}
第二部分:@PropertySource部分
@PropertySource是spring的一个注解。
与上面的@ConfigurationProperties注解一样,该注解也是不会去直接把所修饰的类被注册到spring容器中,需要配合注册到spring容器中的@Configuration注解使用。
在注册到spring容器后,该注解会去扫描其内指定的classpath路径下的配置文件的属性值,将符合名称的值注入到这个类的bean对象中。这里扫描的配置文件范围与@ConfigurationProperties不同,@ConfigurationProperties是仅能扫描yml主配置文件,而这个注解是用于扫描主配置文件以外的配置文件。
固定配置文件:
位置:classpath:properties/gj.properties
内容如下:
wk.username=lisa
wk.password=abc
一、@PropertySource + @Configuration配合spring包下的Environment类
@Data
@Configuration
@PropertySource("classpath:/properties/gj.properties")
public class MyConfig {
@Autowired
private Environment env;
}
加载指定的属性文件可以直接把属性配置到 Spring 的 Environment 中,测试类可以通过Environment的对象直接取出配置的属性值。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {UserApplication.class})
public class MyTest {
@Autowired
private MyConfig myConfig;
@Test
public void test1(){
System.out.println("info:"+myConfig.getEnv().getProperty("wk.username"));
}
}
二、@PropertySource + @Configuration + @Value(内含${})
@Data
@Configuration
@PropertySource("classpath:properties/gj.properties")
public class MyConfig {
@Value("${wk.username}")
private String info;
}
注意@Value注解内的值与配置文件内属性名称一致
三、@Configuration + @PropertySource + @ConfigurationProperties
@Configuration注解负责注册配置类,@PropertySource注解负责扫描指定路径的配置文件,@ConfigurationProperties负责扫描配置文件下的属性内容,看是否有与当前的配置类中相同的属性名,有就进行属性值的赋值。
@Data
@Configuration
@PropertySource("classpath:properties/gj.properties")
@ConfigurationProperties(prefix = "wk")
public class MyConfig {
private String username;
}
第三部分:额外说明下bootstrap.yml、application.yml、application.properties配置文件
application.yml和application.properties为springboot的通用配置文件;
而bootstrap.yml为springcloud所特有的配置文件,需要在总pom中引入约束
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
并且在模块pom中引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
三者加载顺序从先到后依次为:bootstrap.yml->application.yml->application.properties。
后面加载的配置文件,会覆盖前面的配置文件,比如application.yml里面的name属性会把bootstrap.yml里面的name属性的属性值覆盖掉。