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加载它,之后在代码中轻松获取属性值。
- 具体步骤:
- 在
src/main/resources下创建自定义配置文件,比如app.properties,写入端口配置:app.server.port=8081 - 在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> - 在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




