목표
xml 대신 @Component 어노테이션을 사용하여 객체를 생성한다.
(@Component = @Controller, @Service, @Repository)
기존 xml 객체 생성 방식
<!-- setting.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id="exam" class="spring.di.entity.NewLecExam"/>
<bean id="console" class="spring.di.ui.GridExamConsole"/>
<beans>
public class GridExamConsole implements ExamConsole {
private Exam exam;
...(생략)...
@Autowired
@Override
public void setExam(Exam exam) {
this.exam=exam;
}
}
여기서 console이라는 id를 가진 Dependency를 어노테이션을 활용해 생성해보자.
@Componet 어노테이션을 활용한 객체 생성 방식
<!-- setting.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="spring.di.ui, spring.di.entity"/>
<bean id="exam" class="spring.di.entity.NewLecExam"/>
<beans>
//컴포넌트 이름 지정 안 해주면 Class 네임으로 IoC 컨테이너에서 가져와야 함
@Component("console")
public class GridExamConsole implements ExamConsole {
private Exam exam;
...(생략)...
@Autowired
@Override
public void setExam(Exam exam) {
this.exam=exam;
}
}
public class Program {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring/di/setting.xml");
ExamConsole console = (ExamConsole) context.getBean("console");
//ExamConsole console = (ExamConsole) context.getBean(ExamConsole.class);
//만약 Component에 이름을 지정하지 않았다면 2번째 방식으로 호출해야 한다.
console.print();
}
}
먼저 xml에서 context 네임스페이스에 있는 context:component-scan 태그를 사용해, 어떤 패키지에 있는 클래스들 중
@Componet(또는 @Bean) 어노테이션을 통해 생성할 객체를 찾게한다.(@Bean은 나중에 설명하겠다.)
base-package 속성에 객체로 사용할 컴포넌트들이 있는 패키지 경로를 입력해주는데, 2개 이상인 경우 ',(콤마)'로 구분한다.
@Component는 클래스 자체를 하나의 DI할 하나의 객체로 만들 때 사용하는 어노테이션으로,
괄호를 통해 xml에서 id를 지정해주었듯이 id를 설정해줄 수 있다.
기본 값 설정을 위한 @Value 어노테이션
@Component
public class NewlecExam implements Exam{
@Value("20")
private int kor;
@Value("30")
private int eng;
private int math;
private int com;
...(생략)...
}
컴포넌트의 필드에 기본 값을 설정해주고 싶다면 위와 같은 방식으로 @Value 어노테이션을 사용한다.
@Component와 동일한 어노테이션
@Controller, @Service, @Repository는 @Component와 동일한 기능을 수행한다.
단지 객체화 하고자 하는 클래스가 어떠한 역할을 하고 있는지 명시화할 뿐이다.
현업에서는 위의 명시화가 중요하기 때문에 @Component 어노테이션을 쓰지않고 역할에 따라 위 3가지 어노테이션을 사용한다.
'뉴렉쳐 스프링 프레임워크 정리 > Part1. DI' 카테고리의 다른 글
[Spring 개념정리] Java를 통한 Configuration (0) | 2023.07.14 |
---|---|
[Spring 개념정리] @Autowired 어노테이션을 이용한 DI (0) | 2023.07.14 |
[Spring 개념정리] xml을 사용한 DI 및 IoC 컨테이너 사용법2 (0) | 2023.07.14 |
[Spring 개념정리] xml을 사용한 DI 및 IoC 컨테이너 사용법 (0) | 2023.07.14 |
[Spring 개념정리] DI와 IoC Container (0) | 2023.07.14 |