복붙노트

[SPRING] Spring bean 정의를 오버라이드하는 방법은 무엇입니까?

SPRING

Spring bean 정의를 오버라이드하는 방법은 무엇입니까?

위임 서비스를 사용하여 원래 서비스의 bean 정의를 재정 의하여 델리게이트 서비스 공급자를 구현하려고합니다. 그러나 이름에서 알 수 있듯이 대리 서비스는 호출을 위임 할 원래 서비스에 대한 참조가 필요합니다.

순환 참조 문제를 실행하지 않고 원래 bean def를 사용하면서 bean 정의를 재정의하는 방법을 알아내는 데 어려움이 있습니다.

예 :

<!-- Original service def in spring-context.xml -->
<bean id="service" class="com.mycompany.Service"/>

<!-- Overridden definition in spring-plugin-context.xml -->
<bean id="service" class="com.mycompany.DelegatedService"/>
    <constructor-arg ref="service"/>
</bean>

이것이 가능한가?

해결법

  1. ==============================

    1.귀하의 질문에 대한 짧은 대답은 동일한 이름의 두 가지 bean 정의를 가질 수 없다는 것입니다. 시도하면 다른 하나를 숨기고 하나의 정의 만 사용할 수 있습니다.

    귀하의 질문에 대한 짧은 대답은 동일한 이름의 두 가지 bean 정의를 가질 수 없다는 것입니다. 시도하면 다른 하나를 숨기고 하나의 정의 만 사용할 수 있습니다.

    귀하의 질문의 예제는 프록시 객체에서 래퍼가 서비스에 대한 호출을 전후로 일부 작업을 수행하면서 원래 서비스 빈을 래핑하려고 시도하고 있음을 나타냅니다. 이를 달성하기위한 한 가지 방법은 두 개의 서비스 빈을 정의하지 않고 원래 서비스 빈을 수정하지 않고 Spring AutoProxyCreator, 아마도 BeanNameAutoProxyCreator를 사용하는 것입니다.

    이렇게하면 자동으로 프록시 될 bean (또는 beans)을 나열 할 수 있습니다. 대상 빈에서 호출에 적용 할 인터셉터를 지정합니다. 당신은 당신이해야 할 일을하기 위해 이러한 인터셉터를 구현할 것입니다.

    Spring은 이전과 같이 bean id 서비스를 가지지 만 추가 기능을 사용하여 위임 프록시를 자동으로 생성합니다.

  2. ==============================

    2.프록시와 인터셉터를 생성 할 수 있습니다. 이제 bean이라는 이름의 서비스는 원래 서비스의 프록시가되어 다른 서비스로 이름을 바꿔야합니다. 따라서 변경 사항은 Spring XML로만 제한되며 Java 코드로 전파되지 않습니다.

    프록시와 인터셉터를 생성 할 수 있습니다. 이제 bean이라는 이름의 서비스는 원래 서비스의 프록시가되어 다른 서비스로 이름을 바꿔야합니다. 따라서 변경 사항은 Spring XML로만 제한되며 Java 코드로 전파되지 않습니다.

    <bean id="personTarget" class="com.mycompany.PersonImpl">
        <property name="name"><value>Tony</value></property>
        <property name="age"><value>51</value></property>
    </bean>
    
    <bean id="myAdvisor" class="com.mycompany.MyAdvisor">
        <property name="someProperty"><value>Custom string property value</value></property>
    </bean>
    
    <bean id="debugInterceptor" class="org.springframework.aop.interceptor.DebugInterceptor">
    </bean>
    
    <bean id="person" 
        class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="proxyInterfaces"><value>com.mycompany.Person</value></property>
    
        <property name="target"><ref local="personTarget"/></property>
        <property name="interceptorNames">
            <list>
                <value>myAdvisor</value>
                <value>debugInterceptor</value>
            </list>
        </property>
    </bean>
    
  3. ==============================

    3.당신이 봄 - AOP를 재발 명하려는 것 같은데. 이것을 위해 spring-AOP를 사용해보십시오.

    당신이 봄 - AOP를 재발 명하려는 것 같은데. 이것을 위해 spring-AOP를 사용해보십시오.

    프로그래밍 방식으로 기존 서비스의 이름을 변경하고 이전 이름으로 새 bean을 작성할 수 있습니다. 스프링 프레임 워크 안의 autoproxying-code는 이것을 수행하며, 여러분은 그것을 볼 수 있습니다. AutoProxy *에 대한 빠른 코드 검색은 스프링 프레임 워크에서 제공됩니다.

    또는 클라이언트 사이트 (소비자)를 제어하는 ​​경우 래퍼에 한정자를 추가하고 한정자를 사용하여 적절한 구현을 소비자에게 강요 할 수 있습니다. 래퍼는 정규화되지 않은 구현을 사용하여 원본에 액세스 할 수 있습니다. (당신이 제어하는 ​​xml 코드의 한정어로 서비스를위한 다른 bean 정의를 추가하여 원래 구현에 한정자를 역으로 마운트 할 수도 있지만, 시도하지는 않았지만 작동해야 함)

  4. ==============================

    4.부모 컨테이너에 "ref"요소의 "parent"속성을 사용하십시오. Spring 문서 (http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-ref-element)에서 자세한 예제를 찾을 수 있습니다.

    부모 컨테이너에 "ref"요소의 "parent"속성을 사용하십시오. Spring 문서 (http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-ref-element)에서 자세한 예제를 찾을 수 있습니다.

  5. ==============================

    5.이 작업을 멋지게 수행하는 방법에 대한 블로그 게시물을 작성하십시오. http://www.solubris.com/blog/overriding_spring_context_for_testing

    이 작업을 멋지게 수행하는 방법에 대한 블로그 게시물을 작성하십시오. http://www.solubris.com/blog/overriding_spring_context_for_testing

    와일드 카드 컨텍스트 정의를 사용하면 가져 오기를 사용할 필요가 없습니다.

    동일한 id를 가진 동일한 bean을 재정의하고자 할 때 부모는 작동하지 않습니다.

  6. from https://stackoverflow.com/questions/2437497/how-do-i-override-a-spring-bean-definition-yet-still-reference-the-overridden-be by cc-by-sa and MIT license