天天看点

@PropertySource @ImportResource @Bean注解详解1. 回顾:2. @PropertySoure注解3. @ImportSource注解4. @Bean注解5. 总结:

文章目录

  • 1. 回顾:
  • 2. @PropertySoure注解
  • 3. @ImportSource注解
  • 4. @Bean注解
  • 5. 总结:

1. 回顾:

前文我们讲到了一个注解,@ConfigurationProperties 这个注解什么意思呢?

可以配置 perfix 前缀属性,加载全局配置文件中的属性,

即配置文件值的注入,它会把配置文件相关的属性与 JavaBean 中相关的属性进行绑定,然后再利用 @Component 注解把这个Bean加入到Spring的容器中,我们就可以使用了

还记得我们当时再演示配置文件值的注入时,我们想注入的属性是写在什么地方的吗?

是不是在一个全局配置文件,application.properties或者application.yml中的

忘记的可以回顾那篇文章,传送门

2. @PropertySoure注解

假如我们现在有很多JavaBean需要配置文件值的注入!

那难道把所有相关的属性都写在全局配置文件(application.properties或者application.yml)里面吗?

首先说可以不可以这样写,是可以这样写的!完全没有任何问题,但是,在项目中,我们的全局配置文件往往还会配置与很多与项目有关的系统属性!! 我们再把JavaBean的相关属性也写入全局配置文件中,这个全局配置文件感觉有没有很乱??而且耦合度很高

那有没有一种办法,让我们单独把JavaBean中的相关属性提取出来! 写成一个单独的peoperties文件,在利用注解的方式与相关的JavaBean进行属性注入呢?

SpringBoot就为我们提供了这样的方式

注解 @PropertrySource 这个注解的意思是导入配置文件的相关属性并与被这个注解标注的相关的JavaBean属性进行标记

在配合Value属性 引入我们编写好的配置文件即可

举例类似于这样:

@PropertySource(value = {"classpath:person.properties"})
           

这里我们引入了类路径下的person.properties文件,我把需要绑定的属性单独提出来,写了一个配置文件,在这个里面配置需要注入到JavaBean的相关属性即可,

有没有感觉比以前直接写在全局配置文件中清爽多了!

先来看一下我这个简单的测试项目的结构图

@PropertySource @ImportResource @Bean注解详解1. 回顾:2. @PropertySoure注解3. @ImportSource注解4. @Bean注解5. 总结:

我自己写的person.properties文件配置内容如下:

person.first-name=李四
person.age=20
person.gender= man
person.boss=true
person.birth=2000/1/8



person.maps.k1=v1
person.maps.k2=v2


person.list=list1,list2

person.dog.name=dog1
person.dog.age=7
           

以前我是在全局配置文件(application.properties)中这样写的:

server.port=8081

spring.profiles.active=dev

person.first-name=张三
person.age=${random.int}
person.gender= man
person.boss=true
person.birth=2000/1/8



person.maps.k1=v1
person.maps.k2=v2


person.list=list1,list2

person.dog.name=${person.first-name}
person.dog.age=${age:11}
           

再来看,我们现在注入配置文件的值怎样注入

/**
 * 加入到Spring容器中
 */
@Component
/***
 *
 * 将YML配置文件中配置的属性的值映射到这个组件中
 * 需要用到SpringBoot中的一个注解
 * @ConfigurationProperties 这个注解的作用是告诉SpringBoot应用将本类中所有的属性与配置文件中的相关配置进行绑定后
 * 这个注解中有一个参数为prefix 代表前缀,意思是将配置文件中前缀为哪个下面的属性获取到并与本类进行绑定
 * 利用@ConfigurationProperties注解注入全局配置文件中的JavaBean的相关属性
 *
 */
//@ConfigurationProperties(prefix = "person")
@Validated
/**
 * 利用@PropertySource注解注入自己写的配置文件中的JavaBean的相关属性
 * 这样写更清爽,并且解耦合,全局配置文件也不至于很乱,什么配置都要写在里面!
 *
 */
