ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Annotation을 이용한 객체생성
    프로그래밍 공부/Spring 2021. 4. 30. 22:18

     

    뉴렉처 강사님의 동영상 강의를 정리한 글입니다.

     

     

    @Component

    : 객체화 하고 싶은 클래스 위에 넣어준다.

     

    xml의 context:annotation-config 설정 태그는, 객체를 생성할 때 객체 생성 코드 안에 어노테이션이 있는지 보라는 것이다.

    어노테이션을 이용하여 객체를 생성하게 되면, xml에서 객체 생성하는 코드가 제거되어 위의 설정으로는 어노테이션을 확인 할 수가 없다.

    따라서 context:component-scan 설정 태그를 추가하여, 어노테이션으로 생성되는 객체가 있는지를 확인하도록 해야 한다.

     

    <context:component-scan base-package="spring.di.ui"/>

    => spring.di.ui 패키지 안의 클래스 중 component 어노테이션이 붙은 클래스를 찾아 객체화 한다!

    객체화 할 때, 객체 생성 코드 안의 어노테이션 설정을 찾는 과정이 진행되기 때문에

    annotation-config 설정 태그는 필요 없게 된다.

     

    한편, 생성된 객체를 xml을 통해 메인함수로 받아올 때 방법은 두가지가 있다.

    1. 인터페이스를 지정하고, 지정된 인터페이스에 해당하는 객체 찾기 -> 찾아진 객체가 여러개라면 에러 발생!

    ExamConsole console = context.getBean(ExamConsole.class);

    2. 객체 이름으로 찾기

    ExamConsole console = (ExamConsole)context.getBean("console");

    => @Component 어노테이션을 통해 객체를 생성한 경우 객체의 이름이 따로 없음! @Component("console") 방법으로 이름 부여할 수 있다.

     

     

    InlineExamConsole.java

    package spring.di.ui;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;
    
    import spring.di.entity.Exam;
    
    @Component("console")
    public class InlineExamConsole implements ExamConsole {
    
    	@Autowired
    	@Qualifier("exam2")
    	private Exam exam;
    	
    	public InlineExamConsole() {
    		System.out.println("constructor");
    	}
    	
    	public InlineExamConsole(Exam exam) {
    		System.out.println("overloaded constructor");
    		this.exam = exam;
    	}
    
    	@Override
    	public void print() {
    		System.out.printf("total is %d, avg is %f\n", exam.total(), exam.avg());
    	}
    	
    	@Override
    	public void setExam(Exam exam) {
    		System.out.println("setter");
    		this.exam = exam;
    	}
    
    }
    

     

    InlineExamConsole 객체가 생성될 때 Autowired에 의해 Exam 객체를 DI 한다.

    따라서 exam 객체에도 component 어노테이션을 추가하자.

    위 코드에서 "exam2" 이름의 객체를 받아오고 있으니, @Component("exam2")를 NewlecExam 클래스 위에 넣어주면 된다.

    댓글

Designed by Tistory.