자바 Spring

23-01-31) 의존객체 자동 주입, XML 파일을 Java 파일로 변경하기

JadeStone 2023. 1. 31. 14:12

#교안

Spring_2강(DI).pdf
0.66MB

 

 

 

위에 빨간 줄에 쳐져있는 것들의 의미는

맨뒤에 모듈 context를 앞에 xmlns:context를 보면 

모듈 context를 context라는 태그로 바로 사용할 수 있게 하겠다 라는 의미.

 xmlns:xxx 라고 써주면 context 모듈 기능을 xxx 태그로 사용하겠다는 의미가 됨.

 

이게 Namespace

 

사용할것 체크해주면 됨.

 

*@Autowired

-스프링에서 제공해주는 어노테이션

-타입을 기준으로 의존성 주입

*@Resource

-자바 자체의 어노테이션 -> 자바 버젼에 따라서 있을수도 있고 없어졌을 수도 있음.

 (자바 9버젼에서 지원해줌. 우리는 현재 11버젼을 쓰고 있는데 11버젼에서는 사용할 수 없음.)

-이름을 이용하여 의존성 주입

 

 

위에 두 어노테이션은 회사마다 사용되는 어노테이션이 다를 수 있음. 

우리는 스프링에서 제공해주는 Autowired를 많이 사용하게 될것.

 

# @Autowired

-타입을 기준으로 의존성 주입을 해주지만. 

 같은 타입의 빈이 여러개 있을 때에는 같은 이름을 기준으로 넣어줌.

 

Pringter.java

package ex05;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class Printer {
   
   /*
    * @Autowired-타입으로 빈을 주입->이름으로 찾아서 빈을 주입
    * - 생성자, 세터, 멤버변수(세터 or 멤버변수는 반드시 기본생성자가 필요)
    * 
    * @Resource -이름으로 빈을 주입->타입으로 찾아서 빈을 주입 //java9버젼에서 지원해주는데 우리는 현재 자바 11버젼이라 사용 불가.
    * 
    * @Qualifier - 빈 이름의 강제 연결
    * 컨테이너에 동일한 객체가 여러개 있을 떄 어느 객체를 주입할지
    * 선택해주는 어노테이션
    * 
    */
   
   
   @Autowired
   @Qualifier(value="doc1")
   private Document doc;
   
   //기본생성자
   public Printer() {
      
   }
   //생성자
   public Printer(Document doc) {
      this.doc = doc;
   }

   //getter, setter
   public Document getDoc() {
      return doc;
   }

   public void setDoc(Document doc) {
      this.doc = doc;
   }
   
   
}

 

Document.java

package ex05;

public class Document {
	
	public String data = "내용..";
	
}

 

autowired-context.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"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

	<!-- 자동주입 명령 - context의 모듈의 특정 기능이 필요로 합니다. -->
	<context:annotation-config/>
	
	<bean id="doc" class="ex05.Document"/>
	
	<bean id="printer" class="ex05.Printer"/>

</beans>

 

MainClass.java

package ex05;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
	
	public static void main(String[] args) {
		
		GenericXmlApplicationContext ctx = 
				new GenericXmlApplicationContext("autowired-context.xml");
		
		Printer pt = ctx.getBean("printer", Printer.class);
		
		System.out.println(pt.getDoc().data);
		
	}

}

콘솔로그

 

# @Qualifier 빈의 이름으로 의존성 주입

* @Autowired와 같이 사용 Spring 아노테이션

* @Autowired 를 사용하려는데 

 같은 타입의 빈이 여러개 있을 때 사용.

 그리고 주입하려는 대상의 이름과 같은 이름이 없을 때 사용.

 연결할 빈 이름을 지정해줘서 강제로 연결을 해줌.

	<!-- 자동주입 명령 - context의 모듈의 특정 기능이 필요로 합니다. -->
	<context:annotation-config/>
	
	<bean id="doc1" class="ex05.Document"/>
	<bean id="doc2" class="ex05.Document"/>
	
	<bean id="printer" class="ex05.Printer"/>
	@Autowired
	@Qualifier(value = "doc1")
	private Document doc;

 

 

#위 내용들 정리

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

#XML 파일을 Java 파일로 변경하기

ApplicationContext 라고 하는 컨테이너인 XML 파일을 java파일로 변경.

* @Configuration – 스프링 컨테이너를 대신 생성하는 어노테이션

- 클래스에 위 어노테이션을 붙여주면 관계설정하는 파일로 만들겠다는 의미.

//xml을 대신해서 설정파일로 사용할 때
@Configuration
public class JavaConfig {}

 

* @Bean – 빈으로 등록하는 어노테이션

//@Bean이 붙은 메서드를 스프링 컨테이너가 호출시킴(빈으로 생성)
	@Bean
	public Chef chef() {
		return new Chef();
	}
	
	@Bean
	public Hotel hotel() {
		
//		Chef chef = new Chef();
		
		return new Hotel(chef());
	}
	
	@Bean
	public DatabaseDev dev() {
		
		DatabaseDev dev = new DatabaseDev();
		dev.setUrl("주소..");
		dev.setUid("아이디");
		dev.setUpw("비밀번호...");
		
		return dev;
	}
	
	@Bean
	public MemberDAO dao() {
		
		MemberDAO dao = new MemberDAO();
		dao.setDatabaseDev(dev());
		
		return dao;
		
	}