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



我正试图将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方法。

我认为这应该奏效。

相关内容

  • 没有找到相关文章

最新更新