SPRING

DI / 의존 관계 설정 방법 1 (XML 이용 방법)

nang. 2019. 3. 18. 03:12
반응형
SMALL

< 객체 생성 및 의존 관계 설정 방법 = 객체 설정 정보 >


① XML 이용


1. <bean> 태그 이용

  • 컨테이너가 생성할 빈 객체 지정

  • 속성 : id / class 

* id : 태그 고유 이름. 다른 <bean> 태그에서 참조할 때 사용

* class : 컨테이너가 생성할 객체의 클래스 이름(패키지명 포함해야함)

<bean id="articleDao" class="article.MysqlArticleDao">


<bean id="articleDao" class="article.MysqlArticleDao" />


 

2. <beans ~~></beans> : 루트 태그(루트 엘리먼트)



# 객체 주입 방식 2가지 : <constructor-arg> & <property>

--> 이 태그가 있으면 객체 주입하겠다는 것.

--> 어디서 어디로?

--> ref 에 있는 이름인 다른 빈 객체를 ref 가 쓰인 객체에 불러오겠다. 사용하겠다.


3.  <constructor-arg> 방식

  • 객체에 생성자를 사용한 방식이라면...

* 객체를 스프링 빈으로 설정하려면 생성자에 전달할 값을 설정해줘야 함

  • 이때 사용되는 태그가 <constructor-arg> ( <bean> 안에 )

<constructor-arg value="spring study" />




  • 한 개의 생성자 파라미터를 설정하므로 파라미터가 2개이면 두 개의 <constructor-arg>를 써줘야 함 (순서대로 파라미터라서 순서 중요!)
  • 값이 있다면 <constructor-arg> 안에 <value>태그를 쓰거나 <constructor-arg>속성으로 value를 준다.
  • 다른 빈 객체를 값으로 써야한다면 <value> 태그를 쓰거나 <ref> 태그를 쓰거나 value 속성 말고 ref 속성을 사용한다.
* ref 의 값으로는 사용할 다른 빈 객체의 이름을 써야한다.






4. <poperty> 방식

  • 객체에 setter 메소드를 사용한 방식이라면...

* 이 태그 속 정보를 보고 setter 메소드에 가서 적용됨


<property name="nang" value="25" /> ---> setNang(25)

==> property name 이랑 같은 setter 메소드에 찾아가서 값을 넣어주는 것!


  • name 속성 : 프로퍼티 이름 지정
  • <constructor-arg>랑 마찬가지로 value 나 ref 가짐







< applicationContext.xml >


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- MysqlArticleDao 타입 객체 생성 -->
<bean id="articleDao" class="article.MysqlArticleDao" />
<!-- Oracle...추가하려면 밑 코드를 추가하면 됨 그러면 클래스 수정은 필요가 없음-->
<bean id="oracleArticleDao" class="article.OracleArticleDao" />
<!-- WriteArticleService 타입 객체 생성 -->
<bean id="writeService" class="article.WriteArticleService">
<constructor-arg> <!-- 생성자를 이용한 MysqlArticleDao 객체 주입!
이게 있으면 객체 주입하겠다는거야 -->
<ref bean="articleDao" />
<!-- ref 의 이름인 다른 빈 객체를 이 객체에 가져와서 쓰겠다 -->
</constructor-arg>
</bean>
<!-- ReadArticleService 객체 생성 -->
<bean id="readService" class="article.ReadArticleService">
<constructor-arg> <!-- 생성자를 이용한 MysqlArticleDao 객체 주입 -->
<ref bean="articleDao" />
</constructor-arg>
</bean>
</beans>




이게 결국


ArticleDao articleDao = new MysqlArticleDao();

WriteArticleService writeService = new WriteArticleService(articleDao);


컨테이너가 이걸 실행하는거랑 같음








< 메인 테스트 프로그램 >


* 설정 파일이 완료됐으면 설정 파일 이용해서 컨테이너를 생성할 차례!

* XML 파일을 이용했으면 GenericXmlApplicationContext 클래스 사용

* getBean() 메소드로 객체 가져옴



import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MainForSpring {
public static void main(String[] args) {
AbstractApplicationContext context =
new GenericXmlApplicationContext("classpath:applicationContext.xml");
// XML 설정 파일을 이용한 container 생성 = 직접 컨테이너 생성하는 것
// 스프링 실행하면 빨간색으로 정보를 출력함
// 위 두줄 코드는 tomcat을 사용하면 필요는 없음
// xml 파일이 여러개라면 뒤로 경로 여러개 써주면 됨 (교재 77p 참고)
WriteArticleService writeService =
context.getBean("writeService", WriteArticleService.class); // writeService 객체 반환(컨테이너에서 가져옴)
// getBean : id를 써주면 id에 해당하는 객체를 가져옴
// .class : 타입이 WriteArticleService 라는 뜻
* 만약 .getBean(WriteArticleService.class) 이렇게 id 없이 타입만 전달되면 이거는 그 타입에 해당하는 빈을 구해서 리턴하는 것

Article article = new Article(101, "This is a new article ...");
System.out.println(article + " was created.");
writeService.writeArticle(article);
System.out.println();

ReadArticleService readService =
context.getBean("readService", ReadArticleService.class);
Article result = readService.readArticle(101);
System.out.println(result + " was read.");
context.close(); //마무리
}
}


반응형
LIST