어노테이션 이어서...
어제 배운건데 오늘 정리되는 마법....!! 와우
주입을 하려면 우선 객체를 생성해서 (이건 우리가 직접 생성 Person 이나 Command 만든거 처럼 만듦)
컨테이너에 등록해야지
[등록방법]
1.xml에 빈으로 등록(이건 이제 거의 안씀) => 타입을 여러 개 등록 가능 여러 개를 찍어낼 수있음!
2.자바로 등록 (@Configuration + @Bean 으로) => 한 개?
3.컴포넌트스캔 =>내가 만든 클래스라면 주로 이 걸 사용
</context:component-scan base-package="com.kosmo.springapp" >
저번에 DI 정리 하면서 했지만 다시 정리하면
@Autowired 랑 @ Resource 은 주입할 때 사용하는 어노테이션들임!!
둘을심층적으로 파헤쳐보고 차이를 볼 것임
1.@Autowired
AutowiredController.java
servlet-context로 가서 등록!
Command 만든거에 toString 오버라이딩 해줌
@Override
public String toString() {
return String.format("[이름:%s,아이디:%s,학력:%s]",name,id,grade);
}
setvlet-C 이랑 AutowiredControlle 랑 왔다갔다 하면서 테스트 진행
* 테스트 시나리오
1-1 빈 설정 파일에 command객체 하나 등록(id속성/qualifier태그 생략)
@Autowired
private Command fCommand;
@Autowired
private Command sCommand;
하면 객체 하나가 두 번 주입되어 걍 두개가출력
1-2 빈 설정파일에 command객체 2개 등록(id설정 x)
하면 객체가 뭔지 몰라서 에러남
1-3 빈 설정파일에 command객체 2개 등록하거나 아예 없거나(id설정 x)
@Autowired(required = false) ==> 이게 붙으면 "주입이 필수가 아니다" 라는 뜻으로
만약 빈에 객체 저장 안되어 있어도 에러는 안남 걍 null 나옴
private Command fCommand;
@Autowired (required = false) ==>근데 이거 있어도 객체 2개가 있으면 오류
private Command sCommand;
2.빈 설정파일에 command객체 2개등록 중 인데 id를 각각 붙여 줌!!
@Autowired(required = false)
private Command fCommand;
@Autowired(required = false)
private Command sCommand;
에러 안나고 각각 다른 주소가 찍혀서 잘 나옴 !
**** @Autowired가 찾는순서 : 타입-> id->Qualifier
여긴 Servlet-context.xml 입니다.
DI와 관련된 어노테이션을 테스트하기 위한 빈 등록
1.@autowired를 필드에 부착 테스트 시(필드 인젝션)
<beans:bean id="fCommand" p:name="한소인" p:id="KOSMO" class="com.kosmo.springapp.basic.annotation.Command" >
<beans:property name="grade" value="대학교"/>
<beans:qualifier value="command1"/>
</beans:bean>
<beans:bean id="sCommand" p:name="나길동" p:id="NA" class="com.kosmo.springapp.basic.annotation.Command" >
<beans:qualifier value="command2"/>
</beans:bean>
2. @autowired를 세터/생성자(생략가능)에 부착 테스트
<beans:bean id="fCommand" p:name="한소인" p:id="KOSMO" class="com.kosmo.springapp.basic.annotation.Command" >
<beans:property name="grade" value="대학교"/>
</beans:bean>
<beans:bean id="sCommand" p:name="나길동" p:id="NA" class="com.kosmo.springapp.basic.annotation.Command" />
2. @Resource
ResourceController .java
@ Resource 는 id -> 타입 -> Qualifier 순서로 찾는다
필드와 세터에만 붙일 수 있다.
반드시 ioc가 되어 빈이 생성되어 있어야 한다 (쉽게말해 스프링컨테이너에 등록 되어 있어야 한다고!).
그렇지않으면 무조건 에러!!(required속성이 없어요)
@Resource만 설정 시에는 반드시 id속성과 필드명(필드 인젝션)혹은 매개변수명(세터인젝션)이 일치해야 한다.
id 속성과 필드명 혹은 매개변수명이 불일치 하더라고 name속성으로 바인딩 해서 주입가능!!
얘도 Servlet-context.xml랑 왔다갔다하면서 비교 !!
@Controller
public class ResourceController {
//얘는 required 속성이 없는 대신 name 속성으로 연결시킬 수 있다!
@Resource(name = "fCommand")
private Command fCmd;
@Resource(name = "sCommand")
private Command sCmd;
@RequestMapping("/Annotaiton/Resource.do")
public String execute(Model model) {
//데이터 저장
model.addAttribute("message",String.format("fCmd:%s,sCmd:%s",fCmd,sCmd));
//뷰정보 반환
return "annotation06/Annotation";
}
}
'학원 > SPRING' 카테고리의 다른 글
12/09 61-3 [SPRING] @SessionAttribute (1) | 2022.12.10 |
---|---|
12/09 61-2 [SPRING] @Lazy/component-scan최종정리 (0) | 2022.12.10 |
12/08 60-2 [SPRING] @어노테이션 (0) | 2022.12.08 |
12/08 60-1 [SPRING] ReturnType/DI 개념 (1) | 2022.12.08 |
12/07 59-1 [SPRING] 핸들러매핑/컨트롤러/뷰리졸버 (0) | 2022.12.07 |