Programming/Spring

Spring DI 생성자를 이용해서 의존성을 주입

byeong07 2018. 6. 13. 14:27

이전에는 DI 방법 중 setter()를 이용해서 정리했습니다.

 

이번에는 생성자를 이용해서 의존성을 주입시키는 방법에 대해 알아보겠습니다.

 

 

이전 setter 방법과 다르게 MyCats에 setter가 없고 생성자를 이용해서 name, age, hobbys를 인자로 받아 필드에 있는

 

name, age, hobbys를 초기화했으며, Cats에서도 마찬가지로 myCats를 인수로 받아와서 필드의 myCats 값을 초기화를 했습니다.

 

 

MainClass에서는 이전과 같은 방법으로(getBean) 객체를 얻어와서 사용합니다.

 

얻어온 객체를 보시면 catsInfo라는 객체를 얻어온 것으로 되어 있습니다.

 

applicationContext.xml에서 catsInfo 객체를 확인해보겠습니다.

 

 

 

생성한 첫 번째 객체를 보시면 "이 객체의 이름(id)은 cat1이고, diEx2 package에 있는 MyCats 클래스입니다."라고 보면 됩니다.

 

MyCats 클래스에는 name, age, hobby를 인자로 받아서 필드 값을 초기화를 시켜주는 생성자가 있었습니다.

 

생성자에 값을 넘겨주기 위해서는 이전에 했던 property가 아닌 constructor-arg를 사용해서 값을 넘기게 됩니다.

(property는 setter()가 있어야 사용이 가능합니다.)

 

생성자에서 받아오는 인자 순서대로 이름, 나이, 취미를 넣으면 됩니다.

 

두 번째 객체를 보시면 "이 객체의 이름(id)은 catsInfo이고, diEx2 package에 있는 Cats 클래스입니다."라고 보면 됩니다.

 

Cats 클래스에도 생성자가 있습니다.

 

myCats를 인자로 받아서 필드에 있는 myCats의 값을 초기화를 하기 때문에 마찬가지로 construtor-arg를 이용해서

 

값을 넘기게 됩니다.

 

<ref bean="cat1"/> 위에서 만든 cat1이라는 bean(객체)을 참조한다고 작성하였기 때문에 첫 번째 객체인

 

cat1의 값들이 넘어가서 생성자를 통해 초기화가 됩니다.

 

 

 

MainClass를 다시 보시면 getBean으로 MyCats를 참조하고 있는 catsInfo라는 객체를 가져와서 catsInfo에 있는

 

getMyCatsInfo() 메서드를 사용하여 고양이의 정보를 출력하게 됩니다.

 

 

고양이가 두 마리일 경우 어떻게 출력이 되는지 확인해보겠습니다.

 

 

 

applicationContext.xml에서 cat2라는 bean을 생성하고 값을 설정했습니다.

 

property와 같이 <constructor-arg> 안에 바로 value 값을 넣어도 됩니다.

 

아래에 아까 생성한 catsInfo라는 객체는 cats1을 참조하고 있습니다.

 

Cats 클래스에서 두 번째 고양이의 정보도 출력할 수 있게 set 메서드를 추가한다.

 

 

setMyCatsInfo() 메서드에서 인자 값으로 myCats를 받아서 필드의 myCats에 값을 넘기게 됩니다.

 

MainClass에서 넘겨주면 됩니다.

 

 

첫 번째 고양이의 경우 catsInfo라는 객체에서 cat1을 참조하기 때문에 따로 set을 하지 않아도 되지만

 

두 번째 고양이의 객체는 참조하고 있지 않기 때문에 set을 해야 합니다.

 

getBean을 통해서 cat2 객체를 얻어서 위에서 생성한 setMyCatsInfo()에 인자값으로 넣습니다.

 

그럼 Cats 클래스에서 받은 인자값을 필드값에 넘기게 됩니다.

 

그 후에 getMyCatsInfo() 메서드를 호출해서 cat2의 값이 들어간 정보를 출력하게 됩니다.

(그리고 다 사용한 객체는 close()를 통해 닫아야 합니다.)

 

예제를 통해서 setter()와 생성자를 사용해서 의존성을 주입하는 방법을 정리했습니다.

 

예제와 같이 setter나 생성자를 사용해도 됩니다.

 

property를 사용할 때는 setter()가 있어야 하며, constructor-arg를 사용할 때는 생성자가 있어야 합니다.