Java SpringMVC,如何读取和访问application.properties?

Java SpringMVC,如何读取和访问application.properties?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在使用SpringMVC(和Hibernate)开发一个应用程序,对配置问题感到有点困惑。有这么多设置和配置Spring应用程序的方法,这些方法有时甚至在整个教程中混合使用,这并没有使它变得更简单 我使用Spring4进行基于Java的纯配置,因此不需要XML配置文件。应用程序的入口点是AbstractAnnotationConfigDispatcherServletInitializer的子类: public class MvcWebApplicationInitializer exten

我正在使用SpringMVC(和Hibernate)开发一个应用程序,对配置问题感到有点困惑。有这么多设置和配置Spring应用程序的方法,这些方法有时甚至在整个教程中混合使用,这并没有使它变得更简单

我使用Spring4进行基于Java的纯配置,因此不需要XML配置文件。应用程序的入口点是AbstractAnnotationConfigDispatcherServletInitializer的子类:

public class MvcWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class[] {
            HibernateConfig.class, 
            ServiceConfig.class };
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class[] {MvcConfig.class};
}

@Override
protected String[] getServletMappings() {
    return new String[] {"/"};
}
}
如我们所见,这些属性在包含@PropertySource注释的配置文件中使用。 但很可能其他配置文件也需要访问application.properties。而且,我计划在这个文件中定义更多的属性,例如存储用户图像的目录。控制器方法中需要这些信息,因此我需要一种更全局的方式来访问application.properties

因此,我的问题是:

  • 注入的环境是否只允许访问属性文件 如果@PropertyResource是在完全相同的配置中定义的 上课
  • 当多个@Configuration类需要访问 application.properties,是否需要将@PropertyResources添加到 全部(强制我们重复属性文件的名称)
  • 我们如何从控制器类访问属性文件而不使用 是否显式加载它,并重复其名称
将来,可能会有多个版本的属性文件用于测试和实时部署。

按照问题的顺序:

  • 否。
    @PropertyResource
    添加到您的配置后,您可以访问 从应用程序的任何bean访问此属性文件。豆子之前 创建时,Spring收集所有配置的所有属性源, 并将其放入应用程序上下文的单一环境中
  • 不,我们不需要将
    @PropertyResources
    添加到所有资源中。你 可以将属性源添加到一个配置中,并在 另一个。所以,不需要重复属性文件的名称。 声明一次,并在任何地方使用
  • 正如您在控制器中所猜测的那样,它与在其他bean中一样有效。你 只需在配置中声明
    @PropertyResources
    ,将此配置添加到 您可以创建上下文,并在控制器中使用属性。当然,你可以 autowire
    环境
    ,就像您在示例中所做的那样,并获取 属性。但是在我看来使用
    @Value
    注释 更方便一点:

    @Configuration
    @PropertySource(value= {"classpath:application.properties"})
    public class MyConfig{
    
        //spring will automatically bind value of property
        @Value("${my.property}")
        private String myProperty;
    
        //this bean needed to resolve ${property.name} syntax
        @Bean
        public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
            return new PropertySourcesPlaceholderConfigurer();
        }
    }
    
控制器中的方式相同:

    @Controller
    public class MyController{

        //spring will automatically bind value of property
        @Value("${my.property}")
        private String myProperty;

        @RequestMapping("/mapping")
        public String controllerMethod(){
             ...
        }
    }

环境如何不够全球化。所有
@PropertySource
注释都被解析并放入其中。您可以在任何地方访问
环境
,并访问加载的所有属性。简而言之,1。否,2否,3使用
环境
。感谢您的回答,这是否意味着我可以仅用@PropertySource注释一个配置类,然后在任何其他配置类中注入环境?我认为使用额外的通用配置类也会更好,因为现在注释位于Hibernate配置类上,但当application.properties文件也将包含与Hibernate无关的属性时,不应将其加载到Hibernate专用配置类中…这取决于您,无论
环境如何,注释的放置方式和位置都将包含所有注释。谢谢,这确实让您的注释更加清晰!太可怕了!我只是添加了:@PropertySource(value={“classpath:config.properties”})@RestController公共类XController{@RequestMapping(${upload.multiFile}”)公共响应属性uploadMulti(){}
    @Controller
    public class MyController{

        //spring will automatically bind value of property
        @Value("${my.property}")
        private String myProperty;

        @RequestMapping("/mapping")
        public String controllerMethod(){
             ...
        }
    }