Spring Dependency Injection(DI)

업데이트:

Dependency Injection(DI) 1

  • 구체적인 의존 오브젝트와 그것을 사용할 주체, 클라이언트를 런타임 시에 연결해주는 작업이다.
  • Constuctor Injection을 기반으로 Optional한 경우 Setter Injection을 활용 하는 것을 지향한다.
  • Field Injection은 final keyword를 사용 할 수 없어 가변적이고, 해당 클래스를 바로 Instance화 시킬 수 없는 등의 문제로 인해서 안티패턴으로 사용을 지양해야 한다.
public class BeanObject {
  private String name;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}
public class OtherBeanObject {
  private BeanObject beanObject;
  public BeanObject getBeanObject() {
    return beanObject;
  }
  public void setBeanObject(BeanObject beanObject) {
    this.beanObject = beanObject;
  }
}

Field Injection

@Component
public class FieldInjection {
  @Autowired
  private BeanObject beanObject;
}

Setter-based Injection

@Component
public class SetterInjection {
  private BeanObject beanObject;
  // Inject to field variable using Setter Injection.
  @Autowired
  private void setBeanObject(BeanObject beanObject) {
    this.beanObject = beanObject;
  }
  // Inject into the parameter of the method using Setter Injection.
  @Bean
  private OtherBeanObject otherBeanObject(@Qualifier("beanObject") BeanObject beanObject) {
    OtherBeanObject otherBeanObject = new OtherBeanObject();
    otherBeanObject.setBeanObject(beanObject);
    return otherBeanObject;
  }
}

Constuctor-based Injection

@Component
public class ConstructorInjection {
  private BeanObject beanObject;
  // @Autowired
  // Constructor dependency injection can omit @Autowired from Spring 4.3.
  public ConstructorInjection(BeanObject beanObject) {
    this.beanObject = beanObject;
  }
}

Reference

댓글남기기