데브코스 W4D3

코끼릭·2022년 4월 6일
0

TIL

목록 보기
12/36

@Bean & @Configuration

  1. Ioc 컨테이너를 설정하기 위한 설정파일을 설정하고 관리할 빈에 대한 생성 메소드를 구현한다.
  2. 1의 설정 파일을 이용한 ApplicationContext를 생성한다.
  3. getBean 메소드를 이용해 빈 객체를 가져와서 사용한다.
@Configuration
public class VoucherContext {
	@Bean
    VoucherService voucherService() {
    	return new VoucherService();
    }
} 
...

public static void main(String[] args) {
		ApplicationContext voucherContext = new AnnotationConfigApplicationContext(VoucherContext.class);
		VoucherService voucherService = voucherContext.getBean("voucherService",VoucherService.class);
}

@ComponentScan

@Configuration이 붙은 클래스 내부에 직접 빈 객체의 생성에 대한 작성을 하는 과정을 편리하게 개선한 기능으로 @Configuration이 붙은 클래스에 추가로 @ComponentScan을 붙이게 되면 해당 클래스와 동일 패키지인 파일들 중 스트레오 타입의 아노테이션이 붙은 클래스를 자동으로 스캔하고 빈으로 등록해준다.

+ @Service, @Repository

모든 빈을 동일시키지 않고 용도에 맞게 스트레오 타입으로 분류해놓은 것으로 해당 아노테이션이 달린 객체는 자동으로 빈 객체로 등록시켜준다.

@Configuration
//Vocher라는 클래스가 있는 위치의 패키지에 대한 컴포넌트 스캔
@ComponentScan(basePackageClasses = {Voucher.class})
public class VoucherContext {
}
...
@Service
public class VoucherService {
    private VoucherRepository voucherRepository;

    public VoucherService(VoucherRepository voucherRepository) {
        this.voucherRepository = voucherRepository;
    }  
}

@AutoWired

빈 객체가 필요한 의존 객체의 타입에 해당하는 빈을 찾아 주입할 때 사용할 수 있는 어노테이션으로 객체 내 생성자, Setter, 필드에 사용할 수 있지만 다음과 같은 이유로 생성자 기반 의존 관계 주입을 선호한다고 한다. (단일 생성자인 경우 생략 가능)

  • 초기화시에 필요한 모든 의존관계가 형성되기 때문에 안전합니다.
  • 서로 빈 객체가 참조하는 순환 참조를 방지할 수 있다.
  • 테스트를 쉽게 해줍니다.
  • 불변성을 확보합니다.(생성자를 통한 주입을 제외한 나머지는 필드에 대한 final 선언이 불가능)
@Service
public class VoucherService {
	//1.필드 주입
	@AutoWired
    private VoucherRepository voucherRepository;

	//2. 생성자 주입
	@AutoWired
    public VoucherService(VoucherRepository voucherRepository) {
        this.voucherRepository = voucherRepository;
    }
    
    //3. 수정자 주입
    @Autowired
    public void setVoucherService(oucherRepository voucherRepository) {
        this.voucherRepository = voucherRepository;
    }
    
}

@Primary, @Qualifier

빈 객체가 의존하는 객체가 2개 이상의 동일 객체가 빈으로 등록된 경우

Bean 생성 생명주기 콜백

  1. @PostConstruct 애노테이션이 적용된 메소드 호출
  Class demo {
      @PostConstruct
      public void func() { 

     }
  }
  1. Bean이 InitializingBean 인터페이스 구현시 afterPropertiesSet 호출
  Class demo implements InitializingBean {
      @Override
      public void afterPropertiesSet() { 

     }
  }
  1. @Bean 애노테이션의 initMethod 에 설정한 메소드 호출
	@Bean(initMethod = "함수명")

Bean 소멸 생명주기 콜백

  1. @PreDestory 애노테이션이 적용된 메소드 호출
  2. Bean이 DisposableBean 인터페이스 구현시 destroy 호출
  3. @Bean 애노테이션의 destroyMethod 에 설정한 메소드 호출

Bean Scope

기본적으로 싱글톤 스콥을 가지고 공식 문서에서는 6개의 스콥을 가지고 있다.

  • singleton: 하나의 빈 정의에 대해 한 개의 인스턴스만 존재한다.
  • prototype: 하나의 빈 정의에 대해 다수의 인스턴스가 존재할 수 있다.
  • request: 하나의 HTTP request 생명주기에 대해 한 개의 인스턴스가 존재한다.
  • session: 하나의 HTTP Session 생명주기에 대해 한 개의 인스턴스가 존재한다.
  • application: 하나의 ServeletContext 생명주기에 대해 한 개의 인스턴스가 존재한다.
  • websocket: 하나의 Websocket 생명주기에 대해 한 갱의 인스턴스가 존재한다.

+ 생성자 매개변수를 받는 getBean의 경우

생성자 매개변수를 전달받아서 생성할 수 있는 빈은 하나의 빈에 여러 개의 인스턴스가 생성될 수 있는 @Scope(value = "prototype")인 빈만 오직 가능하다.

--형변환과 매개변수 사용 형태
Tiger tiger = (Tiger) context.getBean("tiger", "Siberian");
--타입과 매개변수 사용 형태
Tiger tiger = context.getBean(Tiger.class, "Shere Khan");

getBean 관련

profile
ㅇㅅㅇ

0개의 댓글