[SPRING] Spring bean 정의를 오버라이드하는 방법은 무엇입니까?
SPRINGSpring 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.귀하의 질문에 대한 짧은 대답은 동일한 이름의 두 가지 bean 정의를 가질 수 없다는 것입니다. 시도하면 다른 하나를 숨기고 하나의 정의 만 사용할 수 있습니다.
귀하의 질문에 대한 짧은 대답은 동일한 이름의 두 가지 bean 정의를 가질 수 없다는 것입니다. 시도하면 다른 하나를 숨기고 하나의 정의 만 사용할 수 있습니다.
귀하의 질문의 예제는 프록시 객체에서 래퍼가 서비스에 대한 호출을 전후로 일부 작업을 수행하면서 원래 서비스 빈을 래핑하려고 시도하고 있음을 나타냅니다. 이를 달성하기위한 한 가지 방법은 두 개의 서비스 빈을 정의하지 않고 원래 서비스 빈을 수정하지 않고 Spring AutoProxyCreator, 아마도 BeanNameAutoProxyCreator를 사용하는 것입니다.
이렇게하면 자동으로 프록시 될 bean (또는 beans)을 나열 할 수 있습니다. 대상 빈에서 호출에 적용 할 인터셉터를 지정합니다. 당신은 당신이해야 할 일을하기 위해 이러한 인터셉터를 구현할 것입니다.
Spring은 이전과 같이 bean id 서비스를 가지지 만 추가 기능을 사용하여 위임 프록시를 자동으로 생성합니다.
-
==============================
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.당신이 봄 - AOP를 재발 명하려는 것 같은데. 이것을 위해 spring-AOP를 사용해보십시오.
당신이 봄 - AOP를 재발 명하려는 것 같은데. 이것을 위해 spring-AOP를 사용해보십시오.
프로그래밍 방식으로 기존 서비스의 이름을 변경하고 이전 이름으로 새 bean을 작성할 수 있습니다. 스프링 프레임 워크 안의 autoproxying-code는 이것을 수행하며, 여러분은 그것을 볼 수 있습니다. AutoProxy *에 대한 빠른 코드 검색은 스프링 프레임 워크에서 제공됩니다.
또는 클라이언트 사이트 (소비자)를 제어하는 경우 래퍼에 한정자를 추가하고 한정자를 사용하여 적절한 구현을 소비자에게 강요 할 수 있습니다. 래퍼는 정규화되지 않은 구현을 사용하여 원본에 액세스 할 수 있습니다. (당신이 제어하는 xml 코드의 한정어로 서비스를위한 다른 bean 정의를 추가하여 원래 구현에 한정자를 역으로 마운트 할 수도 있지만, 시도하지는 않았지만 작동해야 함)
-
==============================
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.이 작업을 멋지게 수행하는 방법에 대한 블로그 게시물을 작성하십시오. http://www.solubris.com/blog/overriding_spring_context_for_testing
이 작업을 멋지게 수행하는 방법에 대한 블로그 게시물을 작성하십시오. http://www.solubris.com/blog/overriding_spring_context_for_testing
와일드 카드 컨텍스트 정의를 사용하면 가져 오기를 사용할 필요가 없습니다.
동일한 id를 가진 동일한 bean을 재정의하고자 할 때 부모는 작동하지 않습니다.
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
'SPRING' 카테고리의 다른 글
[SPRING] 다른 환경을 처리하는 주석 기반 종속성 주입 (0) | 2019.03.12 |
---|---|
[SPRING] Spring MVC에서 정확한 클라이언트 브라우저 이름과 버전을 얻는 방법은 무엇입니까? (0) | 2019.03.12 |
[SPRING] XML 스프링 스케줄링 설정에서 주석 / 코드 설정으로 이동하는 방법? (0) | 2019.03.12 |
[SPRING] 루트 컨텍스트와 디스패처 서블릿 컨텍스트가 Spring MVC 웹 애플리케이션과 정확히 얼마나 일치합니까? (0) | 2019.03.05 |
[SPRING] HTTPS / HTTP 포트를 실행하기 위해 Spring Boot를 설정하는 방법 (0) | 2019.03.05 |