오늘은 지난번 포스팅에 이어서 spring의 어노테이션 중 하나인 Component에 대해 공부해볼까 합니다.
이번에는 <context:component-scan>이라는 태그를 사용해서 객체생성과 값 연결을 같이 해보도록 하겠습니다.
패키지를 만들러 가봅시다.
TV.java(interface)
package com.test03;
public interface TV {
void powerOn();
void powerOff();
void volumeUp();
void volumeDown();
}
IgTV.java
package com.test03;
public class IgTV implements TV {
public IgTV() {
System.out.println("ig tv 생성");
}
@Override
public void powerOn() {
System.out.println("ig tv power on");
}
@Override
public void powerOff() {
System.out.println("ig tv power off");
}
@Override
public void volumeUp() {
System.out.println("ig tv volume up");
}
@Override
public void volumeDown() {
System.out.println("ig tv voluem down");
}
}
SamsongTV.java
package com.test03;
public class SamsongTV implements TV{
public SamsongTV() {
System.out.println("samsong tv 생성");
}
@Override
public void powerOn() {
System.out.println("samsong tv power on");
}
@Override
public void powerOff() {
System.out.println("samsong tv power off");
}
@Override
public void volumeUp() {
System.out.println("samsong tv volume up");
}
@Override
public void volumeDown() {
System.out.println("samsong tv volume down");
}
}
MTest.java
package com.test03;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MTest {
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("com/test03/applicationContext.xml");
TV samsong = factory.getBean("samsong", TV.class);
samsong.powerOn();
samsong.volumeUp();
samsong.volumeDown();
samsong.powerOff();
TV ig = (TV) factory.getBean("igTV");
ig.powerOn();
ig.volumeUp();
ig.volumeDown();
ig.powerOff();
}
}
applicationContext.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/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.test03"></context:component-scan>
</beans>
오늘의 코드 실행결과는 가장 마지막에 쓰겠습니다.
저번에 공부했던 내용을 잠시 복습해보자면
Spring framework에서 annotation을 사용하기위한 4가지의 설정이 있었는데
1. CommonAnnotationBeanPostProcessor 클래스를 설정파일에 bean객체로 등록
2. <context:annotation-config> 태그를 이용
3. <context:componet-scan base-package="" /> 태그를 이용
4. <mvc:annotation-driven /> 을 이용
이 중에서 3번을 이용하여 오늘 annotation을 사용해보겠습니다.
가장먼저 applicationContext.xml 파일에서 package를 지정해줘야 하는데 위에서 보면 알 수 있듯
<context:component-scan base-package="com.test03"> 태그를 사용하여 com.test03 패키지 밑에있는 파일은 다 읽어서 annotation이 있으면 그에 맞는 기능을 쓰겠다 라는 의미입니다.
위를 실행하면 바로 에러가 납니다.
바로 'samsong', 'igTV'이라는 bean 객체가 생성이 되지 않았기 때문인데요
기존에 해왔던대로라면 applicationContext.xml에 <bean>태그를 넣고 객체를 만들고 그 객체에 값을 넣고 해야합니다.
하지만 annotation을 사용하면 보다 간편하게 객체를 만들고 값을 넣어줄 수 있습니다.
이 때 사용해야할 것은@Component라는 annotation입니다.
@Component는 해당 클래스를 bean으로 등록을 시켜줍니다.
사용방법은 해당 클래스 위쪽에 @Component만 써주면 됩니다. ㅎㅎ 참 쉽죠
이렇게 써주면 IgTV igTV = new IgTV( ); 형태를 사용해 주는것과 같은 의미를 가집니다.
이 때 객체명은 class이름에서 맨 앞철자만 소문자로 합니다.
그렇다면 객체이름을 바꿔서 넣고싶을 땐 어떻게 해야할까요??
마찬가지로 @Component를 써주고 괄호안에 자신이 설정하고싶은 이름을 지정해주면 됩니다.
이는 마찬가지로 SamsongTV samsong = new SamsongTV( ); 형태의 객체를 만들어 준다고 할 수 있습니다.
그렇다면 이제 코드 실행결과를 볼까요?
applicationContext에 객체를 따로 생성하지 않아도 잘 작동하는것을 볼 수 있습니다.
'Java > Spring' 카테고리의 다른 글
[Spring] 12 -1 AOP 적용하기 ( Namespace - aop) (0) | 2021.07.04 |
---|---|
[Spring] 12. AOP - 기본 개념 ( CC, CCC, Joinpoint, ...) (0) | 2021.07.03 |
[Spring] 10. Annotation - autowired (0) | 2021.06.25 |
[Spring] 09. MessageSource (메시지 국제화) (0) | 2021.06.24 |
[Spring] 08. <bean> 속성 사용하기 - Autowire (0) | 2021.06.23 |