무국적 콩의 범위는 싱글 톤 인스턴스입니다. 우리가 싱글 톤의 Bean A에 프로토 타입 B의 B를 주입하고 Bean A의 getBeanb ()를 호출 할 때마다 새로운 Bean B를 반환 할 수 있기를 희망하면 기존 주입 방법을 사용 하여이 요구 사항을 달성 할 수 없습니다. Bean B의 범위는 프로토 타입 유형이지만 getBeanb ()를 통해 반환 된 물체는 여전히 처음에 주입 된 Bean B입니다.
따라서 Beana의 getBeanb ()을 호출 할 때마다 새로운 BeanB를 반환하려면 Beana가 BeanFactoryAware 인터페이스를 구현하여 컨테이너에 액세스 한 다음 다음 방식으로 구현할 수 있도록 선택적인 솔루션입니다.
먼저 XML 구성 :
<bean id = "author"scope = "프로토 타입"/> <bean id = "book"p : name = "Veil"> </bean>
Bean Author의 범위는 프로토 타입으로 설정되었습니다.
Book Class는 BeanFactoryAware 인터페이스를 구현합니다.
공개 클래스 북은 BeanClactoryAware {...@atrive -public void setBeanFactory (beanfactory beanfactory)를 던지는 Beansexception {this.ctory = beanfactory;} 공개 저자 getProtoTyPeauthor () {return (return) factory.getBean ( "Author"); }}단위 테스트 :
ApplicationContext context; @beforemethodPublic void setup ()은 예외를 {context = new classPathXmlApplicationContext ( "beans5-5.xml");}@testpublic void test () {book book = (book) context.getbean ( "book"); System.out.println (book.getAuthor (). hashcode ()); System.out.println (book.getAuthor (). hashcode ()); System.out.println (book.getProtoTypeAuthor (). hashcode ()); System.out.println (book.getProtoTypeAuthor (). hashcode ());테스트 결과
결과에서, 우리는 BeanFactory에서 얻은 저자 인스턴스만이 다르다는 것을 알 수 있습니다.
이 구현은 스프링 프레임 워크와 응용 프로그램을 바인딩합니다. 더 나은 솔루션이 있습니까? 예, 주입 방법입니다.
1 주사 방법
스프링 컨테이너는 CGLIB 라이브러리에 의존하므로 런타임 동안 클래스의 바이트 코드를 동적으로 작동 할 수 있습니다. 예를 들어 서브 클래스 또는 구현 클래스의 Bean을 동적으로 생성합니다.
BookInterface 인터페이스 :
공개 인터페이스 BookInterface {저자 getAuthor ();}XML 구성 :
<!-메소드 주입-> <bean id = "author"scope = "프로토 타입"p : name = "maugham"/> <bean id = "book2"> <lookup-method name = "getauthor"bean = "author"/> </bean>
단위 테스트 :
BookInterface book = (BookInterface) context.getBean ( "book2"); assert.assertequals ( "maugham", book.getAuthor (). getName ()); assert.asserTtrue (book.getAuthor (). hashcode ()! = book.getAuthor (). hashcode ());
이 구성 방법을 통해 인터페이스에 동적 구현이 제공 될 수 있으며 이러한 방식으로 반환 된 Bean은 모두 새로운 인스턴스입니다.
따라서 싱글 톤 콩에 프로토 타입 콩을 가져 오려면 조회를 사용하여 주입 방법을 구현할 수 있습니다.
2 교체 방법
봄에는 특정 콩의 방법을 사용하여 다른 콩 방법을 교체 할 수 있습니다.
책에 제목을 얻기 위해 getName () 메소드가 있다고 가정합니다.
/*** 책 제목*/개인 문자열 이름; public String getName () {return name;}이제 책에서 getName () 메소드를 대체하기 위해 MethodReplacer 인터페이스를 구현하는 새 Bean을 만듭니다.
Public Class Book4는 MethodReplacer {@override public Object Remplement (Object Obj, Method Method, Object [] args) 던져 버릴 수있는 {return "Alive"; }}구성:
<bean id = "book3"p : name = "Bright Thousand Suns"> <교체 method name = "getName"replacer = "book4"/> </bean> <bean id = "book4"/>
시험:
Book Book = (Book) Context.getBean ( "Book3"); AsserTequals ( "living", book.getName ());
요약
위는 편집기가 소개 한 스프링 프레임 워크에서 주입 또는 교체 방법의 구현입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨주세요. 편집자는 제 시간에 모든 사람에게 답장 할 것입니다!