天天看点

Spring通过@Value注解注入系统属性

自己写了一个Spring注解方式注入系统属性的test,成功注入自定义的系统属性。

Model类定义

package cn.lin.luo.tian.profile;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Component;

@Component

public class SystemProp {

    private String username;

    private String password;

    public SystemProp(@Value("#{systemProperties['username']}") String username,

            @Value("#{systemProperties['password']}") String password) {

        super();

        this.username = username;

        this.password = password;

    }

    public String getUsername() {

        return username;

    }

    public void setUsername(String username) {

        this.username = username;

    }

    public String getPassword() {

        return password;

    }

    public void setPassword(String password) {

        this.password = password;

    }

}

配置类定义

package cn.lin.luo.tian.profile;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

@Configuration

@ComponentScan(basePackages = "cn.lin.luo.tian.profile")

public class ProfileConfiguration {

  //如果是读取系统属性的话不需要注入这个bean

    @Bean

    public PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {

        return new PropertySourcesPlaceholderConfigurer();

    }

}

测试类:

package cn.lin.luo.tian.profile;

import static org.junit.Assert.assertEquals;

import static org.junit.Assert.assertNotNull;

import javax.annotation.Resource;

import org.junit.BeforeClass;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.ActiveProfiles;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes = ProfileConfiguration.class)

@ActiveProfiles("pro")

public class ProfileTest {

    @Resource(name = "getConfig")

    public String config;

    @Autowired

    public SystemProp systemPro;

    private static final String USERNAME = "Jack";

    private static final String PASSWORD = "Rose";

    @BeforeClass

    public static void beforeClass() {

        System.setProperty("username", USERNAME);

        System.setProperty("password", PASSWORD);

    }

//    @Test

//    public void configTest() {

//        assertNotNull(config);

//        System.out.println(config);

//    }

    @Test

    public void spELTest() {

        assertNotNull(systemPro);

        assertEquals(USERNAME, systemPro.getUsername());

        assertEquals(PASSWORD, systemPro.getPassword());

    }

}

需要注意的是设置自定义系统属性username和password的时候需要在systemPro这个bean初始化前完成,所以在beforeClass方法中进行了属性值复制操作。