[SPRING] Spring에서 ref 빈에 메서드를 호출 한 결과를 삽입 할 수 있습니까?
SPRINGSpring에서 ref 빈에 메서드를 호출 한 결과를 삽입 할 수 있습니까?
Spring에서 ref 빈에 메서드를 호출 한 결과를 삽입 할 수 있습니까?
두 개의 개별 프로젝트에서 잘라내어 붙여 넣은 코드를 공통 클래스로 리팩토링하려고합니다. 프로젝트 중 하나에서, 코드는 "MyClient"라고 불리는 클래스에서 살며, Spring에서 인스턴스화됩니다. 또 다른 스프링으로 인스턴스화 된 클래스 "MyRegistry"가 삽입되면 MyClient 클래스는 해당 클래스를 사용하여 끝점을 찾습니다. 정말 필요한 것은 Setter를 통해 초기화 할 수있는 리팩터링 클래스의 끝점 문자열입니다. 리팩터링 된 코드에서 MyClient의 MyRegistry에 대한 의존성을 실제로 가질 수 없습니다.
그래서, 내 질문은 ... MyRegistry 클래스에서 찾은 봄 끝점 문자열을 삽입 할 수있는 방법이 있습니다. 그래서, 나는 현재 가지고있다 :
<bean id="registryService" class="foo.MyRegistry">
...properties set etc...
</bean>
<bean id="MyClient" class="foo.MyClient">
<property name="registry" ref="registryService"/>
</bean>
그러나 나는 갖고 싶어한다 (그리고 나는 이것이 가상의 Spring 구문이라는 것을 알고있다)
<bean id="MyClient" class="foo.MyClient">
<property name="endPoint" value="registryService.getEndPoint('bar')"/>
</bean>
여기서 MyRegistry에는 getEndPoint (Stirng endPointName) 메서드가 있습니다.
희망은 내가 성취하고자하는 관점에서 의미가 있습니다. 이런 일이 봄에 가능한지 알려주세요!
해결법
-
==============================
1.가장 좋은 해결책은 @ ChssPly76에 설명 된대로 Spring 3의 표현식 언어를 사용하는 것이지만 이전 버전의 Spring을 사용하는 경우 거의 쉽습니다.
가장 좋은 해결책은 @ ChssPly76에 설명 된대로 Spring 3의 표현식 언어를 사용하는 것이지만 이전 버전의 Spring을 사용하는 경우 거의 쉽습니다.
<bean id="MyClient" class="foo.MyClient"> <property name="endPoint"> <bean factory-bean="registryService" factory-method="getEndPoint"> <constructor-arg value="bar"/> </bean> </property> </bean>
-
==============================
2.Spring Expression Language를 통해 Spring 3.0에서 가능합니다 :
Spring Expression Language를 통해 Spring 3.0에서 가능합니다 :
<bean id="registryService" class="foo.MyRegistry"> ...properties set etc... </bean> <bean id="MyClient" class="foo.MyClient"> <property name="endPoint" value="#{registryService.getEndPoint('bar')}"/> </bean>
-
==============================
3.또는 Spring 2.x에서 BeanPostProcessor를 사용하여
또는 Spring 2.x에서 BeanPostProcessor를 사용하여
public class MyClientBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware { private ApplicationContext applicationContext; public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if((bean instanceof MyClient)) && (beanName.equals("MyClient"))) { Myregistry registryService = (Myregistry) applicationContext.getBean("registryService"); ((MyClient) bean).setEndPoint(registryService.getEndPoint("bar")); } return bean; } }
그리고 BeanPostProcessor를 등록하십시오.
<bean class="br.com.somthing.MyClientBeanPostProcessor"/>
from https://stackoverflow.com/questions/2520722/is-it-possible-from-spring-to-inject-the-result-of-calling-a-method-on-a-ref-bea by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링에 의해 시작된 임베디드 H2 데이터베이스의 내용보기 (0) | 2019.01.08 |
---|---|
[SPRING] 함수의 매개 변수로 전달하지 않고 Spring에서 현재 사용자 로케일을 얻는 방법? (0) | 2019.01.08 |
[SPRING] 요청 매개 변수 '_csrf'또는 헤더 'X-CSRF-TOKEN'에서 유효하지 않은 CSRF 토큰 'null' (0) | 2019.01.08 |
[SPRING] Tomcat에서 배포 해제 메모리 누수를 피할 수있는 방법이 있습니까? (0) | 2019.01.08 |
[SPRING] Spring 애플리케이션 실행 주소가 이미 사용 중입니다. (0) | 2019.01.08 |