유블로그

[Spring] DI (Dependency Injection) 본문

Spring

[Spring] DI (Dependency Injection)

yujeong kang 2020. 11. 1. 16:09

빈 생성범위

  • singletone : 스프링 컨테이너 당 하나의인스턴스 빈만 생성. default!!
  • prototype : 컨테이너에 빈을 요청할 때마다 새로운 인스턴스 생성
  • request : HTTP Request 별로 새로운 인스턴스 생성
  • session : HTTP Session 별로 새로운 인스턴스 생성

빈 설정 방법 3가지

  • XML Document
  • Annotation
  • Java Code

1) XML

1- src 폴더에 패키지 com.hello.configuration 에 applicationContext.xml 만들어놓음

2- 1의 xml 파일 내용은 대략이렇다

<bean id="gbService" class="com.hello.model.service.GuestBookServiceImpl">
		<property name="guestBookDao" ref="gbDao"/>
</bean>

3- 2의 bean을 사용할 java 파일에서 

GuestBookService guestBookService = context.getBean("gbService", GuestBookServiceImpl.class);

이런 식으로 context 객체에서 bean id를 통해 빈에 접근한다!

 

 

xml 을 통한 빈 의존 관계설정

1- contructor 이용

<bean id="ham" class="com.ssafy.hello.di4.HamSand" />

<bean id="menu2" class="com.ssafy.hello.di4.Menu" >
	<constructor-arg>
		<ref bean="ham" />
	</constructor-arg>
</bean>

<!-- 또는 -->

<bean id="menu2" class="com.ssafy.hello.di4.Menu" >
	<constructor-arg ref="ham" />
</bean>

<!-- 또는 -->

<bean id="menu2" class="com.ssafy.hello.di4.Menu" c:sand-ref="ham" />

 

2- property 이용

<bean id="ham" class="com.ssafy.hello.di4.HamSand" />
<!-- 세터 인젝션(Setter Injection) : Menu menu = new Menu(); menu.setSand(ham); -->
	<!-- set 메소드 쓰겠다!  -->
<bean id="menu2" class="com.ssafy.hello.di4.Menu" >
	<property name="sand">
		<ref bean="ham" />
	</property>
</bean>  

	<!-- 또는  -->
    
<bean id="men2u" class="com.ssafy.hello.di4.Menu" >
	<property name="sand" ref="ham" />
</bean>

	<!-- 또는  -->
    
<bean id="menu" class="com.ssafy.hello.di4.Menu" p:sand-ref="ham" />

 

2) Annotation

<context:component-scan base-package="com.hello.framework.ws04">

위처럼 servelt-context.xml 에 원하는 패키지 밑에 있는 모든 파일들에 대해 자동스캔 등록을 한다.

 

이렇게 Autowired 를 통해서 빈과 객체를 연결해주어 사용한다.

 

동일한 타입의 bean이 여러 개일 경우에는 @Qualifier 를 사용한다.

 

- 아래는 빈 자동등록에 사용할 수 있는 Annotation 들이다.