spring注解@Import、@ImportResource、@PropertySource、@Value、@ConfigurationProperties

一、@Import注解

       JavaConfigA配置类: 

       

      JavaConfigB配置类:

      

      ParentConfig配置类,引入了JavaConfigA、和JavaConfigB两个配置类:

      

     测试类:只注册加载ParentConfig配置类  就可以了。

      

  1. @Import注解是引入带有@Configuration的java类;-------------这个注解帮助我们将多个配置文件(可能是按功能分,或是按业务分)导入到单个主配置中,以避免将所有配置写在一个配置中。
  2. 在spring在4.2,@Import注解支持导入普通的java类,并将其声明成一个bean;

                   

     测试类:

     

     运行:

     输出结果
     ok

二、@ImportResource注解

  @ImportResource(value=“cons-indec.xml”) <============>等同于xml配置:                  

          (1)value:为String数组,内容为一个或多个xml文件的路径(相对于classpath);

          (2) locations:同value属性;

  1. @ImportResource,是引入spring配置文件.xml,实现xml配置的装载;
  2. @ImportResource:通过locations属性或者value属性,加载对应的xml配置文件,同时需要配合@Configuration注解一起使用,定义为配置类;
  3. @ImportResource引入的配置类必须在启动类中扫描到;
  4. ImportResource的属性:

        

 

三、@PropertySource注解

  1. @PropertySource注解加载指定的属性文件;
  2. @PropertySource注解的属性value,是一个String数组,内容为一个或多个xml文件的路径(相对于classpath);      
  3. @PropertySource注解内部的属性使用,配合@value注解;----properties属性文件是key-value格式的,@value("${key}");

      

     

上述的代码目的是加载classpath路径中config文件中的jdbc-bainuo-dev.properties。其中:

属性:encoding用于指定读取属性文件所使用的编码,我们通常使用的是UTF-8;

属性:ignoreResourceNotFound含义是当指定的配置文件不存在是否报错,默认是false;实际项目开发中,最好设置为false。

属性:value值是设置需要加载的属性文件,可以一次性加载多个。

属性:name的值我们设置的是jdbc-bainuo-dev.properties。这个值在Springboot的环境中必须是唯一的,如果不设置,则值为:“class path resource [config/jdbc-bainuo-dev.properties]“。

可能很多人比较纳闷,为什么是“class path resource [config/jdbc-bainuo-dev.properties]“呢?这个就涉及到了Spring中对资源文件的封装类Resource。上文我们配置的value值为"classpath:config/jdbc-bainuo-dev.properties",因此Spring发现是classpath开头的,因此最终使用的是Resource的子类ClassPathResource。如果是file开头的,则最终使用的类是FileSystemResource。

了解了上文所述的Resource类之后。我们再次明确一点,如果@PropertySource中如果没有设置name值,则name值的生成规则是:根据value值查找到最终封装的Resource子类,然后调用具体的Resource子类实例对象中的getDescription方法,getDescription方法的返回值为最终的name值。

四、@Value注解

  1. @Value 为属性注入值(通常使用在属性上较多);
  2. 使用方式:

        (1)、注入普通字符;

                   

        (2)、 注入操作系统属性;

                      操作系统的属性是静态全局变量systemEnvironment存入,可通过它获取到操作系统的属性。

                  

        (3)、注入表达式结果;

                    表达式的对象必须是通过T()包起来,才能执行。

                 

        (4)、注入其它bean属性;

                    demoClass是一个Bean对象,name是它的一个属性,可以通过@Value(“#{demoClass.name}”)将这个bean的属性注入@Value声明的属性里。

                 

        (5)、注入文件资源;

                     通过Resource接收这个文件。

                 

        (6)、注入网站资源;

                     通过Resource接收这个资源。

                 

        (7)、注入配置文件的属性;

                    通过${}注入配置属性,注意不是#号,这个是和其他的不一样,需要@PropertySource引入配置文件才可以使用;

                

五、@ConfigurationProperties注解

  1. @ConfigurationProperties可以使用在方法上、类上;
  2. 在类上使用:

       (1)在application.properties 中加入如下配置:

com.example.demo.name=${aaa:hi}

com.example.demo.age=11

com.example.demo.address[0]=北京

com.example.demo.address[1]=上海

com.example.demo.address[2]=广州

com.example.demo.phone.number=1111111 

       (2) 加在类上,需要和@Component注解、@Configuration等,结合使用.代码如下:

@Component

@ConfigurationProperties(prefix = "com.example.demo")

@PropertySource(value="classpath:application.properties")

public class People {

        private String name;

        private Integer age;

        private List<String> address;

        private Phone phone;

          说明:上述代码中,在People类中增加了ConfigurationProperties注解,并且指明了属性的前缀为com.example.demo。这样Springboot在处理的时候,会去扫描当前类中的所有字段并进行属性的查找以及组装。比如我们配置的prefix = "com.example.demo",People类中有一个name字段,则name字段需要匹配的属性是prefix+字段=com.example.demo.name。

         然后,根据组装好的属性,去PropertySource引用的properties文件找对应的属性值,找到了之后,自动注入People类相应的属性中,例如将application.properties中key为com.example.demo.name的值,注入到People类的name属性;

        如果查找失败,如何处理呢?

        答案:通过注解的属性配置来解决

        @ConfigurationProperties(prefix = "com.example.demo",  ignoreUnknownFields=true,  ignoreInvalidFields=true)  

       ignoreUnknownFields:忽略未知的字段。

       ignoreInvalidFields:是否忽略验证失败的字段。这个怎么理解呢?比如我们在配置文件中配置了一个字符串类型的变量,类中的字段是int类型,那肯定会报错的。如果出现这种情况我们可以容忍,则需要配置该属性值为true。该参数值默认为false。

   3、在方法上使用:

     (1)在application.properties 中的配置同上,不变:     

     (2)People类;

public class People {

         private String name;

         private Integer age;

         private List<String> address;

         private Phone phone;

         // get set 忽略,自己加上即可..

}

     (3)  通过@Bean的方式进行声明,这里我们加在启动类即可,代码如下:

@SpringBootApplication

@PropertySource(value="classpath:application.properties")

public class DemoApplication {

            @Bean

            @ConfigurationProperties(prefix = "com.example.demo")

            public People people() {

                      return new People();

            }

 

           public static void main(String[] args) {

                     SpringApplication.run(DemoApplication.class, args);

            }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值