2013-02-08 10 views
13

Tôi muốn để có thể autowire một đậu singleton (foo)chú thích dựa phương pháp nhà máy

@Component 
public class FooUser { 

    @Autowire Foo foo; 
} 

tạo bằng phương pháp của singleton khác (FooFactory.createFoo)

@Service 
public class FooFactory { 

    public Foo createFoo() {...} 
} 

với xml nó chỉ đơn giản là factory-method. Làm thế nào tôi có thể làm điều đó với chú thích?

+0

Tôi không nghĩ rằng bạn có thể. Tôi nghĩ rằng mùa xuân chỉ có thể tự động đậu nó quản lý. Nhưng nếu bạn có một nhà máy lớp/phương pháp, tại sao không chỉ gọi đó để có được đậu của bạn? – Marvo

+0

Có lẽ câu hỏi này có liên quan? http://stackoverflow.com/questions/9598829/spring-3-component-and-static-factory-method?rq=1 – Marvo

+0

@Marvo: tôi có thể làm đậu này được quản lý bởi mùa xuân. bởi tôi không biết làm thế nào. tôi có thể tạo thêm 1 singleton (MiddleManService) và sử dụng nó để gọi nhà máy và sau đó ở mọi nơi làm '@Autowire MiddleManService middleMan' và sau đó là' middleMan.getFoo() '. nhưng tại sao? tôi muốn nó sipler. tôi chỉ muốn '@Autwired Foo foo'. nó đơn giản với xml. làm thế nào về chú thích? – piotrek

Trả lời

12

Hãy thử Java @Configuration thay vì:

@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

Điều đó tốt và cách xác định xem bạn có muốn làm singleton không? –

+0

Bạn không phải làm điều này. Bởi vì phạm vi đậu là singleton theo mặc định vào mùa xuân. –

+0

Tôi sẽ không làm điều đó. Không gọi phương thức trực tiếp nhưng sử dụng tiêm theo tham số. nếu không: 'fooUser(). GetFoo()! = AppContext.getBean (Foo.class)' Bởi vì bạn đã gọi phương pháp thủ công, trước khi nó được singletoned bởi mùa xuân – MartinL

4

Bạn cần java-config - the @Bean annotation.

Xác định lớp học của bạn như @Configuration và phương pháp của bạn như @Bean

-1

sử dụng giao diện mùa xuân FactoryBean. sau đó u sẽ có thể autowire T tự


EDIT: Các BeanFactory là một giao diện trong mùa xuân mà nếu bạn thực hiện nó Bạn có thể làm cho một nhà máy của đối tượng như:

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

sau đó bạn có thể khởi tạo đậu:

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

sau đó nếu bạn autowired Foo nó mùa xuân sẽ hiểu được FooFactoryBean là nhà máy sản xuất mong muốn

@Autowired 
     Foo foo; 
+0

Câu trả lời này không có ý nghĩa với tôi. Không có T được đề cập trong câu hỏi. – yole

+0

BeanFactory là một giao diện trong Mùa xuân nơi bạn triển khai nó, bạn có thể tạo một nhà máy của đối tượng chẳng hạn như: lớp công khai FooFactoryBean thực hiện FactoryBean { ............... ... } thì bạn có thể khởi tạo bean: công khai FooFactoryBean foo() {return new FooFactoryBean(); } sau đó nếu bạn autowired Foo nó mùa xuân sẽ hiểu FooFactoryBean là nhà máy mong muốn – ameen

3

Thành phần mùa xuân cũng có thể xác định phương pháp gốc. Được chụp từ documentation:

@Component 
public class FactoryMethodComponent { 

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

    public void doWork() { 
     // Component method implementation omitted 
    } 
}