我正试图将java.util.prefs.Preferences bean注入到我的主控制器中。控制器看起来像:
@Controller
class MyController {
@Autowired
private Preferences preferences;
}
application-context.xml文件为java.util.prefs.Preferences创建bean
<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" />
userNodeForPackage(param)采用与Preference相关的类作为参数。在这种情况下,Spring需要通过执行以下调用来创建bean:
Preferences.userNodeForPackage(MyController.class);
如何将类传递给用工厂方法实例化的springbean?感谢
环境信息:
Java 7
Spring 3.1
您可以指定constructor-arg
元素
<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage">
<constructor-arg type="java.lang.Class" value="com.path.MyController" />
</bean>
官方文件第5.4.1节对此进行了解释。
静态工厂方法的参数通过元素,与构造函数实际使用过。由返回的类的类型工厂方法不必与包含静态工厂方法,尽管在本例中是实例(非静态)工厂方法将用于完全相同的方式(除了使用factorybean属性而不是class属性),因此将不讨论细节在这里
我不知道基于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" />
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>
请参阅参考
http://www.skorks.com/2008/10/are-you-using-the-full-power-of-spring-when-injecting-your-dependencies/
首先使用xml文件或注释创建"Preferences"类的bean
然后如果使用xml配置创建bean以激活@Autowired注释功能,则可以使用此<context:annotation-config>
(或)
<context:component-scan base-package="com.estudo.controller" />
如果您使用注释创建bean
注意:在springservlet xml文件
Spring框架提供了使用工厂方法注入bean的功能。为此,我们可以使用bean元素的两个属性。
factory方法:表示将被调用以注入bean的工厂方法。factorybean:表示将调用工厂方法的bean的引用。如果工厂方法是非静态的,则使用它。返回类实例的方法称为工厂方法。
public class A {
public static A getA(){//factory method
return new A();
}
}
您可以尝试将"preferences"设置为"MyController"的属性吗。类似的东西
<bean id="MyController" class="com.your.package.MyController">
<property name="preferences" ref="preferences" />
</bean>
然后在MyController中为首选项提供getter和setter方法。
我认为这应该奏效。