Spring 3 @ Компонент и статический метод фабрики - PullRequest
15 голосов
/ 07 марта 2012

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

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

Ответы [ 3 ]

16 голосов
/ 07 марта 2012

Боюсь, вы не можете сделать это в настоящее время.Однако с настройкой Java все довольно просто:

@Configuration
public class Conf {

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

}

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

7 голосов
/ 22 марта 2015

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

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

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

@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-компонента (синглтона, если вы его укажете).

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

0 голосов
/ 19 октября 2016

Боб:

 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...