복붙노트

[SPRING] 런타임시 매개 변수를 Spring으로 전달 및 전달

SPRING

런타임시 매개 변수를 Spring으로 전달 및 전달

메소드 context.getBean (name, user)의 문서에는 다음과 같이 쓰여있다.

하지만 내가 뭘할지 (모든 시도), 가장 논리적 인 설정과 함께 나는 콩이 초기화 중에로드 될 때 이것을 얻는다.

org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'fileValidator' defined in
PortletContext resource
[/WEB-INF/classes/context/customer-form-portlet.xml]: Unsatisfied
dependency expressed through constructor argument with index 0 of type
[com.liferay.portal.model.User]: Ambiguous factory method argument
types - did you specify the correct bean references as factory method
arguments?
    org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'fileValidator' defined in
PortletContext resource
[/WEB-INF/classes/context/customer-form-portlet.xml]: Unsatisfied
dependency expressed through constructor argument with index 0 of type
[com.liferay.portal.model.User]: Ambiguous factory method argument
types - did you specify the correct bean references as factory method
arguments?
<bean id="fileValidator" 
      class="cz.instance.transl.validation.file.FileValidator" 
      factory-method="createInstance" />
private FileValidator(User user) {
    this.user = user;
}

public static FileValidator createInstance(User user) {
    return new FileValidator(user);
}

주석은 당신이 할 수 있다고 말하지만, bean의 xml 정의에 생성자 인수를 지정하면 실패합니다.

해결법

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

    1.javadoc의 말 :

    javadoc의 말 :

    따라서 bean 정의는 prototype-scoped bean이어야한다.

    <bean id="fileValidator" 
          scope="prototype" 
          class="cz.instance.transl.validation.file.FileValidator" 
          factory-method="createInstance" />
    
  2. ==============================

    2.20 개의 게시물을 읽으면서 런타임에 매개 변수를 취하는 커스텀 팩토리 메소드를 얻는 방법이 분명하지 않다는 것을 발견했다. 특히 constructor-arg 태그를 사용하고 컨텍스트의 기존 빈을 setup으로 참조해야하므로 아래 클래스와 해당 클래스는 정적 팩토리 메서드로 작동합니다.

    20 개의 게시물을 읽으면서 런타임에 매개 변수를 취하는 커스텀 팩토리 메소드를 얻는 방법이 분명하지 않다는 것을 발견했다. 특히 constructor-arg 태그를 사용하고 컨텍스트의 기존 빈을 setup으로 참조해야하므로 아래 클래스와 해당 클래스는 정적 팩토리 메서드로 작동합니다.

    <bean id="user" class="something.something.User" />
    
    <bean id="fileValidator" 
          class="cz.instance.transl.validation.file.FileValidator" 
          factory-method="createInstance" >
          <constructor-args ref="user" />
    </bean>
    

    컨텍스트 밖의 constructor-arg에 사용 된 bean의 인스턴스를 가져 와서 런타임에 작업중인 값으로 채 웁니다. 이 bean은 factory-generated bean을 얻을 때 매개 변수로 사용됩니다.

    public class X {
    
       public void callFactoryAndGetNewInstance() {
          User user = context.getBean("user");
          user.setSomethingUsefull(...);
          FileValidator validator = (FileValidator)context.getBean("fileValidator");
          ...
       }
    }
    

    context.getBean (arg1, arg2)의 사용법에 대한 질문은이 방법과 관련이 없으므로이 문제는 해결되지 않는다는 점에 유의하십시오. 그 이유는 이것이 모든 빈이 싱글 톤이고이 시점에서 생성자가 호출되지 않기 때문입니다. 어쨌든 언제든지 컨텍스트에서 1 개의 사용자 bean 만 가지므로 단일 사용자 시스템에서 작업하는 경우 문제가되지 않으므로주의해야합니다.

    그러나 다중 사용자 시스템의 경우 각 실제 사용자마다 고유 한 사용자 bean이 있고 팩토리 메소드 호출에서 올바른 User bean을 사용하는지 확인해야합니다.

    다중 사용자 시스템에서이 작업을 수행하려면 bean 유형을 프로토 타입으로 변경해야하며, 팩토리를 나타내는 FileValidator의 bean (팩토리에 종속성 삽입을 계획하는 경우)과 다른 bean 새 인스턴스를 나타내는 FileValidator입니다. 둘 다 같은 유형의 클래스가되지만 각 클래스에 고유 한 이름을 지정해야합니다. 아래 참조 :

    <bean id="user" scope="prototype" class="something.something.User" />
    
    <bean id="validatorFactory"
                class="cz.instance.transl.validation.file.FileValidator">
        <constructor-arg value="something" />
    </bean>
    
    <bean id="fileValidatorBean"
                class="cz.instance.transl.validation.file.FileValidator"
        scope="prototype"
        factory-method="createInstance" >
        <constructor-arg ref="user" />
    </bean>
    

    팩토리에서이 새로운 FileValidator 빈을 얻으려는 클래스에서 다음 기술을 사용할 수 있습니다.

    public void someMethod() {
        ...
        User user = context.getBean("user");
        user.setSomethingUsefull(...);
    
        FileValidator fileValidator = 
                   (FileValidator)context.getBean("fileValidatorBean",
                                                  user);
        ...
    }
    
  3. ==============================

    3.팩토리 메소드를 호출하기 위해 Spring은 createInstance에 전달할 사용자 인스턴스에 대한 액세스가 필요합니다. 이 경우 나는 bean을 만들고 그것을 전달하고있다 :

    팩토리 메소드를 호출하기 위해 Spring은 createInstance에 전달할 사용자 인스턴스에 대한 액세스가 필요합니다. 이 경우 나는 bean을 만들고 그것을 전달하고있다 :

    <bean id="user" class="something.something.User">
    </bean>
    
    <bean id="validator" class="cz.instance.transl.validation.file.FileValidator" factory-method="createInstance">
        <constructor-arg ref="user"/>
    </bean>
    
  4. ==============================

    4.팩토리 빈 속성을 설정하는 추상 팩토리를 사용할 수도 있습니다. 여기에는 액션을 생성하는 ActionFactory가 있습니다.

    팩토리 빈 속성을 설정하는 추상 팩토리를 사용할 수도 있습니다. 여기에는 액션을 생성하는 ActionFactory가 있습니다.

    <bean id="actions_factory" class="com.imagina.control.actions.impl.ActionFactoryImpl"/>
    
    <bean id="load_person_action" class="com.imagina.control.actions.impl.LoadPersonAction" 
      factory-bean="actions_factory" factory-method="create">
      <constructor-arg value="load_person_action"/>      
    </bean>
    

    이 구성을 사용하려면 다음 사항을 고려해야합니다.

  5. from https://stackoverflow.com/questions/6784960/spring-and-passing-parameters-to-factory-method-in-runtime by cc-by-sa and MIT license