21

使用 Spring 3.1 中的新@PropertySource注解,如何使用 Environment 访问多个属性文件?

目前我有:

@Controller
@Configuration 
@PropertySource(
    name = "props",
    value = { "classpath:File1.properties", "classpath:File2.properties" })
public class TestDetailsController {


@Autowired
private Environment env;
/**
 * Simply selects the home view to render by returning its name.
 */
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {

    String file1Name = env.getProperty("file1.name","file1.name not found");
            String file2Name = env.getProperty("file2.name","file2.name not found");

            System.out.println("file 1: " + file1Name);
            System.out.println("file 2: " + file2Name);

    return "home";
}


结果是来自File1.properties的正确文件名,但未找到file2.name。如何访问File2.properties

4

3 回答 3

62

如果您可以迁移到Spring 4.x,则问题已通过新的@PropertySources注释解决:

@PropertySources({
        @PropertySource("/file1.properties"),
        @PropertySource("/file2.properties")
})
于 2013-12-21T00:10:14.203 回答
14

Properties在 Spring 中可以通过以下任一方式访问多个,

  • @PropertySource( {"name1", "name2"} )
  • @PropertySorces( { @PropertySource("name1"), @PropertySource("name2") } )

@PropertySource 的示例,

@PropertySource({
        "classpath:hibernateCustom.properties",
        "classpath:hikari.properties"
})

@PropertySources 的示例,

@PropertySources({
        @PropertySource("classpath:hibernateCustom.properties"),
        @PropertySource("classpath:hikari.properties")
})

指定properties路径后,您可以Environment像往常一样通过实例访问它们

注意:只有这些对我不起作用

error当我使用属性值来配置我的应用程序上下文时,我正在编译。我尝试了通过网络找到的所有内容,但它们对我不起作用!

直到我如下配置 Spring 上下文,

applicationContext.setServletContext(servletContext);
applicationContext.refresh();

例子

public class SpringWebAppInitializer implements WebApplicationInitializer{

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        // Create the 'root' Spring application context
        AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
        // register config class i.e. where i used @PropertySource
        applicationContext.register(AppContextConfig.class);
        // below 2 are added to make @PropertySources/ multi properties file to work
        applicationContext.setServletContext(servletContext);
        applicationContext.refresh();

        // other config
    }
}

供您参考,我使用的是Spring 4.3

于 2017-07-18T14:35:25.577 回答
5

有两种不同的方法:第一种是在 applicationContext.xml 中使用 PropertyPlaceHolder: beans-factory-placeholderconfigurer

<context:property-placeholder location="classpath*:META-INF/spring/properties/*.properties"/>

要添加的命名空间是xmlns:context="http://www.springframework.org/schema/context"

如果您想直接访问控制器中字符串变量的键,请使用:

@Value("${some.key}")
private String valueOfThatKey;

第二种方法是util:properties在你的 applicationContext.xml 中使用:

<util:properties id="fileA" location="classpath:META-INF/properties/a.properties"/>
<util:properties id="fileB" location="classpath:META-INF/properties/b.properties"/>

使用命名空间模式xmlns:util="http://www.springframework.org/schema/util"位置:http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd

然后在你的控制器中:

@Resource(name="fileA")
private Properties propertyA;

@Resource(name="fileB")
private Properties propertyB;

如果您想要文件中的值,只需使用该方法getProperty(String key)

于 2013-01-25T15:57:02.560 回答