(일반 메서드 주입도 있지만 세터 주입과 비슷하여 적지 않겠습니다!)
@Component
public class ConDi{
private Service1 service1;
private Service2 service2;
@Autowired
public ConDi(Service1 service1, Service2, service2){
this.service1 = service1
this.service2 = service2
}
}
→ 항상 생성자 주입을 사용하자
@Component
@RequiredArgsConstructor
public class ConDi{
private final Service1 service1;
private final Service2 service2;
}
public ConDi(Service1 service1, Service2, service2){
this.service1 = service1
this.service2 = service2
}
@Component
@RequiredArgsConstructor
@AllArgsConstructor
public class ConDi{
private final Service1 service1;
private final Service2 service2;
}
==>Class doesn't contain matching constructor for autowiring
→ 생성자 주입을 사용하자
@Component
public class ConDi{
private Service1 service1;
private Service2 service2;
@Autowired
public void setService1(Service1 service1){
this.service1 = service1;
}
@Autowired
public void setService2(Service2 service2){
this.service2 = service2;
}
/*
public ConDi(Service1 service1, Service2, service2){
this.service1 = service1
this.service2 = service2
}
*/
}
@Component
public class ConDi{
private MemberService service1;
public void testMethod(){
service1.findMembers();
}
@Autowired
public void setService1(MemberService service1){
this.service1 = service1;
}
}
public class HelloController {
public static void main(String[] args) {
ConDi conDi = new ConDi();
conDi.testMethod();
}
}
-> Exception in thread "main" java.lang.NullPointerException@Component
public class ConDi{
@Autowired
private Service1 service1;
@Autowired
private Service2 service2;
}
@Service
public class Service1 {
@Autowired
private Service2 service2;
}
@Service
public class Service2 {
@Autowired
private Service1 service1;
}@Service
@RequiredArgsConstructor
public class Service1 {
private Service2 service2;
@Autowired
public void setService2(Service2 service2){
this.service2 = service2;
}
public void runService1(){
service2.runService2();
}
}
@Service
public class Service2 {
private Service1 service1;
@Autowired
public void setService1(Service1 service1){
this.service1 = service1;
}
public void runService2(){
service1.runService1();
}
}
***************************
APPLICATION FAILED TO START
***************************
Description:
The dependencies of some of the beans in the application context form a cycle:
conDi defined in file [/Users/minje/jpashop/build/classes/java/main/com/jpabook/jpashop/ConDi.class]
┌─────┐
| service1
↑ ↓
| service2 (field private com.jpabook.jpashop.service.Service1 com.jpabook.jpashop.service.Service2.service1)
└─────┘@Autowired(required = false)
public void setNoBean(@Nullable Member member){}
@Autowired
public void setNoBean(@Nullable Member member){}
@Autowired
public void setNoBean(Optional<Member> member){}