春天@Value无法运作

时间:2016-03-03 23:41:35

标签: java spring

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

我使用spring @ value从config获取值,它在其他类(控制器和其他服务)中工作正常,但它在模型中不起作用:

public final class Page {
  @Value("${defaultUrl}")
  private static String defaultUrl; 

  private String url;

  public Page(String url) {
    this.url = url;
  }
  public Page() {
    this(defaultUrl);
  }
}

在上面的例子中,不可能从Spring.value获取defaultUrl。谁知道为什么?

3 个答案:

答案 0 :(得分:5)

就像duffymo在他的评论中所说,使用new意味着Spring不管理你的新对象。所以Spring不会注入任何东西。你需要让你的对象成为Spring管理的组件来注入一些东西。

考虑创建某种PageFactory组件,在其上添加@Component注释,然后使用它来创建页面。这样,您可以将所需的内容注入工厂,并在页面创建过程中使用它来做任何您喜欢的事情。

@Component
public class PageFactory {
    @Value("${defaultUrl}")
    private String defaultUrl;

    public Page create() {
        return new Page(defaultUrl);
    }
}

有一个高级选项,我只是为了完整性而提到。您可以在模型类上使用@Configurable将组件注入其中。但是如果您刚刚开始使用该框架,我不建议使用一些半棘手的AOP配置。

答案 1 :(得分:0)

您的类必须是一个spring bean,请参阅AutowiredAnnotationBeanPostProcessor(source

以供参考

你也有一个上下文属性占位符吗?

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/mainLayout">

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ScrollView01"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true">

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/secondLayout">          


        <com.github.mikephil.charting.charts.PieChart
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="24dp"
            android:id="@+id/pieChart" />

        <com.github.mikephil.charting.charts.BarChart
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/barChart"
            android:layout_below="@+id/pieChart"              
            android:layout_marginTop="48dp"
            android:layout_centerHorizontal="true" />

    </RelativeLayout>
</ScrollView>

</RelativeLayout>

答案 2 :(得分:-3)

我最好的猜测:这段代码的问题在于它试图在类的私有成员上设置一个值。尝试为此成员添加setter方法。

类似

@Value("#{systemProperties.databaseName}")
public void setDatabaseName(String dbName) { ... }

@Value("#{strategyBean.databaseKeyGenerator}")
public void setKeyGenerator(KeyGenerator kg) { ... }

也看这里 How can I inject a property value into a Spring Bean which was configured using annotations?