programing

리프빈에 메소드를 호출한 결과를 봄부터 주입하는 것이 가능합니까?

goodsources 2023. 8. 19. 10:14
반응형

리프빈에 메소드를 호출한 결과를 봄부터 주입하는 것이 가능합니까?

리프빈에 메소드를 호출한 결과를 봄부터 주입하는 것이 가능합니까?

두 개의 개별 프로젝트에서 잘라낸/붙여넣은 코드를 공통 클래스로 리팩터링하려고 합니다.프로젝트 중 하나에서 코드는 봄부터 인스턴스화되고 있는 "MyClient"라는 클래스에 있습니다.다른 스프링 인스턴스 클래스 "MyRegistry"가 주입된 다음 MyClient 클래스는 해당 클래스를 사용하여 끝점을 검색합니다.제가 정말로 필요한 것은 리팩터 클래스의 끝점 String이며, 이는 세터를 통해 초기화될 수 있습니다.리팩터 코드에 있는 MyClient의 MyRegistry에 의존할 수 없습니다.

그래서 제 질문은...MyRegistry 클래스에서 조회된 봄부터 끝점 String을 주입할 수 있는 방법이 있습니까?그래서, 저는 현재 다음을 가지고 있습니다.

<bean id="registryService" class="foo.MyRegistry">
...properties set etc...
</bean>

<bean id="MyClient" class="foo.MyClient">
    <property name="registry" ref="registryService"/>
</bean>

하지만 저는 갖고 싶습니다 (그리고 이것이 상상의 봄 구문이라는 것을 알고 있습니다)

<bean id="MyClient" class="foo.MyClient">
    <property name="endPoint" value="registryService.getEndPoint('bar')"/>
</bean>

My Registry에 getEndPoint(Stirring endPointName) 메서드가 있는 위치

제가 성취하고자 하는 것의 관점에서 그것이 말이 되기를 바랍니다.봄에 이런 일이 가능한지 알려주세요!

Spring 3.0에서는 Spring Expression Language를 통해 가능합니다.

<bean id="registryService" class="foo.MyRegistry">
...properties set etc...
</bean>

<bean id="MyClient" class="foo.MyClient">
  <property name="endPoint" value="#{registryService.getEndPoint('bar')}"/>
</bean>

가장 좋은 해결책은 @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.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;
    }
}

그리고 BeanPost Processor를 등록합니다.

<bean class="br.com.somthing.MyClientBeanPostProcessor"/>

언급URL : https://stackoverflow.com/questions/2520722/is-it-possible-from-spring-to-inject-the-result-of-calling-a-method-on-a-ref-bea

반응형