Items인터페이스를 구현받는 StarBucks클래스 생성
오늘 예제에서는 기존에 사용했던 방식이 아닌 어노테이션을 통하여 객체를 주입시키는 방법이다.
그러기 위해서는 먼저 context.xml파일 설정 -> Namespaces -> context 설정
<!-- 따로 bean을 만들지 않고 자동으로 객체를 생성하기 위해서는 context:component-scan에 요소 정의 -->
beans 태그 내부에
xmlns:context="http://www.springframework.org/schema/context" 추가된것을 볼 수 있다.
<context:component-scan base-package="com.jdh.test"></context:component-scan>
패키지 경로는 베이스가 되는 패키지로 설정(그러면 그 패키지 안의 모든 클래스를 사용)
컴포넌트 스캔을 통하여 빈 객체를 등록하지 않고도 사용할 객체들을 자동으로 생성한다.
사용할 클래스에 @Component("이름") 설정 => 그러면 컴포넌트 스캔에서 해당 어노테이션을 찾아서 객체 생성
@Component("starbucks")
public class StarBucks implements Items {
사용할 메인 클래스에 해당 컴포넌트 명을 맞춰야한다.
AbstractApplicationContext context = new GenericXmlApplicationContext("context.xml");
// Spring Container로부터 빈 객체 요청
Items item = (Items)context.getBean("starbucks");
의존성 주입 어노테이션
@Autowried 주로 멤버변수를 지정 // 해당 타입의 객체를 찾아서 자동으로 할당
=> 타입을 이용하여 의존성 주입
즉, 동일한 타입의 객체가 여러개일 경우, @Autowried는 @Qualifier ("carrot")
@Qualifier 특정 객체의 이름을 이용하여 의존성 주입
@Inject Autowried와 동일한 기능
@Resource => Autowried와 Qualifier을 합친것
@Resource(name="carrot")와 같이 한번에 지정할 수 있다.
=> 객체 이름을 이용하여 의존성 주입
** 따라서 @Autowried가 있는 멤버변수의 타입과 동일한 타입을 갖는 객체가 1개만 존재할 경우에는
@Autowried 를 사용.
여러개일 경우에는 @Resource 사용
@Autowried
생성자나 메서드, 멤버변수 위에 모두 사용가능, 하지만 주로 멤버변수 위에 선언하여 사용
ex)스타벅스 클래스의 전역변수
@Component("starkbucks")
public class StarkBucks implements Items {
@Autowired
private Cake cake
@Autowired를 사용하기 때문에 위의 스타벅스 클래스에서 setter메서드는 필요가없다.
또한 현재 Cake cake에 대한 메모리 설정을 하지 않았기 때문에 xml파일에 해당 객체에 대한 정보를 주입해야한다.
<bean id="chessCake" class="com.jdh.test.CheeseCake"></bean>
마찬가지로 @Component('id이름")를 통하여 해당 객체를 찾은 후에 @Autowired가 붙은 객체를 찾아간다.
Autowired는 이처럼 객체가 하나일때는 사용이 가능하지만 값이 2개이상이 된다면 에러가 발생한다.
정확히 어떤 정보를 주입한다는 정의를 하지 않았기 때문.
그럴때 사용하는 어노테이션이 @Qualifier
@Qualifier("사용할id값")
=> 주로 @Autowired와 같이 사용된다.
만약 xml파일에 빈 객체가 이와같이 등록되어있다면.
<bean id="chessCake" class="com.jdh.test.CheeseCake"></bean>
<bean id="carrot" class="com.jdh.test.CarrotCake"></bean>
스타벅스 클래스에 Autowired로 설정된 변수에 값이 제대로 주입되지 않는다.
정확히 어떤값을 주입시키겠다는 설정을 하지 않았기 때문
@Component("starkbucks")
public class StarkBucks implements Items {
@Autowired
@Qualifier("carrot")
private Cake cake
이와같이 사용하여 carrot객체가 주입 받을 수 있게 설정!!!
이 두 어노테이션을 합친게 @Resource(name="사용할아이디값")
위 코드를 이와같이 수정할 수 있다.
@Component("starkbucks")
public class StarkBucks implements Items {
@Resource(name="carrot")
private Cake cake
기능은 동일하다.
XML 설정과 어노테이션을 병행하면서 사용하기
XML파일(치즈케이크 클래스 사용)
<context:component-scan base-package="com.jdh.test"></context:component-scan>
<bean class="com.jdh.test.CheeseCake"></bean>
치크케이크 상단에 @Component("cheeseCake") 추가되어있는거 확인했고,
스타벅스 클래스의 멤버변수의 어노테이션을 다시 @Autowired로 바꿔준다.
CheeseCake클래스를 사용하는데 이때 선언했던 @Component("cheeseCake") 지워준다.
빈 객체에 이름이 설정되어있지않기 때문에 지우지않고 실행시키면 에러가 나온다.
케이크 부분을 보면 객체를 사용하지 않아도 해당 메서드를 호출 할 수 있다.
추가 어노테이션
Controller 관련 => @Controller
: 사용자의 요청을 제어하는 Controller클래스에 설정
Service 관련 => @Service
: 비즈니스 로직을 처리하는 Service클래스에 설정
DAO 관련 => @Respository
: 데이터베이스 연동을 처리하는 DAO클래스
** 위 3가지 어노테이션은 @Component를 상속 받는다.
Spring에서는 각각의 영역이 확실하게 분리되어있다.
Presentation Layer(MVC)에서는 사용자의 요청을 제어(Controller)
Bussiness Layer(IoC,AOP)에서 실질적인 비즈니스 로직 처리(ServiceImpl)
추가 어노테이션 실습)
'Learn > KH정보교육원' 카테고리의 다른 글
[KH정보교육원 당산] 68일 (Spring - JDBC / AOP ) (0) | 2021.06.17 |
---|---|
[KH정보교육원 당산] 연습문제 8(요구사항확인) (0) | 2021.06.17 |
[KH정보교육원 당산] 66일 (SpringFramework - DI) (0) | 2021.06.15 |
[KH 정보교육원 당산] 65일 (SpringFramework) (0) | 2021.06.14 |
[KH정보교육원 당산] 64일(Spring_Simple_Board // 상세보기,수정,삭제,검색) (0) | 2021.06.12 |