@PropertySource(value = {"classpath:person.properties"})
public class Person {
           

注解 @PropertySource(value = {“classpath:person.properties”}) 搞定

来看一下,之前把JavaBean的相关属性写在全局配置文件中,我们是怎样注入的!

/**
 * 加入到Spring容器中
 */
@Component
/***
 *
 * 将YML配置文件中配置的属性的值映射到这个组件中
 * 需要用到SpringBoot中的一个注解
 * @ConfigurationProperties 这个注解的作用是告诉SpringBoot应用将本类中所有的属性与配置文件中的相关配置进行绑定后
 * 这个注解中有一个参数为prefix 代表前缀,意思是将配置文件中前缀为哪个下面的属性获取到并与本类进行绑定
 * 利用@ConfigurationProperties注解注入全局配置文件中的JavaBean的相关属性
 *
 */
@ConfigurationProperties(prefix = "person")
@Validated
/**
 * 利用@PropertySource注解注入自己写的配置文件中的JavaBean的相关属性
 * 这样写更清爽,并且解耦合,全局配置文件也不至于很乱,什么配置都要写在里面!
 *
 */
//@PropertySource(value = {"classpath:person.properties"})
public class Person {
           

利用注解 @ConfigurationProperties(prefix = “person”) 来注入

建议使用 @PropertySource 注解 ,有利于项目维护并且耦合度低!

3. @ImportSource注解

先说这个注解的作用!

@ImportSource注解 导入Spring的配置文件并配置文件生效!

这个注解只有标注在配置类上才能生效!

什么又是配置类?

标注了 @SpringBootApplication @SpringBootConfiguration @Configuration 的类都是配置类!

区别:

@SpringBootApplication @SpringBootConfiguration @Configuration
SpingBootd的主配置类,标注在主程序类上 SpringBoot的配置类标注在类上 @Spring底层的注解,代表该类是一个配置类

在SpringBoot中默认是没有Spring的配置文件的,如果我们想要配置Spring的相关配置,就需要自己写Spring的配置文件,然后在配置类上标注 @ImportSource 注解导入Spring的配置文件!

这个注解用什么参数导入Spring的配置文件呢?

来看这个注解的源代码!

package org.springframework.context.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.beans.factory.support.BeanDefinitionReader;
import org.springframework.core.annotation.AliasFor;


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface ImportResource {
	@AliasFor("locations")
	String[] value() default {};
	
	@AliasFor("value")
	String[] locations() default {};
	
	Class<? extends BeanDefinitionReader> reader() default BeanDefinitionReader.class;

}
           

说的很清楚了! 利用value或者locations 参数导入Spring的配置文件,并且这两个参数都是数组类型,代表可以导入多个Spring的配置文件

使用方法如下:

@ImportResource(value = {"classpath:beans.xml",})
或者
@ImportResource(locations = {"classpath:bean.xml"})
           

现在我们已经知道如何使用了!,来接下来进行实战,我们就写一个Spring的配置文件,利用@ImportSource注解导入试试,看能不能成功的把我们的Spring配置文件导入并生效!

这里的测试项目结构图如下:

@PropertySource @ImportResource @Bean注解详解1. 回顾:2. @PropertySoure注解3. @ImportSource注解4. @Bean注解5. 总结:

第一步: 创建Spring的配置文件

我这里的配置文件如下内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean  id="helloService1"  class="com.staticzz.springboot_quick.service.HelloService"></bean>
    <bean  id="loggerFactory"   class="org.slf4j.LoggerFactory"> </bean>
</beans>
           

我往Spring的容器中加入了两个组件

一个id为helloService1 另一个id为loggerFactory

helloService1为我自己写的JavaBean,loggerFactory为Java自带的Bean对象

这里我都注入进去

我这里自定义的JavaBean在这个

com.staticzz.springboot_quick.service.HelloServicel路径下

具体内容为:

package com.staticzz.springboot_quick.service;


public class HelloService {
    
}
           

对 ,什么都没写,只是单纯了为了测试能不能把我自定义的组件加入到Spring容器中!

现在Spring的配置文件已经写好了,这里就利用@ImportSource注解把Spring的配置文件加载进来

上面讲到这个注解是标注在配置类上的,这里可以标注在自定义的配置类上,也可标注在SpringBoot的主程序类上!

先来看我标注在主程序类上的效果

动态演示:

@PropertySource @ImportResource @Bean注解详解1. 回顾:2. @PropertySoure注解3. @ImportSource注解4. @Bean注解5. 总结:

再来看我自己创建一个配置类,标注在我自定义配置类上的效果

这里我自己自定义的配置类名为MyConfigApp,内容如下:

package com.staticzz.springboot_quick.config;

import com.staticzz.springboot_quick.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
//@ImportResource(value = {"classpath:beans.xml",})
@ImportResource(locations = {"classpath:spring-mvc.xml"})
public class ConfigAPP {

//    @Bean
//    /**
//     * 将方法的返回值添加到容器中,容器中组件默认的id为方法名
//     */
//    public HelloService helloService01(){
//        System.out.println("@Bean给容器成功添加了组件");
//        return  new HelloService();
//    }

}

           

动态演示:

@PropertySource @ImportResource @Bean注解详解1. 回顾:2. @PropertySoure注解3. @ImportSource注解4. @Bean注解5. 总结:

这里细心的小伙伴就发现了,我自定义的配置类里面还有一个@Bean标注的方法,我是注释掉的,下面咱们来用!

SpringBoot官方推荐使用配置类,而不是使用配置文件的方法配置Spring!

上面使用的是配置文件的方法,接下来使用配置类

4. @Bean注解

测试项目结构如下:

@PropertySource @ImportResource @Bean注解详解1. 回顾:2. @PropertySoure注解3. @ImportSource注解4. @Bean注解5. 总结:

我想往Spring容器中加的组件放大component包下

这里我新建了一个类为MyComponent

现在我要把这个类当作组件,加入到Spring容器中

配置类该如何导入呢? 还需要导入Spring的配置文件吗?答案是不需要的!官方推荐使用配置类方式,这时候@Bean注解就派上用场了!

@Bean注解作用: 往容器中加入一个组件

我的MyConfig类内容如下:

package com.staticzz.springboot_quick.config;

import com.staticzz.springboot_quick.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
//@ImportResource(value = {"classpath:beans.xml",})
/**
 * 开启自定义配置类上的
 */
//@ImportResource(locations = {"classpath:spring-config.xml"})
public class ConfigAPP {

    @Bean
    /**
     * 将方法的返回值添加到容器中,容器中组件默认的id为方法名
     */
    public HelloService helloService01(){
        System.out.println("@Bean给容器成功添加了组件");
        return  new HelloService();
    }

}

           

往Spring容器中加入了id为helloSevice01与id为myComponent01的组件,接下来测试!

动态演示:

@PropertySource @ImportResource @Bean注解详解1. 回顾:2. @PropertySoure注解3. @ImportSource注解4. @Bean注解5. 总结:

5. 总结:

@PropertySoure注解 注入自定义的配置文件属性,标注在相关的JavaBean上,并绑定相关的属性,

@ImportSource注解 导入Spring配置文件,标注在配置类上

@Bean 把组件直接加入到Spring容器中