Spring - @Autowired
목록  
제 목 @Autowired
작성자 박세청 작성일 2013/11/15 02:09


@Autowired

-의존관계 자동 설정(type 기반)

-생성자, 필드, 메서드에 적용 가능

-setXXXX()의 형식이 아니어도 적용가능

AbstractController.java

package controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.ModelAndView;

import service.AbstractService;

public class AbstractController extends
org.springframework.web.servlet.mvc.AbstractController {

@Autowired
private AbstractService service;

//@Autowired
//public void prepare(AbstractService service){
// this.service = service;
//}


@Override
protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
// TODO Auto-generated method stub

System.out.println("START >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.println(service.getClassName());
System.out.println("END >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

return null;
}

}

AbstractService.java

package service;

public interface AbstractService {
String getClassName();
}

AbstractServiceImpl.java

package service;

public class AbstractServiceImpl implements AbstractService {

@Override
public String getClassName() {
// TODO Auto-generated method stub
return "AbstractServiceImpl";
}

}

spring301-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:annotation-config/>

<!-- HandlerMapping 설정 -->
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/abstract.sp">abstractController</prop>
</props>
</property>
</bean>


<!-- ViewResolver 설정 : ResourceBundleViewResolver -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
<property name="contentType">
<value>text/html; charset=UTF-8</value>
</property>
</bean>


<!-- 각종 bean 설정 -->
<bean id="abstractController" class="controller.AbstractController"></bean>

<bean id="abstractService" class="service.AbstractServiceImpl"></bean>

</beans>

▶결과

START >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
AbstractServiceImpl
END >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

아래와 같이 메서드에 적용도 가능(setXXX() 형태가 아니어도 적용가능!!!)

@Autowired
public void prepare(AbstractService service){
this.service = service;
}


/////////////////////////////////////////////////////////////////////////////////////////////

@Autowired(required=false)

-프로퍼티를 반드시 설정할 필요가 없는 경우 사용

-default : true

AbstractController.java

package controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.ModelAndView;

import service.AbstractService;

public class AbstractController extends
org.springframework.web.servlet.mvc.AbstractController {

@Autowired(required=false)
private AbstractService service;


@Override
protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
// TODO Auto-generated method stub

System.out.println("START >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.println(service.getClassName());
System.out.println("END >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
return null;
}

}

spring301-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:annotation-config/>

<!-- HandlerMapping 설정 -->
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/abstract.sp">abstractController</prop>
</props>
</property>
</bean>


<!-- ViewResolver 설정 : ResourceBundleViewResolver -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
<property name="contentType">
<value>text/html; charset=UTF-8</value>
</property>
</bean>


<!-- 각종 bean 설정 -->
<bean id="abstractController" class="controller.AbstractController"></bean>
<!-- bean id="abstractService" class="service.AbstractServiceImpl"></bean -->

</beans>

-required 속성의 값을 false로 지정할 경우, 해당 타입의 빈 객체가 존재하지 않더라도 예외가 발생하지 않음

(실제 로직 처리시 exception 발생)

-즉 위의 예제의 경우 <!-- bean id="abstractService" class="service.AbstractServiceImpl"></bean -->
처럼 주석 처리가 되어 있지만 @Autowired(required=false)이므로 웹서버가 설정파일 로드시 에러가 발생하지 않음.

required=true로 설정했다면 웹서버가 설정파일 로드시 에러발생

/////////////////////////////////////////////////////////////////////////////////////////////

@Qualifier

-동일한 타입의 빈 객체들 중 특정 빈을 사용하도록 설정

package controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.servlet.ModelAndView;

import service.AbstractService;

public class AbstractController extends
org.springframework.web.servlet.mvc.AbstractController {

@Autowired
@Qualifier("service")

private AbstractService service;

@Override
protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
// TODO Auto-generated method stub

System.out.println("START >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.println(service.getClassName());
System.out.println("END >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
return null;
}

}

==========================================================================================

//아래처럼 사용해도 문제없음

private AbstractService service;

@Autowired
public void prepare(@Qualifier("service") AbstractService service){
this.service = service;
}

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:annotation-config/>

<!-- HandlerMapping 설정 -->
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/abstract.sp">abstractController</prop>
</props>
</property>
</bean>


<!-- ViewResolver 설정 : ResourceBundleViewResolver -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
<property name="contentType">
<value>text/html; charset=UTF-8</value>
</property>
</bean>


<!-- 각종 bean 설정 -->
<bean id="abstractController" class="controller.AbstractController"></bean>

<bean id="abstractService" class="service.AbstractServiceImpl">
<qualifier value="service"></qualifier>
</bean>


</beans>

저작자 표시비영리




이전글 AOP(Aspect Oriented Programming)
다음글 Spring에서 의존관계와 DI

목록