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。谁知道为什么?
答案 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?