1. 어노테이션을 통한 빈 객체 생성
class InlineExamConsole
{
@Autowired
public void setExam(Exam exam){
this.exam=exam;
}
}
--------------------------------------------------
<!-- pom.xml -->
<context:annotation-config />
<bean id="exam" class="entity.NewlecExaml"/>
<bean id="console" class="ui.InlineExamConsole"/>
지금까지는 xml에서 bean 객체를 생성하고 이를 Autowired 어노테이션을 통해 받아왔었다.
하지만 좀 불편하다.
xml없이 어노테이션을 이용하여 코드 내부에서 객체를 생성해보자.
@Component
class InlineExamConsole
{
@Autowired
public void setExam(Exam exam){
this.exam=exam;
}
}
--------------------------------------------------
<!-- pom.xml -->
<context:component-scan base-package="spring.di.ui"/>
<bean id="exam" class="entity.NewlecExaml"/>
위와같이 @component 어노테이션을 이용하면 xml에서 bean 객체 생성 없이도 코드 내에서 객체 생성이 가능하다.
단, <context:component-scan base-package="spring.di.ui"/> 를 반드시 삽입하여야 한다.(없으면 에러 발생)
이 코드는 spring.di.ui 라는 패키지 내의 클래스를 훑어보고 Component 클래스가 있으면 객체화 시키라는 의미이다.
원래의 <context:annotation-config />는 지워도 문제없이 동작한다.
2. 코드에서 사용시 주의점
ExamConsole console = (ExamConsole) context.getBean("console");
xml을 통한 bean 객체 생성시에는 id 값이 있었기 떄문에 위와같은 코드가 문제가 없었다.
하지만 Component로 코드 내에서 bean 객체를 생성했을 때는 명시된 id가 없기 때문에 문제가 발생한다.
해결방안 1. 자료 형식 입력
ExamConsole console = (ExamConsole) context.getBean(ExamConsole.class);
위와같이 이름 대신 자료 형식을 대입해준다.
해결방안 2. Component에 이름 부여
@Component("console")
class InlineExamConsole
{
@Autowired
public void setExam(Exam exam){
this.exam=exam;
}
}
이제는 위에서 처럼 자료 형식이 아닌 이름을 통해서도 빈 객체를 생성해낼 수 있다.
3. 패키지가 다른 여러 Component 클래스들을 빈 객체로 만드는 방법
<!-- pom.xml -->
<context:component-scan base-package="spring.di.ui, spring.di.entity"/>
빈객체로 만들 Component 클래스가 들어간 패키지들을 모두 입력한다.(쉼표로 구분)
※주의점
종종 위에 입력한 패키지들 중 특정 Component가 바인딩되지 않는 경우가 발생한다.
이는 @Autowired(required=false)를 적용했을 때로 이를 true 혹은 그냥 @Autowired로만 사용하면 해결된다.
'뉴렉쳐 스프링 프레임워크 정리' 카테고리의 다른 글
[17강] XML Configuration을 Java Configuration으로 변경하기 (0) | 2023.06.11 |
---|---|
[16강] 특화된 @Component 어노테이션(@Controller/@Service/@Repository) (0) | 2023.06.10 |
[14강] @Autowired의 위치와 Required 옵션 (0) | 2023.06.10 |
[13강] @Autowired의 동작방식 이해와 @Qualifier 사용하기 (0) | 2023.06.10 |