@Value注释不返回值

时间:2013-04-04 18:25:00

标签: java spring spring-annotations

我有一个使用FichierCommunRetriever @Value注释Spring的课程application.properties。但我正在努力使其发挥作用。

所以在application.donneeCommuneDossier=C\:\\test application.destinationDonneeCommuneDossier=C\:\\dev\\repertoireDonneeCommune\\Cobol 我有:

FichierCommunRetriever

我的班级public class FichierCommunRetriever implements Runnable { @Value("${application.donneeCommuneDossier}") private String fichierCommunDossierPath; @Value("${application.destinationDonneeCommuneDossier}") private String destinationFichierCommunDossierPath; } 正在使用包含以下代码的条目:

application.properties

我们正在使用ApplicationConfig课程中的以下代码加载@ImportResource("classpath:/com/folder/folder/folder/folder/folder/applicationContext.xml")

ApplicationConfig

bean中,我定义了一个FichierCommunRetriever,在这样的新主题中使用Thread threadToExecuteTask = new Thread(new FichierCommunRetriever()); threadToExecuteTask.start();

FichierCommunRetriever

我认为我的问题是,因为applicationContext在一个单独的线程中运行,所以该类无法到达{{1}}并且无法给出值。

我想知道注释是否有用,或者我必须改变我获得这些值的方式?

2 个答案:

答案 0 :(得分:2)

在applicationConfig中,您应该以这种方式定义bean:

@Configuration
public class AppConfig {

    @Bean
    public FichierCommunRetriever fichierCommunRetriever() {
        return new FichierCommunRetriever();
    }

}

然后,在Spring加载之后,您可以通过应用程序上下文访问您的bean

FichierCommunRetriever f = applicationContext.getBean(FichierCommunRetriever.class);
Thread threadToExecuteTask = new Thread(f);
threadToExecuteTask.start();

现在您确定您的bean位于Spring上下文中并且已初始化。 此外,在Spring XML中,您必须加载属性(此示例使用上下文命名空间):

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="
    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:application.properties" />

...

</beans>

答案 1 :(得分:2)

使用new创建FichierCommunRetriever的实例,而不是要求Spring返回bean实例。所以Spring并没有控制这个实例的创建和注入。

您的配置类中应该有以下方法,并调用它来获取bean实例:

@Bean
public FichierCommunRetriever fichierCommunRetriever() {
    return new FichierCommunRetriever();
}

...
     Thread threadToExecuteTask = new Thread(fichierCommunRetriever());