어노테이션 이어서...

어제 배운건데 오늘 정리되는 마법....!! 와우

주입을 하려면 우선 객체를 생성해서 (이건 우리가 직접 생성 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";
	}				
}

 

+ Recent posts