Spring

230131 Spring 의존객체 자동주입 실습

주영재 2023. 1. 31. 18:39

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="controller" class="ex06.Controller"/>
	<bean id="dao" class="ex06.DAO"/>
	<bean id="serviceimpl" class="ex06.ServiceImpl"/>
	
</beans>

 

 

 

Controller.java

package ex06;

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

public class Controller {
	//MVC2 방식의 클래스 모형입니다.
	//1. Controller에서 new키워드를 사용하지 말고 "자동주입"을 이용해서 Service의 hello를 호출시켜주세요
	//2. Service에서는 new키워드를 사용하지 말고 "자동주입"을 이용해서 DAO의 hello를 호출시켜주세요
	//3. DAO에 있는 리턴값을 Controller로 반환받고 출력해주세요
	//4. main에서는 컨트롤러 객체를 확인
	
	@Autowired
	private ServiceImpl serviceImpl;

	
	public Controller() {
		
	}



	public void hello() {
		System.out.println(serviceImpl.hello());
	}
	
}

 

 

ServiceImpl.java

package ex06;

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

public class ServiceImpl {
	
	@Autowired
	private DAO dao;
	
	
	
	public ServiceImpl() {
		
	}



	public String hello() {
		return dao.hello();
	}
	
	
}

 

 

DAO.java

package ex06;

public class DAO {

	public DAO() {
		
	}

	public String hello() {
		return "hello";
	}
}

 

 

MainClass.java

package ex06;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
	public static void main(String[] args) {
		
		GenericXmlApplicationContext ctx=
				new GenericXmlApplicationContext("autowired-context.xml");
		
		Controller ctr=ctx.getBean(Controller.class);
		
		ctr.hello();
		
	}
}

 

콘솔출력문

1월 31, 2023 6:38:35 오후 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [autowired-context.xml]
1월 31, 2023 6:38:35 오후 org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.GenericXmlApplicationContext@402a079c: startup date [Tue Jan 31 18:38:35 KST 2023]; root of context hierarchy
hello

setter나 멤버변수에 @Autowired를 사용할 땐 기본생성자를 만들어줘야 한다.

이 형태는 앞으로 자주 사용할 형태임. 동작과정을 잘 이해할 것.

나는 멤버변수로 @Autowired를 통해 연결했는데,
생성자로 연결해도 된다.

 

Controller.java에서

private ServiceImpl serviceImpl;

@Autowired
public Controller(ServiceImpl serviceImpl){
	this.serviceImpl=serviceImpl;
}



+)현업에서, 테스트할때만 필드에 @Autowired를 쓰는 편이 좋고, 실제 사용은 생성자에서 쓰는 편이 좋다.
특히, 순환 참조되는 설계를 막으려면 생성자에서 사용하는 편이 좋다.