Spring 3 @Компонент и статический метод factory

Если я пишу статический метод factory для создания объектов, как использовать аннотацию @Component для этого класса factory и указать (с некоторой аннотацией) статический метод factory, который должен быть для создания beans этого класса? Ниже приведен псевдокод, что я имею в виду:

@Component
class MyStaticFactory
{
    @<some-annotation>
    public static MyObject getObject()
    {
        // code to create/return the instance
    }
}

Ответы

Ответ 1

Я боюсь, что вы не сможете этого сделать в настоящее время. Однако это довольно просто с конфигурацией Java:

@Configuration
public class Conf {

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

}

В этом случае MyStaticFactory не требует никаких аннотаций Spring. И, конечно же, вы можете использовать хороший ol XML.

Ответ 2

Вам нужно использовать интерфейс spring FactoryBean.

Интерфейс, который будет реализован объектами, используемыми в BeanFactory, которые сами заводы. Если bean реализует этот интерфейс, это используется как factory для объекта для экспонирования, а не непосредственно как beanэкземпляр, который будет отображаться сам.

Внедрите интерфейс и объявите bean для него. Например:

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

Через @Component и сканирование компонентов этот класс будет обнаружен. spring обнаружит, что это FactoryBean и выведет объект, который вы возвращаете из getObject, как bean (singleton, если вы его указали).

В качестве альтернативы вы можете предоставить объявление @Bean или <bean> для этого класса FactoryBean.

Ответ 3

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<MyObject> {


    @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;
}