如何为需要MyClass.class参数的工厂方法注入Spring Bean

时间:2013-08-26 14:12:38

标签: java spring class preferences factory

我正在尝试将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

6 个答案:

答案 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>

请参阅参考资料

http://www.skorks.com/2008/10/are-you-using-the-full-power-of-spring-when-injecting-your-dependencies/

答案 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方法。

我认为这应该有用。