어노테이션이 있으면 스프링 빈으로 자동 등록되는 방식
@Component
, @Serivce
, @Repository
, @Controller
@Controller
어노테이션이 있으면, 스프링 시작시 객체를 생성하여 스프링 컨테이너에서 컨트롤러 관리
생성자에 @Autowired
가 있으면 연관된 객체를 스프링 컨테이너가 직접 의존관계를 외부에서 주입해준다 (Dependency Injection)
@SpringBootApplication
이 있는 메인 패키지와 하위 패키지에 대해서 스캔
스프링 빈 등록시, 기본적으로 싱글톤으로 등록
Controller -> Service -> Repository 주입 예시
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
}
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Repository
public class MemoryMemberRepository implements MemberRepository {
private static ConcurrentHashMap<Long, Member> store = new ConcurrentHashMap<>();
private static long sequence = 0L;
...
}
@Configuration
어노테이션으로 Config 클래스 정의@Bean
어노테이션으로 스프링 빈을 직접 정의@Contoller
의 경우 component 스캔으로 처리import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}