13.autowired의 위치와 required 옵션
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 // 객체가 없으므로
댓글남기기