1 분 소요

Autowired의 위치와 Required의 옵션

 

  • Autowired의 위치는 세군데 설정을 할 수 있다

setter 위에 말고/ 필드 위/ 오버로드 생성자위 에 사용 할 수 있다

public class GridExamConsole implements ExamConsole {
@Autowired
	private Exam exam; // 기본 생성자에서 객체 바인딩

@Autowired
	public GridExamConsole(Exam exam) { //오버로드 생성자에서 바인딩
		this.exam = exam;
	}
 @Autowired
    public void setExam(Exam exam) {
		this.exam = exam;
	}

 

  • 기본 생성자에서 객체 바인딩 하기
	@Autowired
	@Qualifier("exam2")
	private Exam exam;

	public InlineExamConsole() {
		// TODO Auto-generated constructor stub
	}

위와 같은 경우 private인데 injection이 될까?

아래의 기본 생성자를 호출하면서 injection이 된다

	@Autowired
	@Qualifier("exam2")
	private Exam exam;

	public InlineExamConsole() {
			System.out.println("constructor");
	}

constructor

 

  • setter에서 바인딩하기
    @Override
      @Autowired
      @Qualifier("exam2")
      public void setExam(Exam exam) {
          System.out.println("setter");
          this.exam = exam;
      }
    
    setter
    

만약 기본 생성자가 없다면????

	@Autowired
	@Qualifier("exam2")
	private Exam exam;

//	public InlineExamConsole() { 기본 생성자
//		System.out.println("constructor");
//	}

	public InlineExamConsole(Exam exam) {
		System.out.println("overload");
		this.exam = exam;
	}

@Override
	@Autowired
	@Qualifier("exam2")
	public void setExam(Exam exam) {
		System.out.println("setter");
		this.exam = exam;
	}

}

기본 생성자가 없어 발생하는 에러가 나타난다

 

  • 오버로드 생성자 없애기


	@Autowired
	@Qualifier("exam2")
	private Exam exam;

//	public InlineExamConsole() { 기본 생성자
//		System.out.println("constructor");
//	}

	// public InlineExamConsole(Exam exam) { 오버로드 생성자
	// 	System.out.println("overload");
	// 	this.exam = exam;
	// }

@Override
	@Autowired
	@Qualifier("exam2")
	public void setExam(Exam exam) {
		System.out.println("setter");
		this.exam = exam;
	}

}
setter

기본 생성자 없이 하려면 오버로드 생성자가 없다면 컴파일러가 알아서 기본 생성자를 생성한다

만약 기본생성자를 통해서 실행되는 것은 오버로드 생성자에 넣을 수 있다


	@Autowired
	@Qualifier("exam2")
	public InlineExamConsole(Exam exam) {
		System.out.println("overload");
		this.exam = exam;
	}

Qualifier에 빨간 줄이 생성되는데 setter와 기본생성자는 값을 하나면 설정 가능한데 오버로드 생성자의 경우 하나가 아닌 여러개가 가능 하기 때문에 빨간 줄이 표시가 된다


@Autowired
	public InlineExamConsole(@Qualifier("exam2") Exam exam) { 
		System.out.println("overload");
		this.exam = exam;
	}


overload

 

 

오버로드 생성자의 옵션

객체가 없으면 없는데로 로직을 실행 할 수 없는지?

  • required
@Autowired(required = false)
	@Qualifier("exam2")
	private Exam exam;

	public InlineExamConsole() {
		System.out.println("constructor");
	}


	public InlineExamConsole(@Qualifier("exam2") Exam exam) {
		System.out.println("overload");
		this.exam = exam;
	}

	@Override // 이부분을 옵션으로 사용하고 싶다
	public void print() {
		if (exam == null)
			System.out.printf("total is %d, avg is %f\n", 0, 0.0); 
		else
			System.out.printf("total is %d, avg is %f\n", exam.total(), exam.avg());

	}


	public void setExam(Exam exam) {
		System.out.println("setter");
		this.exam = exam;
	}

}

constructor

total is 0, avg is 0.000000 // 객체가 없으므로

카테고리:

업데이트:

댓글남기기