[Spring] 자동 의존 주입
★ 자동 의존 객체 주입 스프링 설정파일에서 constructor-arg나 property를 사용하지 않아도 스프링 컨테이너가 해당되는 타입의 객체를 자동으로 주입해주는 기능 @Autowired나 @Resource 어노테이션으로 쉽게 구현할 수 있다.
★@Autowired
의존 객체가 필요한 클래스의 생성자에 @Autowired를 붙여준다
그 후 스프링 설정파일에
★@Autowired의 @Qualifier(“~”)
스프링 설정파일의 동일한 객체가 2개 이상일때
Autowired하지 못하고 Exception이 발생한다.
이런 경우에는 context.xml파일의 빈 객체 생성 시
<bean id="wordDao1" class="dao.WordDao">
<qualifier value="usedDao"/>
</bean>
해준 후 이 객체가 주입될 객체에서
@Autowired
@Qualifier("usedDao")
WordDao wordDao;
★@Autowired의 속성 중 required를 false로 설정하면 의존객체를 자동 주입할 떄 주입될 객체가 존재하지 않는 경우에 터지는 Exception을 막을 수 있다. 물론 잘 안씀
★생성자에 어노테이션을 붙일때는 그냥 붙이면 되지만 프로퍼티나 setter에 붙이고 싶은 경우에는 디폴트 생성자를 하나 만들어 줘야 한다. 일단 생성은 하고 set해줘야 하기 때문 ★@Resource @Autowired는 객체의 타입을 보고 자동으로 주입한다. 반면에 @Resource는 객체의 타입이 아니라 객체의 id값을 본다. 단 @Resource는 생성자에는 쓰지 못하고 프로퍼티나 메소드에만 쓸 수 있다. 역시 빈 생성자 하나 필요하다.
★@Autowired 작동순서
1. 타입이 같은 bean객체 검색
@Qualifier가 정의되어 있다면 그 값을 갖는 bean객체를 검색
2. 타입이 같은 bean객체가 두개 이상이면
@Qualifier로 지정한 bean객체를 찾아 주입
@Qualifier로 지정한 객체가 없으면 @Qualifier에 등록된 이름갚과
id값이 같은 bean객체를 찾음
3. 위에서 모두 매치되지 않는다면 예외발생
@Autowired(required=false)로 예외 방지가능
★@Resource는 bean의 이름을 검색하여 자동 주입(생성자에는 적용x) 디폴트 생성자를 만들어 줘야 한다.
★@Resource 적용 순서 1. name속성에 지정한 bean객체를 찾는다 2. 없으면 1. 동일 타입의 bean객체를 찾음 2. 동일 타입의 bean객체가 2개이상일 경우 같은 이름의 bean을 찾음 3. 없다면 @Qualifier를 이용하여 bean객체를 찾음
★@Inject @Autowired와 거의 비슷하지만 @Inject는 @Autowired의 required의 속성이 없다는것 뿐 사용법은 @Inject @Named(value=”bean객체의 id”)
★명시적 주입이 자동주입보다 우선순위가 높다