2011-09-15 2 views
0

나는 봄 상속에 관한 질문이 있습니다 : 의 내가 클래스 (콩)가 인터페이스 기사를 구현 BraveKnight을 가정 해 봅시다. 나는 ID->기사와 XML 파일이 빈을 선언 한 후, 나는 빈의 참조를 얻으려고 :봄 상속 특색

Knight knight = (Knight) context.getBean("knight"); 

이 작동하는 방식이다. 그러나 bean 이름 자체에서 bean 참조를 얻을 수없는 이유는 무엇입니까? BraveKnight (그리고 인터페이스가 전혀없는 이유는 무엇입니까?) "기사"

BraveKnight knight = (BraveKnight) context.getBean("knight"); 
+0

빈 참조 *를 가져올 수 없다는 것은 무엇을 의미합니까? –

답변

2

먼저 사용하십시오 :

public <T> T getBean(String name, Class<T> requiredType) 

대신 :이 불쾌한 클래스 캐스트를 피할 수

public Object getBean(String name) 

.

왜 인터페이스가 없는지에 대한 질문은 조금도 모릅니다. BraveKnight가 인터페이스를 전혀 구현하지 않을 때 문제가 발생했다고 생각합니다. 그렇게하고 싶다면 동적 프록시 메커니즘 대신 CGLIB를 사용하도록 Spring에 강제해야합니다. Bean을 BraveKnight로 캐스팅 할 때 ClassCastException 문제가 발생하면 Spring이 동적 프록시를 사용하고 Knigh 인터페이스 만 구현하는 $ Proxy0 클래스를 구현하고 BraveKnigh를 직접 확장하지 않음을 의미합니다. 문제가 무엇이든지간에 CGLIB와 JDK 동적 프록시 메커니즘을 더 잘 알아 내려고하면 다음에 Spring이 객체와 함께 할 일을 다음에 놀라지 않을 것입니다.
해당 답변이 문제에 해당하지 않으면 몇 가지 추가 정보를 첨부하거나 추적 또는 설명을 스택에 추가하십시오.

+0

왜 "까다 롭다"? 메소드 시그니처에 클래스를 입력하면 캐스트보다 많은 부분이 개선됩니까? – duffymo

+0

@duffymo 실수로 클래스 캐스트하면 ClassCastException이 throw됩니다. 그리고 getBean (String name, Class requiredType)을 호출하면 BeanNotOfRequiredTypeException 예외가 발생합니다. 차이점은별로 없지만 적어도 콩을 만드는 동안 나쁜 일이 발생한다는 것을 알게 될 것입니다. 그리고 또 다른 것은 내가 캐스트를 좋아하지 않는다는 것입니다 : D – goroncy

1

당신 의 이름을 사용하여 빈을 받고 있습니다. Spring 빈 이름을 키로 사용하고있다.

질문이 "왜 그 유형을 사용하여 콩을 찾지 못합니까?"라는 대답은 그 유형의 콩이 하나만있는 한 할 수 있다는 것입니다. 그것은 "autowiring"이라고합니다. 어노테이션과 몇 개의 필수 XML 태그를 추가하면 Spring에서이를 처리 할 수있다.

인터페이스가 없어도 작동하지 않는 이유는 누가 그렇지 않습니까? Spring과 함께 구체적인 클래스 유형을 연결할 수 있습니다.

더 나은 질문은 "언제 봄에 인터페이스를 사용해야합니까?"입니다. 그 대답은 구현이 변경 될 가능성이있는 경우를 위해 인터페이스를 설계하는 것이 Spring을 사용하든 사용하지 않든 좋은 방법입니다. Spring은 필요에 따라 동적 프록시를 생성 할 수 있습니다 (예 : 지속성 객체에 트랜잭션 추가).

+0

예, AOP (주위)를 사용하는 것을 잊어 버렸습니다. 왜 내가 허용되지 않거나 덮어 쓰지 않는 BraveKnight 메서드를 액세스/실행할 수 없는지 궁금했습니다 (Knight 인터페이스에 없음) – spauny

+0

AOP는 인터페이스에서 동적 프록시를 생성하여 작동하기 때문입니다. 프록시의 구현이 실행됩니다. – duffymo

0

응용 프로그램 컨텍스트에서 인터페이스없이 문제없이 호출 할 수 있습니다.

AOP 프록시를 사용할 때만 인터페이스가 필요합니다.이 경우 인터페이스가 아닌 객체 참조는 예외가됩니다.

0

bean 이름으로 BraveKnight을 사용하면 맵핑을 이해하기가 쉽고 간단 해집니다. Craig Walls Spring In ActionKnight을 빈 이름으로 사용하여 맵핑이 Knight의 구현을 호출한다는 것을 명확히합니다.

자바에서는 인터페이스를 인스턴스화 할 수 없기 때문에 다시 인터페이스로 작동하지 않습니다. Knight에 직접 매핑하는 것은 정확하게 수행하고 있습니다.

Knight knight = new BraveKnight()//legal Implementation to Knight 

이 구현이 컨텍스트 파일의 매핑으로 사용 된 이유는 다음과 같습니다 당신은 기사의 구현에 대해 인스턴스화

Knight knight = new Knight(); // This is illegal 

예, 그것이 작동되도록합니다. 모든