BeanCurrentCreationException
발생스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능
@Component
@Repository
@Service
@Controller
@Configuration
현재 패키지를 기준으로 component scan을 한다.
basePackages
@ComponentScan(basePackages = {"org.prgms.kdt.order", "org.prgms.kdt.voucher"})
basePackageClasses
@ComponentScan(basePackageClasses = {Order.class, Voucher.class})
excludeFilters
@Autowired
private VoucherRepository voucherRepository;
private VoucherRepository voucherRepository;
public void setVoucherRepository(VoucherRepository voucherRepository) {
this.voucherRepository = voucherRepository;
}
interface VoucherRepository { ... }
@Repository
@Primary
class MemoryVoucherRepository implements VoucherRepository { ... }
@Repository
class JdbcVoucherRepository implements VoucherRepository { ... }
자동 주입 가능한 Bean이 2개 이상인 경우 주입 우선순위를 설정하기 위해 사용한다.
interface VoucherRepository { ... }
@Repository
@Qualifier("memory")
class MemoryVoucherRepository implements VoucherRepository { ... }
@Repository
@Qualifier("jdbc")
class JdbcVoucherRepository implements VoucherRepository { ... }
@Service
class VoucherService {
...
public Voucher Service(@Qualifier("memory") VoucherRepository voucherRepository){ ... }
...
}
VoucherRepository voucherRepository = BasicFactoryAnnotationUtils.qualifiedBeanOfType(
applicationContext.getBeanFactory(), VoucherRepository.class, "memory");
@Repository
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class MemoryVoucherRepository implements VoucherRepository { ... }
@Repository
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class MemoryVoucherRepository implements VoucherRepository { ... }
applicationContext.close() → IoC 컨테이너 소멸 → 모든 Bean들 소멸 → Callback 발생
@PostConstruct
적용된 메서드 실행@Bean
어노테이션의 initMethod에 설정한 메서드 호출@Bean(initMethod = "init")
→ init 메서드 호출@PreDestroy
적용된 메서드 실행@Bean
어노테이션의 destroyMethod에 설정한 메서드 호출@Bean(destroyMethod = "destroy")
→ destroy 메서드 호출 그 이유는 스프링이 주로 적용되는 대상이 자바 엔터프라이즈 기술을 사용하는 서버환경이기 때문이다. 스프링이 처음 설계되었던 대규모 엔터프라이즈 서버환경은 초당 최대 수십, 수백 개의 요청을 받아 처리하는 높은 성능이 요구되는 환경이었다. 이 때마다 매번 새로운 오브젝트를 생성해서 사용할 경우 아무리 GC의 성능이 좋아졌다고 해도, 서버가 감당하기 힘든 부하가 걸릴 것이다.
Bean이란? Bean Scope와 싱글톤 레지스트리, Bean 생성방식