一、@Import注解
JavaConfigA配置类:
JavaConfigB配置类:
ParentConfig配置类,引入了JavaConfigA、和JavaConfigB两个配置类:
测试类:只注册加载ParentConfig配置类 就可以了。
- @Import注解是引入带有@Configuration的java类;-------------这个注解帮助我们将多个配置文件(可能是按功能分,或是按业务分)导入到单个主配置中,以避免将所有配置写在一个配置中。
- 在spring在4.2,@Import注解支持导入普通的java类,并将其声明成一个bean;
测试类:
运行:
输出结果
ok
二、@ImportResource注解
@ImportResource(value=“cons-indec.xml”) <============>等同于xml配置:
(1)value:为String数组,内容为一个或多个xml文件的路径(相对于classpath);
(2) locations:同value属性;
- @ImportResource,是引入spring配置文件.xml,实现xml配置的装载;
- @ImportResource:通过locations属性或者value属性,加载对应的xml配置文件,同时需要配合@Configuration注解一起使用,定义为配置类;
- @ImportResource引入的配置类必须在启动类中扫描到;
- ImportResource的属性:
三、@PropertySource注解
- @PropertySource注解加载指定的属性文件;
- @PropertySource注解的属性value,是一个String数组,内容为一个或多个xml文件的路径(相对于classpath);
- @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注解
- @Value 为属性注入值(通常使用在属性上较多);
- 使用方式:
(1)、注入普通字符;
(2)、 注入操作系统属性;
操作系统的属性是静态全局变量systemEnvironment存入,可通过它获取到操作系统的属性。
(3)、注入表达式结果;
表达式的对象必须是通过T()包起来,才能执行。
(4)、注入其它bean属性;
demoClass是一个Bean对象,name是它的一个属性,可以通过@Value(“#{demoClass.name}”)将这个bean的属性注入@Value声明的属性里。
(5)、注入文件资源;
通过Resource接收这个文件。
(6)、注入网站资源;
通过Resource接收这个资源。
(7)、注入配置文件的属性;
通过${}注入配置属性,注意不是#号,这个是和其他的不一样,需要@PropertySource引入配置文件才可以使用;
五、@ConfigurationProperties注解
- @ConfigurationProperties可以使用在方法上、类上;
- 在类上使用:
(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);
}
}