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를 쓰는 편이 좋고, 실제 사용은 생성자에서 쓰는 편이 좋다.
특히, 순환 참조되는 설계를 막으려면 생성자에서 사용하는 편이 좋다.