Annotation(@)
는 코드 사이에 주석처럼 달아 특별한 기능을 수행하도록 하는 기술이다.장점
코드량 감소 | 유지보수 용이 | 생산성 증가
사용 순서
1. Annotation을 정의한다.
2. Class에 annotation을 배치한다.
3. 코드가 실행되는 중에 Reflection을 이용하여 추가 정보를 획등하고 기능을 실시한다.
Annotation
자체는 아무런 동작을 가지지 않는 단순한 표식일 뿐이지만, Reflection
을 이용하면 Annotation
의 적용 여부와 element 값을 읽고 처리할 수 있다.@Component
, @Service
, @Repository
, @Controller
, @Configuration
이 붙은 클래스를 찾아서 Context에 Bean으로 등록한다.@Component
public class Student {
public Student() {
System.out.pritln("hi");
}
}
@Component(value="mystudent")
public class Student {
public Student() {
System.out.println("hi");
}
}
@Bean
과 다르게 @Component
는 name이 아닌 value를 이용해 Bean의 이름을 지정한다.@Configuration
public class SpringConfig {
@Bean(name="myMemberService")
public MemberService memberService(){
return new MemberService(memberRepository);
}
}
@Bean
Annotation을 사용하면 된다.@Bean
이 있는 Method를 찾기 위해, Spring은 @Configuration
이 붙어있는 class를 자동으로 Bean에 등록해두고, 해당 클래스를 파싱하여 Bean을 생성한다.Singleton
을 보장한다.@Configuration
public class AppConfig {
@Bean
public MemberService memberService(){
System.out.println("call AppConfig.memberService");
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemoryMemberRepository memberRepository() {
System.out.println("call AppConfig.memberRepository");
return new MemoryMemberRepository();
}
}
@Bean
마다 Bean을 Spring Container에 등록하기 때문에new MemoryMemberRepository()
가 여러 번 호출되어 여러 번 등록된다. >>Singleton 위반
@Configuration
덕분에 이미 등록된 bean은 다시 등록하지 않는다.@Bean
만 사용하면 Spring Bean으로 등록하지만, Singleton은 보장되지 않는다.@Autowired
를 통한 DI는 Spring이 관리하는 객체에서만 동작한다. Spring Bean으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Autowired
가 있으면 Spring이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.@Autowired
생략 가능