복붙노트

[SPRING] 런타임 생성자 인자를 가진 메소드에서 스프링 빈을 인스턴스화하는 방법?

SPRING

런타임 생성자 인자를 가진 메소드에서 스프링 빈을 인스턴스화하는 방법?

동적으로 들어오는 매개 변수가있는 메소드에서 Bean (EmployeeSaver)을 인스턴스화해야합니다. 이 값에 대한 생성자 setter를 사용할 수 없습니다. 설정시 채워지지 않습니다.

샘플 코드 :

class MyEmployeeBean{
    public void   saveEmployeeDetail (Employee employee , EmployeeHistory hist   ){
        EmployeeDetail detail = hist.getDetail();
        EmployeeSaver eSave = new EmployeeSaver(employee, detail)
        saver.saveEmployee();
    }
}

class EmployeeSaver {

    private Employee empl;
    private EmployeeDetail detail;

    public EmployeeSaver(Employee emp, EmployeeDetail det){

        empl = emp;
        detail = det;
    }

    public void saveEmployee(){
        // code to same the guy...
    }

}

MyEmployeeSaver 클래스에는 기본 생성자가 없으므로 런타임 예외가 발생합니다. 나는 hist.getDetail ()을 할 때까지 employeeDetail을 알 수 없으므로 다음 설정을 사용할 수 없다.

<bean id="mySaverBean" class="come.saver.EmployeeSaver">
    <constructor-arg name="empl" ref="employee" />
    <constructor-arg name="hist" ref = "employeeHistory" />
</bean>  

생성자 인수를 사용하여 employeeSaverBean을 인스턴스화하는 방법

해결법

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

    1.Spring 컨피규레이션으로 직접 할 수는 없지만,이 질문에서 설명한 것처럼 ApplicationContext.getBean (String beanName, Object ... args)을 사용하면됩니다. MyEmployeeBean은 Spring의 컨텍스트에 접근하기 위해 ApplicationContextAware를 구현해야한다.

    Spring 컨피규레이션으로 직접 할 수는 없지만,이 질문에서 설명한 것처럼 ApplicationContext.getBean (String beanName, Object ... args)을 사용하면됩니다. MyEmployeeBean은 Spring의 컨텍스트에 접근하기 위해 ApplicationContextAware를 구현해야한다.

    class MyEmployeeBean implements ApplicationContextAware {
      ApplicationContext applicationContext;
    
      void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
      }
    
      public void   saveEmployeeDetail (Employee employee , EmployeeHistory hist   ){
            EmployeeDetail detail = hist.getDetail();
            EmployeeSaver eSave = (EmployeeSaver)this.applicationContextnew.getBean("mySaverBean", employee, detail);
            saver.saveEmployee();
        }
    }
    

    beans.xml

    <bean id="mySaverBean" class="come.saver.EmployeeSaver" scope="prototype" />
    

    addo scope = "prototype"을 기억하여 Spring이 모든 요청에 ​​대해 새로운 인스턴스를 생성하도록하십시오.

  2. from https://stackoverflow.com/questions/18516874/how-to-instantiate-spring-bean-with-in-a-method-with-runtime-constructor-argumen by cc-by-sa and MIT license