Factory Bean 이 뭐 예요?
27458 단어 Spring
이 글 에서 나 는 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()
되돌아오다
무엇 ,어떤 생명주기 갈고리 도 감청 하거나 그 위 에서 다른 조작 을 시도 하지 않 는 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.