2012-03-07 2 views
15

정적 팩토리 메서드를 사용하여 개체를 만드는 경우 해당 팩터 클래스에 '@Component'주석을 사용하고 (주석을 사용하여) 정적 팩터 리 방법을 그 클래스의 빈을 만들기 위해 호출 되어야만 하는가? 다음은 내가 말하는 의미의 의사 코드입니다.스프링 3 @Component 및 정적 팩토리 메서드

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

답변

16

현재이 작업을 수행 할 수 없습니다. 그러나 자바 구성 꽤 간단하다 :이 경우 MyStaticFactory에서

@Configuration 
public class Conf { 

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

} 

어떤 봄 주석을 필요로하지 않습니다. 물론 좋은 ol 'XML을 대신 사용할 수 있습니다.

6

스프링 인터페이스 FactoryBean을 사용해야합니다.

BeanFactory 내에서 사용되는 개체에 의해 구현되는 인터페이스는 이며 그 자체는 공장입니다. Bean이이 인터페이스를 구현하면 은 노출 될 객체의 팩토리로 사용되며 직접 노출되는 bean 인스턴스는 아닙니다.

인터페이스를 구현하고 이에 대한 bean을 선언하십시오. 예를 들어 : @Component 및 구성 요소 검사를 통해

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

,이 클래스가 발견됩니다. Spring은 FactoryBean임을 감지하고 여러분이 반환하는 객체를 getObject에서 bean으로 노출시킵니다 (지정한 경우에는 싱글 톤).

또는 FactoryBean 클래스에 대해 @Bean 또는 <bean> 선언을 제공 할 수 있습니다.

-1

콩 :

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

가 Coudl 당신이 당신의 대답에 코드를 언급? – mlkn