@Value、@ProertySource、@ConfigurationProperties、@Import - 读取、导入配置文件

注解
加载解析配置文件
@PropertySource
从配置文件中解析好的字段赋值到类属性上
@Value:修饰字段(属性)、方法、形参、注解
@ConfigurationProperties:修饰类、方法上

注意:

  1. SpringBoot默认会读取 classpath:application.properties 这个配置文件
  2. 如若加载其他配置文件,需要显示的指明出来

1. @Value

db.properties数据源配置文件

spring.datasource.username=root  
spring.password: 123456  
spring.url=jdbc:mysql://localhost:3306/springcloud?serverTimezone=UTC  
spring.driver-class-name=com.mysql.jdbc.Driver

一个普通的JavaBean - 从配置文件中进行实例一个student对象,交给容器管理

@Component
@ConfigurationProperties(prefix = "student")
public class Student {
    
    
    String name;
    pulic String getName() {
    
     return name; }
    public void setName(String name) {
    
     this.name = name; }
}

1.1 @Value("${属性名}") - 获取已加载的配置文件的属性

@Controller
public class BookController {
    
    
    
    @Value("${spring.url}")
    public String url;

}

1.2 @Value("#{对象1.属性名}") - 获取JavaBean对象的属性值

  • 前提是这个 对象1 是被Spring容器所管理的
@Controller
public class BookController {
    
    
    
    @Value("${student.name")
    public String name;

}

1.3 @Value(“字面量”) - 直接进行属性赋值

public class Book {
    
    
    @Value("1f423423443")
    String  id;   // 订单流水号
}

2. @PropertySource – 加载配置文件,并将其进行解析

默认只能解析xml、properties类型的配置文件

2.1 使其具有解析yml文件的能力

源码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jB4duL9R-1587881102204)(en-resource://database/18540:1)]



MyPropertySourceFactory - yml解析器

public class MyPropertySourceFactory implements PropertySourceFactory {
    
    

    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
    
    

        if(resource == null) {
    
    
            return null;
        }else {
    
    
            String fileName = resource.getResource().getFilename();
            Resource r =  resource.getResource();
            PropertySource  p = new YamlPropertySourceLoader().load(fileName, r).get(0);
            return p;
        }
    }
}


Student - JavaBean

@Component  //Student类交给容器管理
@ConfigurationProperties(prefix="student")    //配置文件前缀为student赋值给Student类属性字段上
@PropertySource(value="classpath:student.yml", factory= MyPropertySourceFactory.class)
public class Student {
    
    


    String name;
    Integer years;

    public String getName() {
    
    
        return name;
    }


    public void setName(String name) {
    
    
        this.name = name;
    }

    public Integer getYears() {
    
    
        return years;
    }

    public void setYears(Integer years) {
    
    
        this.years = years;
    }

    @Override
    public String toString() {
    
    
        return "Student{" +
                "name='" + name + '\'' +
                ", years=" + years +
                '}';
    }
}



在启动类测试Spring容器是否有赋值给Student对象

@SpringBootApplication
public class App
{
    
    

    public static void main( String[] args ) throws SQLException {
    
    

        ConfigurableApplicationContext context = SpringApplication.run(App.class, args);

        Student bean = context.getBean(Student.class);

        System.out.println(bean);
        
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ddseVT4C-1587881102220)(en-resource://database/18544:1)]

3. @ConfigurationProperties - 将已经解析好的配置文件中的属性,赋值到该被Spring管理的类中

4. @Import - 导入配置类

JavaConfig配置文件类

// 配置文件类 - 默认自动加载application.yml、application.properties
@Configuration
@Import({
    
    DataSourceConfig.class})
public class JavaConfig {
    
    
    
    //读取applicaiton配置文件的键值对,并赋值
    @Value("#{student.name}")
    String name;

    @Bean
    public User getUser() {
    
    

        User user =new User();
        user.setId(1);
        user.setName(name);
        return user;
    }

}

DataSourceConfig配置文件,需要导入的JavaConifg配置文件

// 指定读取其他配置文件
@PropertySource(value="classpath:db.properties", ignoreResourceNotFound = true)
public class DataSourceConfig {
    
    


    @Value("${db.userName}")
    String userName;

    @Value("${db.password}")
    String password;

    @Value("${db.driverClass}")
    String driverClass;

    @Value("${db.url}")
    String url;

    @Bean
    public DruidDataSource getDataSource() {
    
    

        DruidDataSource dds = new DruidDataSource();
        dds.setUsername(userName);
        dds.setPassword(password);
        dds.setDriverClassName(driverClass);
        dds.setUrl(url);
        return dds;
    }

}

Guess you like

Origin blog.csdn.net/weixin_39651356/article/details/105767878