当前位置: 首页 > 知识库问答 >
问题:

Spring 4.1.6-加载“.properties”并用它初始化bean

洪念
2023-03-14

我是Spring MVC的新手,我正在做一些测试。我试图找到一些关于这个问题的答案,但大多数都引用了Spring3.11,我使用的是上一个版本:4.1.6。

我希望在应用程序启动时加载一个“.properties”文件,并使用其中的信息创建一个bean,以便在应用程序的所有上下文中访问它。

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  ...
  <context:property-placeholder location="classpath*:resources/Resources.properties" />
</beans:beans>

我认为(不确定)我在root-context.xml中正确地声明了bean:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  <!-- Root Context: defines shared resources visible to all other web components -->
  <bean id="Resources" class="ar.com.violenciaesmentir.blog.resources.ResourcesDB"/>
</beans>

我也认为我正确地制作了bean,但我不知道注释是否正确:

package ar.com.violenciaesmentir.blog.resources;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class ResourcesDB {
  @Value("DB.NAME")
  private String name;

  @Value("DB.TYPE")
  private String type;

  @Value("DB.USER")
  private String user;

  @Value("DB.PASS")
  private String pass;

  @Value("DB.DRIVER")
  private String driver;

  @Value("DB.URL")
  private String url;

  @Value("DB.MAXACTIVE")
  private String maxActive;

  @Value("DB.MAXIDLE")
  private String maxIdle;

  @Value("DB.MAXWAIT")
  private String maxWait;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }

  public String getUser() {
    return user;
  }

  public void setUser(String user) {
    this.user = user;
  }

  public String getPass() {
    return pass;
  }

  public void setPass(String pass) {
    this.pass = pass;
  }

  public String getDriver() {
    return driver;
  }

  public void setDriver(String driver) {
    this.driver = driver;
  }

  public String getUrl() {
    return url;
  }

  public void setUrl(String url) {
    this.url = url;
  }

  public String getMaxActive() {
    return maxActive;
  }

  public void setMaxActive(String maxActive) {
    this.maxActive = maxActive;
  }

  public String getMaxIdle() {
    return maxIdle;
  }

  public void setMaxIdle(String maxIdle) {
    this.maxIdle = maxIdle;
  }

  public String getMaxWait() {
    return maxWait;
  }

  public void setMaxWait(String maxWait) {
    this.maxWait = maxWait;
  }
}

我的“.properties”文件:

DB.NAME = jdbc/Blog
DB.TYPE = javax.sql.DataSource
DB.USER = blog
DB.PASS = blog
DB.DRIVER = oracle.jdbc.driver.OracleDriver
DB.URL = jdbc:oracle:thin:@localhost:1521:xe
DB.MAXACTIVE = 20
DB.MAXIDLE = 5
DB.MAXWAIT = 10000
@ManagedAttribute
private ResourcesDB resources;
...
public void foo() {
  String dbName = resources.getName();
}

然后,我要做的唯一更改就是servlet-context.xml。而不是:

<context:property-placeholder location="classpath*:resources/Resources.properties" />

我用过:

<beans:bean id="configuracion" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <beans:property name="location" value="classpath:Resources.properties"/>
</beans:bean>

并使用@Autowire而不是@ManagedBean来访问bean。

共有1个答案

徐洛华
2023-03-14

您的代码中有两个缺陷。

  1. 您的@value表达式错误
  2. 您的 必须与bean在相同的上下文中

使用@value时必须使用占位符,默认情况下${property name}只是使用名称。因此,更新您的注释以反映这一点。即。@value(“${db.name}

不要使用@ManagedAttribute这一JSF注释,而是使用@autowired@inject。如果没有 ,则添加

 类似资料:
  • 我预计Spring会通过将属性“property.key”设置为“property_value”来初始化StorageConfiguration对象。 但是,我得到以下异常 org.springframework.beans.factory.beanCreationException:创建类路径资源[applicationContext.xml]中定义的名为“storage”的bean时出错:在设

  • 在Laravel中加载自定义助手类有很多问题。然而,它们都没有专注于通过适当的初始化加载它们。 从Laravel 5.3版开始,我们可以使用psr-4自动加载,即自动加载整个目录。但是,类正在加载,但从未初始化。 我在。这个类有一个构造函数,我想在其中加载一些重要的配置,以使助手可用。 那么,如何在加载助手的同时在Laravel中正确初始化它呢?现在我只是使用

  • 我在我的WordPress网站上使用JetPack,并启用了延迟加载。然而,在我的网站中,我用AJAX更新了一些内容,这导致加载1x1占位符的图像,而不是真正的图像,这是懒惰加载会处理的。 如何使用Jet Pack再次调用延迟加载?我似乎记得有一个JavaScript函数,但找不到它是什么。

  • 问题内容: 有什么方法可以通过大量(> 1000)类来加快javax.xml.bind.JAXBContexts的初始化?在我们的XML繁重的应用程序中,启动时间约为10分钟,并且主要由JAXBContexts的初始化时间组成。:-( 我们正在JDK 1.5和org.jvnet.jaxb2.maven2.maven-jaxb2-plugin中使用Sun的JAXB实现,以从XSD生成代码。 澄清:问

  • 问题内容: 我正在尝试在应用程序启动时加载自定义文件。 我的属性文件与主类位于同一包中,因此我假定命令行参数应加载属性文件。 但是仅当我指定属性文件的完整绝对路径时才加载属性。任何建议如何使用相对路径? 问题答案: Java日志记录不会在整个硬盘上搜索文件。有非常简单的规则来查找文件。您希望Java看到两个文件是彼此属于的,但是您在任何地方都没有这样说。由于Java看不到属性文件和您的类之间的任何