我正在尝试将java.util.prefs.Preferences bean注入我的主控制器。控制器看起来像:
@Controller
class MyController {
@Autowired
private Preferences preferences;
}
application-context.xml文件为java.util.prefs.Preferences创建bean。它使用工厂方法,所以我有以下条目来创建bean:
<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" />
Preferences.userNodeForPackage(param)为参数提供与Preference相关的类。在这种情况下,Spring需要通过执行调用来创建bean:
Preferences.userNodeForPackage(MyController.class);
如何将类传递给使用工厂方法实例化的spring bean? 感谢
环境信息:
Java 7
Spring 3.1
答案 0 :(得分:23)
您可以指定constructor-arg
元素
<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage">
<constructor-arg type="java.lang.Class" value="com.path.MyController" />
</bean>
官方文档here第5.4.1节对此进行了解释。
通过提供静态工厂方法的参数 元素,与构造函数完全相同 实际上已被使用。由...返回的类的类型 factory方法不必与类相同 包含静态工厂方法,尽管在这个例子中它是。一个 实例(非静态)工厂方法将在本质上使用 相同的方式(除了使用factory-bean属性 而不是类属性),因此不会讨论细节 这里。
答案 1 :(得分:3)
我不知道基于xml的配置方式,但我可以告诉你如何通过Configuration
类实例化它。
@Configuration
public class Config {
@Bean(name="preferences")
public java.util.prefs.Preferences preferences() {
// init
return java.util.prefs.Preferences.userNodeForPackage(YourExpectedClass.class);
}
}
P.S。 :
如果您使用基于完整注释的方法[contextClass=org.springframework.web.context.support.AnnotationConfigWebApplicationContext]
或在配置文件中如下所示,您需要在web.xml中添加用于扫描的配置类/包:
<context:component-scan base-package="com.comp.prod.conf" />
答案 2 :(得分:2)
public class Preferences
{
SomeBean someBean;
public void setSomeBean(SomeBean someBean){
this.someBean = someBean;
}
public static Preferences createSampleBeanWithIntValue(SomeBean someBean)
{
Preferences preferences= new Preferences();
preferences.setSomeBean(someBean);
return preferences;
}
}
<bean id="someBean" class="java.util.prefs.SomeBean"/>
<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" >
<constructor-arg ref="someBean "/>
</bean>
请参阅参考资料
答案 3 :(得分:0)
首先创建&#39;首选项&#39;使用xml文件或使用注释的类
然后
如果使用xml配置创建bean来激活@Autowired注释功能,则可以使用此<context:annotation-config>
(或)
<context:component-scan base-package="com.estudo.controller" />
如果你使用注释创建bean
注意:在spring servlet xml文件中定义上述标记
答案 4 :(得分:0)
Spring框架提供了使用工厂方法注入bean的工具。为此,我们可以使用bean元素的两个属性。
factory-method:表示将调用以注入bean的工厂方法。 factory-bean:表示将调用工厂方法的bean的引用。如果工厂方法是非静态的,则使用它。 返回类实例的方法称为工厂方法。
public class A {
public static A getA(){//factory method
return new A();
}
}
答案 5 :(得分:-1)
您可以尝试将“偏好设置”设为“MyController”的属性。 像
这样的东西<bean id="MyController" class="com.your.package.MyController">
<property name="preferences" ref="preferences" />
</bean>
然后在MyController中为首选项设置getter和setter方法。
我认为这应该有用。