// Java 설정 파일을 기반으로 ApplicationContext 객체 생성
ApplicationContext context
= new AnnotationConfigApplicationContext(ContextConfiguration.class);
원래는 이정도였지만.., ComponentScan개념을 사용해서

@를 사용해서 Bean으로 지정되어야
BookDAO 타입의 변수 bookDAO에
BookDAO 인터페이스를 구현한 클래스(BookDAOImpl)가 자동으로 주입된다!
(@Service, @Repository 로 각 계층을 콩 만들어서 그 사이 연결)

BookDAO타입의 빈으로 자동으로 주입되므로 실제로는 private BookDAO bookDAO = new bookDAOImpl();을 의미하게 된다.
서비스 계층에서 DAO계층의 콩을 주입받는 것이
이거 @autowired 하나면 끝난다.

단순히 필드 위에 달았던 @autowired를 생성자 위에 달기만 하면 된다.
아까랑 원리는 똑같다. 인자에 필드가 주입되는 것 처럼 생각하면 된다.
@Autowired
public void setBookDAO(BookDAO bookDAO){
this.bookDAO = bookDAO;
}
BookDAO타입의 클래스를 찾아서 알아서 인수에 주입시켜 준다.
그러면 해당 this(객체)의 bookDAO변수에 대입되게 된다(setter)
똑같이 @service계층에서 @repository계층(DAO)을 주입시키는 것이 포인트이다!
자세한 service계층 코드
@Service("bookServiceSetter")
public class BookService{
private BookDAO bookDAO;
public BookService(){
}
@Autowired
public void setBookDAO(BookDAO bookDAO){
this.bookDAO = bookDAO;
}
//도서 목록 전체 조회
public List<BookDTO> findAllBook(){
return bookDAO.findAllBook();
}
//도서 번호로 도서 조회
public BookDTO findBookBySequence(int sequence){
return bookDAO.findBookBySequence(sequence);
}
}
@Autowired 자동으로 타입에 맞는 빈을 주입 (단, 같은 타입이 여러 개 있으면 오류 발생)
@Qualifier 동일한 타입의 여러 빈 중 특정 빈(이름)을 선택해서 주입
@Primary 기본적으로 선택될 빈을 지정 (우선순위 지정)
primary는 해당 빈 위에 붙여주지만
Autowired나 Qualifier는 보통 같이 그 위에 써준다.
@Service("pokemonServiceQualifier")
public class PokemonService{
//설명. bean에 @Primary가 설정되어 있더라도 주입을 받는 시점에 원하는 bean을 고를 수 있다.
@Autowired
@Qualifier("squirtle")
private Pokemon pokemon;
//생성자 주입은 Autowired 생략 가능
pubic PokemonService(@Qualifier("pikachu") Pokemon pokemon){
this.pokemon = pokemon;
}
}
private final List<Pokemon> pokemonList;
@Autowired
public PokemonService(List<Pokemon> pokemonList){
this.pokemonList = pokemonList;
}
public void pokemonAttack(){
pokemonList.forEach(pokemon-> pokemon.attack());
}
//설명 2. 같은 타입의 빈들을 map 형태로도 주입 받을 수 있다.
privat final Map<String,Pokemon> pokemonMap;
public PokemonService(Map<String,Pokemon> pokemonMap){
this.pokemonMap = pokemonMap;
}
@Resource는 @primary보다 웃너순위 높게 빈 설정가능
타입이 하나만 있을 때 : @Autowired
같은 타입의 빈이 여러 개 있을 때 : @Autowired + @Qualifier("빈이름")
특정한 빈 이름으로 주입하고 싶을 때 : @Resource(name="빈이름")
기본적으로 선택할 빈을 지정하고 싶을 때 : @Primary
@Resource의 주입 우선순위
빈 이름과 일치하는 경우 → 해당 빈을 주입
이름이 없으면 → 타입을 기준으로 주입
이름과 타입 모두 일치하는 것이 없으면 오류 발생
Spring 전용이 아닌, Java의 표준 라이브러리입니다.
Spring의 @Autowired와 거의 동일한 기능을 합니다.
타입(Type) 기준으로 의존성을 주입.
@Qualifier(@Named)와 함께 사용할 수 있다.
Qualifier와 비슷한 역할
하지만 Qualifier처럼 spring에 종속되지는 않는다.
//설명. 1. Inject라이브러리 활용한 필드 주입
@Inject
@Named("squirtle")
private Pokemon pokemon;
//설명.2. 생성자 주입
private Pokemon pokemon
@Inject
public void pokemonAttack(@Named("pikachu") Pokemon pokemon){
this.pokemon= pokemon;
}
//설명3.setter주입
private Pokemon pokemon;
@Inject
public void setPokemon(@Named("squirtle")Pokemon pokemon){
this.pokemon = pokemon;
}
public void pokemonAttack(){
pokemon.attack();
}

Spring의 기본 스코프는 singleton이므로,
같은 @Bean을 여러 번 가져와도 동일한 객체가 반환됩니다.
새로운 객체를 매번 생성하려면 @Scope("prototype")을 추가하면 됩니다. 🚀
(디폴트는 @Scope("prototype"))
싱글톤 패턴은 클래스의 인스턴스를 하나만 생성하고, 이를 전역적으로 공유하는 디자인 패턴입니다. 즉, 프로그램 실행 동안 해당 클래스의 객체는 오직 하나만 존재합니다.