@Autowired는 Spring의 의존성 주입(DI)을 자동으로 수행하는 어노테이션이다.
스프링 컨테이너가 관리하는 빈(Bean) 중에서 타입(Type)이나 이름을 기준으로 적절한 객체를 찾아 자동으로 주입해 준다.
@Service
public class MyService {
private final UserRepository userRepository;
@Autowired
public MyService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void execute() {
userRepository.findAll();
}
}
@Autowired를 사용하면 개발자가 직접 객체를 생성하지 않아도 Spring이 UserRepository 객체를 찾아서 자동으로 주입해 준다.
스프링 컨테이너는 @Autowired가 붙은 필드나 생성자를 만나면, 아래 순서로 적절한 빈을 찾아서 주입한다.
(1) 타입(Type) 기반 검색
(2) 빈 이름 기반 검색 (@Qualifier 사용 시)
(3) @Primary가 설정된 빈이 우선 적용
Spring에서 @Autowired를 사용할 때는 3가지 방법이 있다.
@Service
public class MyService {
@Autowired
private UserRepository userRepository;
public void execute() {
userRepository.findAll();
}
}
@Service
public class MyService {
private final UserRepository userRepository;
@Autowired
public MyService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void execute() {
userRepository.findAll();
}
}
@Service
public class MyService {
private final UserRepository userRepository;
public MyService(UserRepository userRepository) { // @Autowired 생략 가능
this.userRepository = userRepository;
}
}
@Service
public class MyService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void execute() {
userRepository.findAll();
}
}
@Component("userRepository1")
public class UserRepository1 implements UserRepository { }
@Component("userRepository2")
public class UserRepository2 implements UserRepository { }
@Service
public class MyService {
private final UserRepository userRepository;
@Autowired
public MyService(@Qualifier("userRepository1") UserRepository userRepository) {
this.userRepository = userRepository;
}
}
@Component
@Primary
public class UserRepository1 implements UserRepository { }
@Component
public class UserRepository2 implements UserRepository { }
@Service
public class MyService {
private final UserRepository userRepository;
@Autowired
public MyService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
@Service
public class MyService {
private final UserRepository userRepository;
@Autowired(required = false)
public MyService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
@Autowired
private Optional<UserRepository> userRepository;
@Service
public class ServiceA {
private final ServiceB serviceB;
@Autowired
public ServiceA(ServiceB serviceB) {
this.serviceB = serviceB;
}
}
@Service
public class ServiceB {
private final ServiceA serviceA;
@Autowired
public ServiceB(ServiceA serviceA) {
this.serviceA = serviceA;
}
}