1. 程式人生 > >Spring 註解 @PropertySource、@ImportResource、@Bean的使用

Spring 註解 @PropertySource、@ImportResource、@Bean的使用

1 概述

我們對於一些屬性的配置肯定不會寫在一個配置檔案中這樣顯得耦合性太強,如何去指定配置檔案呢? 下面我們就通過@PropertySource、@ImportResource、@Bean的使用這幾個屬性的學習來解決此問題。

2 @PropertySource

@PropertySource:載入指定的配置檔案

  • person 類
package cn.zhangyu.bean;

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; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.Email; import java.util.List; import java.util.
Map; /** * Created by grace on 2018/11/5. */ @Component @ConfigurationProperties(prefix = "person") //@Validated @PropertySource(value = {"classpath:person.properties"}) public class Person { //人的屬性 //@Email private String myName; private int age; private String sex; //map private
Map<String , Object> maps; //list private List<Dog> list; private Dog dog; public String getMyName() { return myName; } public void setMyName(String myName) { this.myName = myName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Map<String, Object> getMaps() { return maps; } public void setMaps(Map<String, Object> maps) { this.maps = maps; } public List<Dog> getList() { return list; } public void setList(List<Dog> list) { this.list = list; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } @Override public String toString() { return "Person{" + "myName='" + myName + '\'' + ", age=" + age + ", sex='" + sex + '\'' + ", maps=" + maps + ", list=" + list + ", dog=" + dog + '}'; } }
  • person.properties
person.myName=小明
person.age=20
person.sex=male

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

person.list[0].name=小顧
person.list[0].age=22

person.list[1].name=旺財
person.list[1].age=10

person.dog.name=旺旺
person.dog.age=30

3 @ImportResource

@ImportResource:匯入Spring的配置檔案,讓配置檔案裡面的內容生效;

Spring Boot裡面沒有Spring的配置檔案,我們自己編寫的配置檔案,也不能自動識別;

想讓Spring的配置檔案生效,載入進來;@ImportResource標註在一個配置類上

下面通過一個簡單的demo來學習:

  • 建立一個HelloService
public class HelloService {
}
  • 建立一個beans.xml
<?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="helloService" class="cn.zhangyu.service.HelloService"></bean>
</beans>
  • 在測試類中看看能不能獲取注入到bean中的helloService
public class Springboot1ApplicationTests {
	@Autowired
	ApplicationContext ioc;
	@Test
	public void helloService(){
        boolean helloSerice = ioc.containsBean("helloService");
        System.out.println(helloSerice);
    }
}

輸出: false
從結果看並沒有注入成功,那麼我們加上@ImportResource

@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class Springboot1Application {

	public static void main(String[] args) {
		SpringApplication.run(Springboot1Application.class, args);
	}
}

結果:true 注入成功

但是這種方式肯定不好,有多個xml就要新增多個比較繁瑣,所以,SpringBoot推薦給容器中新增元件的方式;推薦使用全註解的方式:
1、配置類**@Configuration**------>Spring配置檔案
2、使用**@Bean**給容器中新增元件

  • 自定義配置類MyAppConfig
package cn.zhangyu;

import cn.zhangyu.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by grace on 2018/11/5.
 */
/**
 * @Configuration:指明當前類是一個配置類;就是來替代之前的Spring配置檔案
 *
 * 在配置檔案中用<bean><bean/>標籤新增元件
 *
 */
@Configuration
public class MyAppConfig {
    //將方法的返回值新增到容器中;容器中這個元件預設的id就是方法名
    @Bean
    public HelloService helloService(){
        System.out.println("配置類@Bean給容器中新增元件了...");
        return new HelloService();
    }
}

通過上面的測試類進行測試,
結果:

配置類@Bean給容器中新增元件了...
true

這種方式是推薦的。