2011-11-12 2 views
0

그의 book about Dependnecy Injection에서 단지는 봄용 콩을 명명 할 때 네임 스페이스를 사용하도록 장려한다. 이 책에서봄 : ID의 네임 스페이스를 사용하는 빈은 SPeL과 충돌한다

Qutation :

나는 또한 강력하게 읽고 "binaryTreeSet"보다 이해하기, 좋네요 예를 들어, "set.BinaryTree"및 "set.HashTable를,"네임 스페이스의 사용을 장려 및 "hashTableSet" 네임 스페이스는 키 공간이 인 경우보다 우아하고 자연스러운 이름이며 그룹화 된 대문자로 된 문자열 인 단어보다 눈에 잘 띄게 읽을 수 있습니다.

이제 합리적이라고 생각합니다. 그러나 SPeL의 경우 충돌이 발생합니다. 오지 오스본 블랙 안식일에 재생하는 데 사용, 그래서 모든 밴드 멤버 그래서 같은 콩 이름으로 학사 namespance를 사용합니다 :

<bean id="bs.ozzy" 
    class="sk.spring.idol.annotation.Instrumentalist" 
    p:song="Sabbath Bloody Sabbath" /> 

가 지금은 가치를 주입 한 것 블랙 안식일의 다른 회원을 가지고 SpEL을 사용하는 노래 이름. 무엇이든 오지는 내 신규 회원을 담당 할 것입니다 재생 노래 (의 토니을 가정 해 봅시다) :

public class Instrumentalist implements Performer { 

@Value("#{bs.ozzy.song}") 
private String song; 

// blabla other stuff, getters setters and so on 

}

지금 내가 무엇을 얻을 것이다

은 ...

Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'bs' cannot be found on object 

이제 어떻게? 텍스트를 이스케이프 (escaping) 할 수있는 방법이 있습니까? "이것은 bean 이름이며 이것을 속성으로 평가하지 않습니까?"

주 :

  • 코드 샘플 Dhanji의 책에서 영감을.
  • 내가 고백 - 나는 SpEL을위한 전체 문서를 읽지 못했어요는, 어쩌면 솔루션은 훨씬 간단 문맥 자체가 속성/참조로 노출되면 잘 모르겠어요

답변

0

입니다.

가 (여전히)를 찾고 있지 않다면, 당신은 단지 이름으로 빈을 조회하는 함수를 만들 수 있습니다, 그래서이 (다소)처럼 보일 것 :

@Value("#{byId('bs.ozzy').song}") 

비록 당신이 할 수있는 경우 메서드 나 맵 룩업을 통해 문자열 키로 bean을 얻으십시오. 아이디어에 대해 "meh"라고 생각합니다. IDE 기능을 잃을 가능성이 있기 때문입니다.

나는 네임 스페이스가 _ (밑줄)을 선호한다고 생각합니다. 도트를 사용하면 도트가 속성 구분 기호/메서드 호출이 될 것으로 예상되는 대부분의 항목이 망가집니다 (많은 내용).

+0

내가, 네임 스페이스가 필요하지 말아야 동의합니다 "." SPeL이 사용되면 더 이상 구분 기호로 사용됩니다. 하지만 우리는 꽤 큰 코드베이스를 가지고 있으며 이제는 SPeL을 사용하거나 재 작성해서는 안됩니다. : / – Xorty

1

이 작업을 수행 할 수 있습니다

@Value("#{ #this.getObject('bs.ozzy').song }")