class Car{
Tire tire;
public Car(){
this.tire = new Tire();
}
}
class Car{
Tire tire;
public Car(Tire tire){
this.tire = tire;
}
public void setTire(Tire tire){
this.tire = tire;
}
}
제어의 역전 : 메소드나 객체의 호출을 개발자가 결정하지 않고, 프레임워크가 결정하는 것
스프링에서의 Bean(의존성 객체)은 위에서 언급했듯이 개발자가 아닌, 프레임워크가 생성 및 소멸에 관여하며 개발자는 컨테이너에서 프레임워크가 만든 객체를 호출하여 사용
스프링에서 Bean이 만들어지고 실행되는 과정은 아래와 같음
최초 객체가 생성된다.
의존성 객체가 주입된다.
@Autowired
선언하여 프레임워크가 컨테이너에서, 선언된 객체 타입과 일치하는 Bean을 찾아 주입함의존성 객체 메소드가 호출된다.
보통 의존성 객체를 주입할 때 스프링에서 권장하는 방식은 생성자방식임
StackOverflowError
가 발생@Component
public class Dog{
@Autowired
private Cat cag;
public void call(Car cat){
System.out.println("Calling Cat");
cat.call();
}
}
@Component
public class Cat{
@Autowired
private Dog dog;
public void call(Dog dog){
System.out.println("Calling Dog");
dog.call();
}
}
BeanCurrentlyInCreationException
이 발생하여 사전에 문제를 방지할 수 있음@Component
public class Dog{
private Cat cag;
@Autowired
public Dog(Car cat){
this.cat = cat;
}
public void call(Car cat){
System.out.println("Calling Cat");
cat.call();
}
}
@Component
public class Cat{
private Dog dog;
@Autowired
public Cat(Dog dog){
this.dog = dog;
}
public void call(Dog dog){
System.out.println("Calling Dog");
dog.call();
}
}
@Autowired
를 사용하지 않아도 되지만, 2개 이상인 경우에는 반드시 어노테이션을 선언할 것!