Spring 3 @Component和静态工厂方法

如果我正在编写一个静态工厂方法来创建对象,我如何使用该工厂类的’@Component’注释并指示(带有一些注释)静态工厂方法,应该调用该方法来创建该类的bean? 以下是我的意思的伪代码:

@Component class MyStaticFactory { @ public static MyObject getObject() { // code to create/return the instance } } 

恐怕你目前无法做到这一点。 但是,Java配置非常简单:

 @Configuration public class Conf { @Bean public MyObject myObject() { return MyStaticFactory.getObject() } } 

在这种情况下, MyStaticFactory不需要任何Spring注释。 当然,您可以使用优质的XML。

您需要使用spring接口FactoryBean

BeanFactory中使用的对象实现的接口,这些对象本身就是工厂。 如果bean实现了这个接口,它将被用作公开的对象的工厂,而不是直接作为将自己公开的bean实例。

实现接口并为它声明一个bean。 例如 :

 @Component class MyStaticFactoryFactoryBean implements FactoryBean { public MyStaticFactory getObject() MyStaticFactory.getObject(); } public Class getObjectType() { return MyStaticFactory.class; } public boolean isSingleton() { return true; } } 

通过@Component和组件扫描,将发现此类。 Spring将检测到它是一个FactoryBean ,并将从getObject返回的对象公开为bean(如果指定,则为singleton)。

或者,您可以为此FactoryBean类提供@Bean声明。

豆:

  public class MyObject { private String a; public MyObject(String a) { this.a = a; } @Override public String toString() { return a; } } 

FactoryBean的:

 @Component public class MyStaticFactory implements FactoryBean { @Override public MyObject getObject() throws Exception { return new MyObject("StaticFactory"); } @Override public Class getObjectType() { return MyObject.class; } @Override public boolean isSingleton() { return true; } } 

使用:

 @Component public class SomeClass{ @Autowired MyObject myObject; }