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