當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
SpringBoot_配置-@PropertySource、@ImportResource、@Bean
生活随笔
收集整理的這篇文章主要介紹了
SpringBoot_配置-@PropertySource、@ImportResource、@Bean
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前面說了@ConfigurationProperties和@Value的一些區別和用法,我們再來說兩個注解,一個叫PropertySource,一個叫@ImportResource,第一個PropertySource,他的作用是什么呢,加載指定的配置文件,咱們以Person為例,我們Person是要綁定到全局配置文件中,跟Person相關的所有值,我們用@ConfigurationProperties,但是他有一個要求,你的這些配置,都是默認寫在全局配置文件中的,他默認是從全局配置文件中獲取值,如果后來我把所有的東西都配置在全局配置文件里面,那配置文件可能就太大了,我想把一些跟Springboot無關的配置,我想提取出來,比如我想寫一個person.properties,跟person有關的配置放到這,相當于所有的配置都到這兒了,很明顯我把它改成李四,如果是現在的情況下,我們全局配置文件里面,person的值,那肯定加載不到,那我們就用這個值,@PropertySource,讀取指定的配置文件,他里面有一個value值,value值還能夠寫一個數組的方式,我們可以加載多個外部的配置文件@PropertySource(value= {"classpath:person.properties"})他的作用就是告訴springboot,來加載類路徑下的person.properties內容,并把它們綁定到Person對象中,進行一個測試,發現都能讀取到
person.last-name=\u674E\u56DB
person.age=18
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=dog
person.dog.age=15
package com.learn.bean;import java.util.Date;
import java.util.List;
import java.util.Map;import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;/*** 將配置文件中配置的每一個屬性的值,映射到這個組件* @ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中的相關的配置進行綁定* prefix="person":配置文件中哪個下面的所有屬性進行映射* * 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能;* 默認從全局配置文件中獲取值;*/
@PropertySource(value= {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix="person")
//@Validated
public class Person {/*** <bean class="person">* <property name="lastName" value="字面量/${key}從環境變量、配置文件中獲取值/#{SpEL}"></property>* </bean>*/// lastName必須是郵箱格式//@Email
// @Value("${person.last-name}")private String lastName;
// @Value("#{10*2}")private Integer age;@Value("true")private Boolean boss;private Date birth;
// @Value("${person.maps}")private Map<String,Object> maps;private List<Object> lists;private Dog dog;public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Boolean getBoss() {return boss;}public void setBoss(Boolean boss) {this.boss = boss;}public Date getBirth() {return birth;}public void setBirth(Date birth) {this.birth = birth;}public Map<String, Object> getMaps() {return maps;}public void setMaps(Map<String, Object> maps) {this.maps = maps;}public List<Object> getLists() {return lists;}public void setLists(List<Object> lists) {this.lists = lists;}public Dog getDog() {return dog;}public void setDog(Dog dog) {this.dog = dog;}@Overridepublic String toString() {return "Person [lastName=" + lastName + ", age=" + age + ", boss=" + boss + ",
birth=" + birth + ", maps="+ maps + ", lists=" + lists + ", dog=" + dog + "]";}}
package com.learn.springboot;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import com.learn.bean.Person;/*** SpringBoot單元測試** 可以在測試期間很方便的類似編碼一樣進行自動注入等容器的功能*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot02ConfigurationTests {@AutowiredPerson person;@Testpublic void contextLoads() {System.out.println(person);}}
這個注解,可以加載指定的配置文件,接下來我們來說第二個,@ImportResource,他的作用是什么呢,導入Spring的配置文件,讓配置文件里面的內容生效,比如我們要給容器中加一個組件,除了注解的方式外,我們以前寫的是SpringMVC的配置文件,我來創建一個Spring的配置文件,beans.xml,我來加一個組件,比如我來創建一個HelloService組件,我在Spring配置文件中加入進來,然后給他一個id,這都是我們以前的配置,那現在容器中有沒有這個helloService,是不是你寫一個Spring的配置文件就自動識別,那肯定不是的,我們可以來測一下,看容器中,有沒有HelloService呢,我就讓IOC容器注入進來<bean id="helloService" class="com.learn.service.HelloService"></bean> @Autowired
ApplicationContext ioc;我們來測試容器中有沒有HelloService,他有一個判斷叫containsBean,是不是包含一個bean,包含哪個bean呢,我們就叫helloService,我們在控制臺打印一下有沒有helloService,我們看到控制臺打印false,也就是SpringBoot沒有Spring的配置文件,我們自己編寫的配置文件,也不能自動識別,如果真的想讓我們配置文件生效,加載進來,就需要這個注解,我們把它標注在一個配置類上,那我就把它標注在主配置類上,@ImportResource,在這個注解上有一個locations,他也是一個數組,能讓我們加載多個的Spring配置文件,類路徑下的beans.xml,當我把它加載進來以后,看容器中還有沒有這個bean,我們看到現在容器中就有了
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:cache="http://www.springframework.org/schema/cache"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> <bean id="helloService" class="com.learn.service.HelloService"></bean> </beans>
package com.learn.service;public class HelloService {}
package com.learn;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;/*** @SpringBootApplication 來標注一個主程序類,說明這是一個Sprint Boot應用* @author Leon.Sun**/
@ImportResource(locations= {"classpath:beans.xml"})
@SpringBootApplication
public class SpringBoot02ConfigApplication {public static void main(String[] args) {// Spring應用啟動起來SpringApplication.run(SpringBoot02ConfigApplication.class,args);}
}
package com.learn.springboot;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;import com.learn.bean.Person;/*** SpringBoot單元測試** 可以在測試期間很方便的類似編碼一樣進行自動注入等容器的功能*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot02ConfigurationTests {@AutowiredPerson person;@AutowiredApplicationContext ioc;@Testpublic void testHelloService() {boolean b = ioc.containsBean("helloService");System.out.println(b);}@Testpublic void contextLoads() {System.out.println(person);}}
所以他的功能就是導入Spring的配置文件,我們用它導入Spring的配置文件,讓其生效,這樣我們就能用了,就是這兩個注解,我們后來開發的時候,我們不可能給容器中加組件,我來寫一個配置文件,然后將配置文件導進來,這樣太麻煩了,把@ImportResource(locations= {"classpath:beans.xml"})這個注掉,SpringBoot中推薦給容器中添加組建的方式,是什么呢,是這樣的,首先我們來寫一個配置類,配置類就相當于配置文件一樣,就類似于Spring的配置文件一樣,我們在Spring的配置文件里邊,我們是在配置類里面添加,但是我們現在不希望這樣來用了,我們不來編寫Spring的配置文件了,SpringBoot推薦使用全注解的模式,那我們要給容器中加組件,第一個我們先來寫一個配置類,比如我就來寫一個配置類,當然配置類也可以是我們的主配置類,我專門來寫一個配置類,所有的配置類都放在config文件夾下,我們就叫MyAppConfig,我們項目的配置,他要稱為配置類,那就要加之前講的注解,叫@Configuration,這個注解告訴Springboot,這是一個配置類,指明當前類是一個配置類,配置類就相當于我們之前的配置文件,就是來替代之前的配置文件,那我們在配置文件里邊,我們以前在配置文件中,是使用bean標簽來添加組件的,那我們在配置類里邊,我們怎么添加呢,我們在配置類里邊有一個@Bean注解,bean標簽對應bean注解,Value屬性對應@Value注解,這其實是一一對應的,他能夠標注在方法上@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {當然也可以作為一個原注解來標注,我寫一個方法他的作用是什么呢,就是將方法的返回值添加到容器中,容器中這個組件,默認的id就是方法名,我們來return一個,自己來new一個helloService,把這個helloService添加到容器中,容器中這個組件的名字就叫helloService,我們來可以看一下,容器中有沒有這個helloService呢,注意我們已經不導這個配置文件了,我們是使用配置類的方式加了一個組件,包括如果運行正確,這個方法也會打印,配置類@Bean給容器中添加組件了,我們可以來測試一下,容器中有沒有helloService這個組件,包括我們來看控制臺,我們看到配置類給容器中添加組件了,而且容器中也有這個helloService
package com.learn.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.learn.service.HelloService;/*** @Configuration 指明當前類是一個配置類* * @author Leon.Sun**/
@Configuration
public class MyAppConfig {// 將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名@Beanpublic HelloService helloService() {System.out.println("配置類@Bean給容器中添加組件了");return new HelloService();}}
package com.learn.springboot;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;import com.learn.bean.Person;/*** SpringBoot單元測試** 可以在測試期間很方便的類似編碼一樣進行自動注入等容器的功能*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot02ConfigurationTests {@AutowiredPerson person;@AutowiredApplicationContext ioc;@Testpublic void testHelloService() {boolean b = ioc.containsBean("helloService");System.out.println(b);}@Testpublic void contextLoads() {System.out.println(person);}}
而且他用的id就是我們方法的返回值,如果helloService改成helloService02,我們再看容器中有沒有helloService這個組件了,我們看helloService就沒有了,而擁有的肯定是helloService02,我們推薦用這種方式給容器中添加組件,其實@Bean注解和@Configuration注解,都是Spring注解版底層的東西
?
總結
以上是生活随笔為你收集整理的SpringBoot_配置-@PropertySource、@ImportResource、@Bean的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot_配置-@Confi
- 下一篇: SpringBoot_配置-配置文件占位