2012-03-07 25 views
15

Nếu tôi đang viết phương pháp nhà máy tĩnh để tạo đối tượng, làm cách nào để sử dụng chú thích '@Component' cho lớp nhà máy đó và chỉ ra (với một số chú thích) phương pháp nhà máy tĩnh nên được gọi để tạo hạt đậu của lớp đó? Sau đây là mã giả của ý tôi:Spring 3 @Component và static factory method

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

Trả lời

16

Tôi sợ bạn không thể thực hiện việc này hiện tại. Tuy nhiên, nó khá đơn giản với Cấu hình Java:

@Configuration 
public class Conf { 

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

} 

Trong trường hợp này MyStaticFactory không yêu cầu bất kỳ chú thích mùa xuân nào. Và dĩ nhiên bạn có thể sử dụng XML 'ol' tốt.

6

Bạn cần sử dụng giao diện mùa xuân FactoryBean.

Giao diện được thực hiện bởi các đối tượng được sử dụng trong một số BeanFactory mà chính các nhà máy đó là . Nếu một bean thực hiện giao diện này, nó là được sử dụng như một nhà máy cho một đối tượng để lộ, không trực tiếp như một bean thể hiện sẽ được tự tiếp xúc.

Triển khai giao diện và khai báo một bean cho nó. Ví dụ:

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

Thông qua @Component và quét thành phần, lớp này sẽ được phát hiện. Spring sẽ phát hiện rằng đó là FactoryBean và hiển thị đối tượng bạn quay trở lại từ getObject dưới dạng bean (singleton nếu bạn chỉ định nó).

Hoặc, bạn có thể cung cấp tuyên bố @Bean hoặc <bean> cho lớp FactoryBean này.

-1

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

} 

Sử dụng:

@Component 
public class SomeClass{ 


    @Autowired 
    MyObject myObject; 
} 
+0

Coudl bạn nhận xét một mã trong câu trả lời của bạn? – mlkn

Các vấn đề liên quan