복붙노트

[SPRING] 봄 무시 무시한 콩

SPRING

봄 무시 무시한 콩

XML에 언급 된 동일한 bean id에 대해 중복 이름을 사용할 수 있습니까? 그렇지 않다면 Spring에서 bean을 어떻게 오버라이드 할까?

해결법

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

    1.주어진 Spring 컨텍스트는 주어진 id 나 name에 대해 하나의 bean만을 가질 수 있습니다. XML id 속성의 경우 이는 스키마 유효성 검사에 의해 시행됩니다. name 속성의 경우, 이것은 Spring의 로직에 의해 강제된다.

    주어진 Spring 컨텍스트는 주어진 id 나 name에 대해 하나의 bean만을 가질 수 있습니다. XML id 속성의 경우 이는 스키마 유효성 검사에 의해 시행됩니다. name 속성의 경우, 이것은 Spring의 로직에 의해 강제된다.

    그러나 컨텍스트가 두 개의 서로 다른 XML 설명자 파일로 구성되고 ID가 두 파일에서 모두 사용되면 하나는 다른 하나를 "대체"합니다. 정확한 동작은 컨텍스트에 의해로드 될 때 파일의 순서에 따라 다릅니다.

    따라서 가능한 경우에는 권장하지 않습니다. 오류가 발생하기 쉽고 깨지기 쉽기 때문에 ID의 ID를 변경하면 Spring의 도움을받지 못합니다.

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

    2.만약 bean이 사용하는 프라퍼티를 덮어 쓰는 것이 필요하다면, id 접근법은 skaffman이 설명했던 것처럼 작동한다고 덧붙일 것이다.

    만약 bean이 사용하는 프라퍼티를 덮어 쓰는 것이 필요하다면, id 접근법은 skaffman이 설명했던 것처럼 작동한다고 덧붙일 것이다.

    처음으로 호출 된 XML 구성 파일에서 다음을 수행하십시오.

       <bean id="myBeanId" class="com.blabla">
           <property name="myList" ref="myList"/>
       </bean>
    
       <util:list id="myList">
           <value>3</value>
           <value>4</value>
       </util:list>
    

    두 번째 호출되는 XML 구성 파일에서 다음을 수행하십시오.

       <util:list id="myList">
           <value>6</value>
       </util:list>
    

    그런 다음 bean "myBeanId"는 하나의 요소 인 "myList"특성으로 인스턴스화됩니다 (6).

  3. ==============================

    3.공식 스프링 매뉴얼의 예 :

    공식 스프링 매뉴얼의 예 :

    <bean id="inheritedTestBean" abstract="true"
        class="org.springframework.beans.TestBean">
      <property name="name" value="parent"/>
      <property name="age" value="1"/>
    </bean>
    
    <bean id="inheritsWithDifferentClass"
          class="org.springframework.beans.DerivedTestBean"
          parent="inheritedTestBean" init-method="initialize">
      <property name="name" value="override"/>
      <!-- the age property value of 1 will be inherited from  parent -->
    </bean>
    

    그게 네가 찾고 있던거야?

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

    4.그게 정확히 필요한 것인지 확신 할 수는 없지만 실행중인 환경과 각 환경에 맞는 특정 bean을 정의하기 위해 프로파일을 사용하고 있습니다.

    그게 정확히 필요한 것인지 확신 할 수는 없지만 실행중인 환경과 각 환경에 맞는 특정 bean을 정의하기 위해 프로파일을 사용하고 있습니다.

    <bean name="myBean" class="myClass">
        <constructor-arg name="name" value="originalValue" />
    </bean>
    <beans profile="DEV, default">
         <!-- Specific DEV configurations, also default if no profile defined -->
        <bean name="myBean" class="myClass">
            <constructor-arg name="name" value="overrideValue" />
        </bean>
    </beans>
    <beans profile="CI, UAT">
         <!-- Specific CI / UAT configurations -->
    </beans>
    <beans profile="PROD">
         <!-- Specific PROD configurations -->
    </beans>
    

    따라서이 경우 프로파일을 정의하지 않거나 "DEV"로 정의하면 myBean은 이름 인수로 "overrideValue"를 가져옵니다. 그러나 프로필을 "CI", "UAT"또는 "PROD"로 설정하면 "originalValue"가 값으로 사용됩니다.

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

    5.빈 오버라이드에 대한 또 다른 접근법은 별명을 통한 접근입니다. 이 블로그 기사에서는 이러한 접근 방식에 대해 설명합니다.

    빈 오버라이드에 대한 또 다른 접근법은 별명을 통한 접근입니다. 이 블로그 기사에서는 이러한 접근 방식에 대해 설명합니다.

  6. ==============================

    6.다른 게시물에서 언급되지 않은 또 다른 좋은 접근법은 PropertyOverrideConfigurer를 사용하여 일부 빈의 속성을 덮어 쓰려고 할 때 사용할 수 있습니다.

    다른 게시물에서 언급되지 않은 또 다른 좋은 접근법은 PropertyOverrideConfigurer를 사용하여 일부 빈의 속성을 덮어 쓰려고 할 때 사용할 수 있습니다.

    예를 들어 다른 XML 설정에서 테스트 용 데이터 소스 (예 : 인 메모리 데이터베이스 사용)를 무시하려면 새 설정에서 를 사용해야하고 .properties 파일 beanName.property = newvalue 형식을 취하는 키 - 값을 포함하여 주 소품을 대체합니다.

    application-mainConfig.xml :

    <bean id="dataSource" 
        class="org.apache.commons.dbcp.BasicDataSource" 
        p:driverClassName="org.postgresql.Driver"
        p:url="jdbc:postgresql://localhost:5432/MyAppDB" 
        p:username="myusername" 
        p:password="mypassword"
        destroy-method="close" />
    

    application-testConfig.xml :

    <import resource="classpath:path/to/file/application-mainConfig.xml"/>
    
    <!-- override bean props -->
    <context:property-override location="classpath:path/to/file/beanOverride.properties"/>
    

    beanOverride.properties:

    dataSource.driverClassName=org.h2.Driver
    dataSource.url=jdbc:h2:mem:MyTestDB
    
  7. ==============================

    7.다른 참조 e.x를 위해 다른 xml에서 동일한 bean id를 선언 할 수 있는지 여부.

    다른 참조 e.x를 위해 다른 xml에서 동일한 bean id를 선언 할 수 있는지 여부.

    Servlet-Initialize.xml

    <bean id="inheritedTestBean"   class="org.springframework.beans.TestBean">
      <property name="name" value="parent"/>
      <property name="age" value="1"/>
    </bean>
    

    기타 xml (Document.xml)

    <bean id="inheritedTestBean"  class="org.springframework.beans.Document">
      <property name="name" value="document"/>
      <property name="age" value="1"/>
    </bean>
    
  8. from https://stackoverflow.com/questions/5849192/springs-overriding-bean by cc-by-sa and MIT license