2013-02-08 2 views
13

Я хочу, чтобы иметь возможность autowire одноэлементный боб (foo)аннотацию методы, основанные на фабричные

@Component 
public class FooUser { 

    @Autowire Foo foo; 
} 

созданный методом другого Синглтон (FooFactory.createFoo)

@Service 
public class FooFactory { 

    public Foo createFoo() {...} 
} 

с XML это просто factory-method. Как я могу это сделать с аннотацией?

+0

Не думаю, что вы можете. Я думаю, что Spring может использовать только автообучения, которыми управляет. Но если у вас есть фабричный класс/метод, почему бы просто не назвать это, чтобы получить свой bean-компонент? – Marvo

+0

Возможно, этот вопрос уместен? http://stackoverflow.com/questions/9598829/spring-3-component-and-static-factory-method?rq=1 – Marvo

+0

@Marvo: я могу сделать этот компонент управляемым весной. Я не знаю, как это сделать. Я могу создать еще один синглтон (MiddleManService) и использовать его для вызова фабрики, а затем повсеместно использовать '@Autowire MiddleManService middleMan', а затем' middleMan.getFoo() '. но почему? Я хочу, чтобы он сиплер. Я хочу просто '@Autwired Foo foo'. это просто с xml. как насчет аннотаций? – piotrek

ответ

12

Попробуйте Java @Configuration вместо:

@Configuration 
public class Config { 

    @Bean 
    public FooUser fooUser() { 
     return new FooUser(foo()); 
    } 

    @Bean 
    public FooFactory fooFactory() { 
     return new FooFactory(); 
    } 

    @Bean 
    public Foo foo() { 
     return fooFactory().createFoo(); 
    } 

} 
+1

Это прекрасно, и как определить, хотите ли вы, как синглтон? –

+0

Вам не обязательно это делать. Потому что вес бобов по умолчанию весенний. –

+0

Я бы этого не сделал. Не вызывайте методы напрямую, а используйте инъекцию по параметру. в противном случае: 'fooUser(). GetFoo()! = AppContext.getBean (Foo.class)' Потому что вы вызвали метод вручную, прежде чем он был выделен весной – MartinL

-1

использовать FactoryBean интерфейс Spring. то и будет иметь возможность autowire T себя


EDIT: BeanFactory представляет собой интерфейс весной, где, если вы реализуете его можно сделать завод объекта, таких как:

public class FooFactoryBean implements FactoryBean<Foo>{ 
    .................. 
    } 

затем вы можете инициализировать компонент:

@Bean 
public FooFactoryBean foo(){ 
     return new FooFactoryBean(); 
    } 

тогда, если вы autowired Foo это весна будет понять FooFactoryBean является искомым завод

@Autowired 
     Foo foo; 
+0

. Этот ответ для меня не имеет никакого смысла. В вопросе не упоминается T. – yole

+0

BeanFactory является интерфейсом весной, где я вам осуществить это можно сделать завод из объектов, таких как: общественного класса FooFactoryBean орудий FactoryBean { ............... ... } , тогда вы можете инициализировать компонент: public FooFactoryBean foo() {return new FooFactoryBean(); } , тогда, если вы автоопределили Foo, то Spring поймет, что FooFactoryBean - это желаемый завод – ameen

3

Весна Компоненты также могут определять заводские методы. A отключен от documentation:

@Component 
public class FactoryMethodComponent { 

    @Bean @Qualifier("public") 
    public TestBean publicInstance() { 
     return new TestBean("publicInstance"); 
    } 

    public void doWork() { 
     // Component method implementation omitted 
    } 
} 
Смежные вопросы