SPRING BASIC_02 :: AUTO DI

Dev-O·2021년 9월 9일
1

Spring

목록 보기
2/11

📌 어노테이션을 사용한 의존자동주입

@Autowired || @Qualifier || @Resource

  1. XM설정에 <context:annotation-config/> 설정 추가
  2. 필요 클래스의 bean 생성

❗️xml설정예시 - 같은 클래스의 객체 bean을 두개 생성(MemberDao)

<context:annotation-config/><!-- 어노테이션 설정을 읽어들여라 -->
	
	<bean id ="memberDao1" class="spring.MemberDao"></bean>
	<bean id ="memberDao2" class="spring.MemberDao">
		<qualifier value ="secondDao"/>
	</bean>
	<bean id="memberRegSvc" class="spring.MemberRegisterService"></bean>
	<bean id="changePwdSvc" class="spring.ChangePasswordService"></bean>
	<bean id ="memberPrinter" class="spring.MemberPrinter"></bean>
	<bean id ="memberListPrinter" class="spring.MemberListPrinter"></bean>
	<bean id = "memberInfoPrinter" class="spring.MemberInfoPrinter"></bean>
	<bean id = "versionPrinter" class="spring.VersionPrinter"></bean>
	

<context:annotation-config> 태그는 다음의 클래스를 Bean으로 등록해준다.

  1. AutowiredAnnotationBeanPostProcessor
    • @Autowired에 대한 의존주입처리
  2. RequiredAnnotationBeanProcessor
    • @Required에 대한 의존주입처리
  3. ConfigurationClassPostProcessor
    • @Configuration에 대한 설정처리
  4. CommonAnnotationBeanPostProcessor
    • JSR-250(@PostConstruct등에 대한 라이프사이클 처리)

📌 의존자동주입 사용방법

  • @Qualifier는 자동의존주입 시 사용할 객체를 선택해준다.
    스프링설정파일에 태그로 이름지정

  • @Autowired("name")을 선택해 주입

  • @Autowired/ @Qualifier 예시 - FEILD위에 선언

	@Autowired //자동주입
	@Qualifier("memberDao1") //어떤 bean인지 식별
	private MemberDao memberDao; //Feild
  
  • 예시처럼 선언해주면 xml파일에 명시적으로 의존주입해주지 않아도 사용가능하다. SpringFramework가 신기한 첫 번째 순간!

☝🏻 Tip++;
이렇게 어노테이션에 커서 갖다 대면 어디에 어노테이션 붙일 수 있는지 나오니까 참고하도록!


@Autowired동작순서

  1. 타입이 같은 빈객체를 검색
    • 타입이 같은 bean객체가 하나면 그 객체 사용
    • @Qualifier가 정의 되어 있으면 같은 값을 갖는 bean객체
  2. 타입이 같은 bean객체가 두 개 이상 존재하면
    • @Qualifier로 지정한 bean객체를 찾아 주입
    • @Qualifier로 지정된 객체가 없다면 이름이 같은 bean객체를 가짐
  3. 위에서 매치되는 bean객체를 찾지못할 경우 스프링은 예외를 발생

@Resource를 사용한 의존자동주입

  • Resource 어노테이션은 bean의 이름을 검색해 자동주입
  • 자동주입대상에 @Resource 어노테이션 사용
@Resource //setter에 자동주입
public void setMemberPrinter(MemberPrinter memberPrinter) {
	System.out.println("setMemberPrinter(memberPrinter)");
	this.memberPrinter = memberPrinter;
	}

☝🏻Tip++;
Contstructor(생성자)에 사용 불가

두가지 의존주입 정리

  1. 명시적 의존주입
    • constructor-arg
    • property
  2. 자동주입
    • @Autowired
    • @Resource
    • <context:annotation-config/>

Final :: <context:component-scan base-package=""/>활용

base-package에 지정된 패키지 및 하위 모든 패키지에서
@Component가 붙은 클래스에 대해 빈을 생성
@Component를 상속한 @Service, @Controller, @Repository 등을 사용(Spring MVC)
클래스위에 @Component만 붙여주면 자동으로 빈을 생성해준다.
  

xml설정 예시(간단)

	<context:annotation-config/>
	
	<context:component-scan base-package="spring3"/>

@Component 사용예시

@Component //클래스위에 어노테이션
public class MemberRegisterService {
	
	private MemberDao memberDao;
	
	@Autowired //의존자동주입
	public MemberRegisterService(MemberDao memberDao) {
		this.memberDao = memberDao;
		System.out.println("MemberRegisterService(MemberDao)");
	}

📌 빈 생성하는 코드 일일이 칠 필요없이
1. component-scan 태그 써주고
2. bean필요한 객체에 @Component붙이고
3. @Autowired 등 의존주입해주면 끝!

profile
Being Outstanding needs Understanding🚀

0개의 댓글