복붙노트

[SPRING] 동적 생성자 값을 갖는 스프링 빈

SPRING

동적 생성자 값을 갖는 스프링 빈

생성자 인수없이 완료된 Object를 생성해야합니다. 이 같은

Class A  {
  private final int timeOut
  public A(int timeout)
  {
     this.timeOut = timeout;
   }
 //...
}

이 Bean을 스프링 관리하여 나중에 Spring AOP를 사용할 수 있기를 바랍니다.

<bean id="myBean" class="A" singleton="false">
</bean>

그러나 내 bean은 동적 인 값으로 전달되기 위해서 timeout을 필요로한다. 생성자에서 동적 값을 갖는 Spring 관리 bean을 생성하는 방법이 있는가?

해결법

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

    1.BeanFactory는 javadoc에 따라 Bean 정의 자체의 인수를 겹쳐 쓰는 데 사용되는 생성자 인수를 지정할 수있는 getBean (String name, Object ... args) 메소드를 가지고 있습니다. 따라서 beans 파일에 기본값을 넣은 다음 필요할 때 "실제"런타임 값을 지정할 수 있습니다.

    BeanFactory는 javadoc에 따라 Bean 정의 자체의 인수를 겹쳐 쓰는 데 사용되는 생성자 인수를 지정할 수있는 getBean (String name, Object ... args) 메소드를 가지고 있습니다. 따라서 beans 파일에 기본값을 넣은 다음 필요할 때 "실제"런타임 값을 지정할 수 있습니다.

    <bean id="myBean" class="A" scope="prototype">
       <constructor-arg value="0"/> <!-- dummy value -->
    </bean>
    

    그리고:

    getBean("myBean", myTimeoutValue);
    

    나는 나 자신을 시도하지 않았지만 효과가있다.

    추신 scope = "prototype"은 더 이상 사용되지 않는 구문 인 singleton = "false"보다 바람직합니다. 더 명백하지만 동일한 작업을 수행합니다.

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

    2.마음에 두 가지 옵션 봄 (아무 말장련 의도) :

    마음에 두 가지 옵션 봄 (아무 말장련 의도) :

    1. 타임 아웃 팩토리를 생성하고이를 생성자 매개 변수로 사용하십시오. FactoryBean을 구현하는 bean을 생성 할 수 있으며, 다른 bean을 생성하는 것이 그 일이다. 따라서 암호화를 위해 salt를 생성하는 것이 있다면 getObject ()에서 EncryptionSalt 객체를 반환 할 수 있습니다. 귀하의 경우에는 Integer를 생성하려고합니다.

    다음은 그 예입니다 : http://www.java2s.com/Code/Java/Spring/SpringFactoryBeanDemo.htm

    2. 동적으로 설정된 int를 래핑하는 타임 아웃 빈을 생성하고 "프로토 타입"상태로 둡니다. 매번 생성됩니다. 팩토리 생성의 번거 로움 대신 EncryptionSalt 객체를 프로토 타입 빈으로 선언 할 수 있으므로 삽입 할 때마다 매번 새로운 객체가 생성됩니다. 로직을 생성자 또는 다른 곳에 배치하십시오.

    그것은 다소 시간 제한이 실제로 원하는 값에 달려 있습니다.

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

    3.명시 적으로 :

    명시 적으로 :

    interface Bean {
        void setTimeout(int timeout);
    }
    
    class BeanImpl implements Bean {
        private int timeout;
    
        @Override
        public void setTimeout(int timeout) {
            this.timeout = timeout;
        }
        ...
    }
    
    <bean id="bean" class="BeanImpl" scope="prototype">
        ...
        <!-- Nothing about timeout here -->
        ...
    </bean>
    
    class Client {
        private Bean bean;
        public void setBean(Bean bean) {
            this.bean = bean;
        }
        ...
        public void methodThatUsesBean() {
            int timeout = calculateTimeout();
            bean.setTimeout(timeout);
            ...
        }
    }
    
  4. from https://stackoverflow.com/questions/8772585/spring-bean-with-dynamic-constructor-value by cc-by-sa and MIT license