Factory Bean 이 뭐 예요?

27458 단어 Spring
본문 번역https://spring.io/blog/2011/08/09/what-s-a-factorybean, 수준 이 제한 되 어 있 습 니 다. 지적 을 환영 합 니 다!
이 글 에서 나 는 Spring 의  org.springframework.beans.factory.FactoryBean 인터페이스이 인터페이스의 정 의 는:
public interface FactoryBean<T> {
  T getObject() throws Exception;
  Class<T> getObjectType();
  boolean isSingleton();
}

FactoryBean 
대상 을 하나의 클래스 에 논리 적 으로 패키지 하 는 모드 입 니 다.
예컨대
그것 은 중용 할 수 있 는
인 코딩 방식 으로 복잡 한 대상 그림 의 대상 을 만 듭 니 다.
일반적으로 그것 은 많은 의존 이 있 는 복잡 한 대상 을 구축 하 는 데 쓰 인 다.구조 논리 가 고정 되 지 않 고 설정 에 의존 하여 대상 을 만 드 는 문 제 를 해결 하 는 데 도 사 용 될 수 있다.FactoryBean
 
스프링 이 쉽게 만 들 수 없 는 대상 을 만 드 는 데 도 도움 이 된다.예 를 들 어 JNDI 에서 얻 은 bean 에 인용 을 주입 하기 위해 서 는 이 인용 이 먼저 얻어 져 야 합 니 다.사용 할 수 있 습 니 다.
JndiFactoryBean
이 인용 을 통 일 된 방식 으로 가 져 옵 니 다.너 는FactoryBean
  getObject()
방법 으로 얻 은 대상 은 다른 대상 의 속성 에 주입 된다.
 
하나 있다 고 치자.
Person
클래스, 그 정 의 는 다음 과 같 습 니 다.
public class Person { 
 private Car car ;
 private void setCar(Car car){ this.car = car;  }	
}

하나
FactoryBean
그 정 의 는 다음 과 같다.
public class MyCarFactoryBean implements FactoryBean<Car>{
  private String make; 
  private int year ;

  public void setMake(String m){ this.make =m ; }

  public void setYear(int y){ this.year = y; }

  public Car getObject(){ 
    // wouldn't be a very useful FactoryBean 
    // if we could simply instantiate the object!
    CarBuilder cb = CarBuilder.car();
	
    if(year!=0) cb.setYear(this.year);
    if(StringUtils.hasText(this.make)) cb.setMake( this.make ); 
    return cb.factory(); 
  }

  public Class<Car> getObjectType() { return Car.class ; } 

  public boolean isSingleton() { return false; }
}

너 는 가설 을 사용 할 수 있다.
CarFactoryBean
하나 가 져 오기
Car
인 스 턴 스, 설정 은 다음 과 같 습 니 다:
 class = "a.b.c.MyCarFactoryBean" id = "car">
	 name = "make" value ="Honda"/>
	 name = "year" value ="1984"/>

 class = "a.b.c.Person" id = "josh">
	 name = "car" ref = "car"/>

이 예 에서
FactoryBean

getObject
방법의 반환 대상 이 생 성 됩 니 다.
FactoryBean
그 자체Spring 이 대상 을 대상 속성 에 주입 하 는 이 유 는 볼 수 있 기 때 문 입 니 다.
FactoryBean

getObjectType()
공장 대상 의 유형 을 확인 하고 주입 위치 에 유형 을 주입 할 수 있 는 지 확인 합 니 다.하면, 만약, 만약...
FactoryBean

isSingleton()
방법 반환 true,
Spring 은 빈 에 게 캐 시 를 되 돌려 주 고 false 로 돌아 가면 캐 시 를 하지 않 습 니 다.

 
스프링 업 데 이 트 를 사용 하고 있다 면 (
제 가 봤 을 때 도...
더욱 우아 한) 자바 기반 설정,
 
너 는 이것 이 네가 기대 하 는 것 처럼 그렇게 일 하지 않 는 다 는 것 을 알 게 될 것 이다.
그것 은 여전히 일 을 할 수 있 지만, 너 는 반드시 간접 적 으로 인용 해 야 한다.
FactoryBean
자바 설정 을 명 확 히 하고 이렇게
호출
getObject():
// identical configuration in Java to the XML above			
@Configuration 
public class CarConfiguration { 

  @Bean 
  public MyCarFactoryBean carFactoryBean(){ 
	MyCarFactoryBean cfb = new MyCarFactoryBean();
	cfb.setMake("Honda");
	cfb.setYear(1984);
	return cfb;
  }

  @Bean
  public Person aPerson(){ 
	Person person = new Person();
	person.setCar( carFactoryBean().getObject());
	return person; 
  }	
}

주의해 야 할 것 은 본질 적 으로 Spring 의 모든 Bean 이다.
설정
실행 시 같은 곳 에서 해석 합 니 다.위 와 같이 자바 설정 을 기반 으로 정의 할 수 있 습 니 다.
FactoryBean
XML 에서 정의 하 는 것 처럼 XML 에서 공장 bean 을 사용 할 수도 있 습 니 다.
FactoryBean
같다
 
Spring 중의 
FactoryBean 
라 이 프 사이클 과 Spring 용기 에 있 는 모든 Bean 을 포함 한 다른 Spring bean 의 모든 다른 특성 을 가지 고 있 습 니 다 (예 를 들 어 AOP).
 
하면, 만약, 만약...
FactoryBean
중 속성 이 설정 완료 후,
getObject()
방법 이 호출 되 기 전에 실행 대상 이 논 리 를 만 들 면 Spring 용 기 를 알려 줄 수 있 습 니 다.
FactoryBean
전근 하 다.방법 중 하 나 는 실현 이다.
InitializingBean
인터페이스어쨌든 이 인터페이스의 방법 은 호출 될 것 이다.POJO 를 중심 으로 하 는 사상 을 더욱 잘 나타 내 는 대체 방법 은 사용 하 는 것 이다.
@PostConstruct
주해
다음 예 에서
make
 화해시키다 
year
속성 이 설정 되면 이 방법 이 호출 됩 니 다.
너 는 이 리 셋 을 사용 하여 대상 구조 가 완성 되 기 전에 정성 검 사 를 할 수 있다. 구조 가 완 성 된 후에 가 아니 라.
 @PostConstruct 
 public void setup() throws Throwable { 
   // these methods throw an exception that 
   // will arrest construction if the assertions aren't met
   Assert.notNull(this.make, "the 'make' must not be null")	;
   Assert.isTrue(this.year > 0, "the 'year' must be a valid value"); 
 }

이 글 을 다 본 후에 당신 이 알 아야 할 관건 은...
FactoryBean
공장 대상 자체 가 아니 라 스프링 용기 에 존재 하 며 라 이 프 사이클 과 용기 서 비 스 를 누 린 다.되 돌아 오 는 인 스 턴 스 는 transient 입 니 다. Spring 은 관심 이 없습니다.
getObject()
되돌아오다
무엇 ,어떤 생명주기 갈고리 도 감청 하거나 그 위 에서 다른 조작 을 시도 하지 않 는 다.

좋은 웹페이지 즐겨찾기