복붙노트

[SPRING] Spring에서 ref 빈에 메서드를 호출 한 결과를 삽입 할 수 있습니까?

SPRING

Spring에서 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. ==============================

    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. ==============================

    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. ==============================

    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"/>
    
  4. 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