@Controller
스프링이 시작될때, 객체를 생성
스프링 컨테이너에서 빈을 관리한다고 부름
@Autowired
스프링 컨테이너의 memberService를 가져와서 연동한다
@Service
스프링이 올라올때 컨테이너에 등록해줌
@Repository
스프링에 repository 등록
전부 @Component 가능
스프링 빈을 등록하는 2가지 방법
어노테이션 사용
@component 어노테이션이 있으면 스프링 빈으로 자동 등록한다
@controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다
@controoler, @Service, @Repository 모두 @component 하위임
hello.hellospring 하위 패키지가 아니면, 등록안해줌
스프링은 기본적으로 싱글톤으로 동작(유일하게 하나만 등록해서 공유)
따라서, 같은 스프링 빈이면 모두 같은 인스턴스이다.
자바코드사용
Springconfig.java라는 새 파일을 만든다 이름상관없음
@Configuration, @Bean 이용
package hello.hellospring;import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
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(); }}뜰때 memberService와 memberRepository를 둘 다 스프링 빈에 등록하고,
memberService의 생성자에 memberRepository를 넣어준다.
DI (dependency injection) 의 3가지 방식
생성자 주입 - 생성자를 통해서 들어오는거 **권장됨
필드주입 - 그냥 필드에다가 들어오는거
setter주입 -setter을 통해서 주입
%주의% Autowired는 Bean에 등록된 개체가 아니면 동작하지 않음