在春天访问多个属性文件与@PropertyResource(Accessing multiple p

2019-07-18 16:11发布

使用新的@PropertySource在Spring 3.1注解,你怎么可以访问环境中的多个属性文件?

目前,我有:

@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?

Answer 1:

有两种不同的方法:第一种是用在你的applicationContext.xml的PropertyPlaceHolder: 豆工厂,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"/>

使用namesapce xmlns:util="http://www.springframework.org/schema/util" schemaLocations: 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)



Answer 2:

如果你可以迁移到Spring 4.x的问题已经解决了新@PropertySources注释:

@PropertySources({
        @PropertySource("/file1.properties"),
        @PropertySource("/file2.properties")
})


Answer 3:

多个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



文章来源: Accessing multiple property files with @PropertyResource in Spring