You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring MVC项目中,如何在应用内设置专属属性(排除Spring Boot与Server.xml)

在Spring MVC中设置应用专属属性的方案(不含Spring Boot/Server.xml)

针对你想在Spring MVC应用内设置专属属性(比如服务器端口)的需求,我整理了几个纯Spring MVC原生的可行方案,完全不需要依赖Spring Boot或者修改Server.xml:

1. 使用Spring的PropertyPlaceholderConfigurer加载自定义配置文件

这是Spring MVC最经典的配置方式,你可以创建自己的属性文件,然后让Spring加载它,之后在代码中轻松获取属性值。

  • 具体步骤:
    1. src/main/resources下创建自定义配置文件,比如app.properties,写入端口配置:
      app.server.port=8081
      
    2. 在Spring的XML配置文件(比如dispatcher-servlet.xml)中配置属性加载器:
      <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
          <property name="locations">
              <list>
                  <value>classpath:app.properties</value>
              </list>
          </property>
      </bean>
      
    3. 在Java代码中通过@Value注解直接注入属性:
      @Controller
      public class AppController {
          @Value("${app.server.port}")
          private String serverPort;
      
          @GetMapping("/port")
          @ResponseBody
          public String getServerPort() {
              return "当前应用配置的端口:" + serverPort;
          }
      }
      

2. 手动读取自定义配置文件

如果不想依赖Spring的属性加载器,也可以手动读取配置文件,这种方式更灵活,适合需要自定义加载逻辑的场景。

示例工具类代码:

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class AppPropertyReader {
    private static final Properties properties = new Properties();

    static {
        try (InputStream is = AppPropertyReader.class.getClassLoader().getResourceAsStream("app.properties")) {
            properties.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String getProperty(String key) {
        return properties.getProperty(key);
    }
}

之后在任意代码中调用AppPropertyReader.getProperty("app.server.port")就能获取端口值。

3. 使用Spring的Environment接口统一获取属性

Spring的Environment接口提供了统一的属性访问入口,不管属性来自配置文件、系统变量还是其他来源,都能通过它读取。

  • 配置好PropertyPlaceholderConfigurer后,在代码中注入Environment即可:
@Controller
public class AppController {
    @Autowired
    private Environment environment;

    @GetMapping("/port")
    @ResponseBody
    public String getServerPort() {
        String port = environment.getProperty("app.server.port");
        return "当前应用配置的端口:" + port;
    }
}

额外说明:关于Web服务器监听端口

上面的方案主要是用于在应用内部逻辑中使用自定义端口属性(比如调用外部服务的端口)。如果你的需求是修改Web服务器本身的监听端口,纯Spring MVC本身无法直接做到——因为Spring MVC是运行在Servlet容器(比如Tomcat)之上的,容器端口原本由容器配置控制。但你可以通过手动启动嵌入式Servlet容器的方式实现,完全不依赖Spring Boot:

import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletException;

public class AppStarter {
    public static void main(String[] args) throws LifecycleException, ServletException {
        Tomcat tomcat = new Tomcat();
        // 从自定义配置中读取端口并设置
        tomcat.setPort(Integer.parseInt(AppPropertyReader.getProperty("app.server.port")));
        tomcat.getConnector();

        Context context = tomcat.addContext("", null);
        AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();
        appContext.scan("com.yourpackage"); // 替换成你的项目包路径
        DispatcherServlet dispatcherServlet = new DispatcherServlet(appContext);
        Tomcat.addServlet(context, "dispatcherServlet", dispatcherServlet).setLoadOnStartup(1);
        context.addServletMappingDecoded("/*", "dispatcherServlet");

        tomcat.start();
        tomcat.getServer().await();
    }
}

这种方式手动启动Tomcat实例、设置端口,再部署Spring MVC应用,完全满足你不依赖Spring Boot和Server.xml的需求。

内容的提问来源于stack exchange,提问作者Partha.B

火山引擎 最新活动