본문 바로가기
WEB/spring

[Spring] DI, 어노테이션 정리

by baam 2022. 6. 16.

Bean

Spring Container가 관리하는 객체이다.

 

 

ApplicationContext

JSP의 기본 객체, BeanFactory를 확장해서 여러 기능을 추가 정의하는 인터페이스이다.

 

 

[web.xml]

ContextLoaderListener(이벤트처리기)를 이용해 Root ApplicationContext 객체(부모)와 Servlet ApplicationContext 객체(자식)를 생성한다.

<context-param> <!-- Root ApplicationContext 설정파일 위치 -->
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Processes application requests -->
<servlet> <!-- Servlet ApplicationContext 설정파일 위치 / DispatcherServlet 등록 -->
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

 


 

DI, 의존 자동 주입


스프링이 Bean을 자동으로 주입해주는 어노테이션에는 @Autowired, @Resource 두가지가 있다

 

@Autowired

인스턴스 변수(iv), setter,  참조형 매개변수를 가진 생성자, 메서드에 적용할 수 있다.

생성자의 @Autowired는 생략이 가능하다.

Spring container에서 타입으로 Bean을 검색해서 참조 변수에 자동 주입(DI)한다.

검색된 빈이 n개이면, 그중에 참조 변수와 이름이 일치하는 것을 주입한다.

class Car {
    @Autowired    Engine engine;
    @Autowired    Door[] doors;
}

 

@Resource

Spring container에서 이름으로 빈을 검색해서 참조 변수에 자동 주입(DI)한다.

일치하는 이름의 빈이 없으면 예외가 발생한다.

class Car {
    @Resource    Engine engine;
}

 

@Qualifier

같은 타입의 Bean이 여러개있을 때 사용할 객체를 선택할 수 있도록 지정한다.

class Car {
    @Autowired  
    @Qualifier("superEngine")
    Engine engine;
}

 

@Component

특정 객체를 Bean 객체가 될 대상으로 인식하고 Spring이 Bean을 자동으로 주입하도록 만들기 위해서는 반드시 ComponentScan이 필요하다. ComponentScan을 선언하는 방법은 XML과 java 파일 두 가지 방법이 있다. 어느 방법으로든 패키지나 클래스를 Bean 객체가 될 검색의 대상으로 지정해주어야만 한다. 

 

<component-scan>에서 패키지로 등록하면 서브패키지까지 검색해서 @Component가 붙은 클래스를 자동 검색해서 빈으로 등록해준다.

<context:component-scan base-package="com.dev.ch3">

@Component 어노테이션 사용시 id를 생략하면 클래스 명의 첫 글자를 소문자로 바꿔서 자동으로 등록한다.

@Component는 @Controller, @Service, @Repository, @ControllerAdvice의 메타 애너테이션이다.

@Component class Car{}
@Component("sportsCar") class SportsCar extends Car{}
@Component class Truck extends Car{}

 

@Value & @PropertySource

값을 지정할 때 사용한다. 직접 적어줄 수도 있지만, 시스템 환경변수나 property 값을 불러와 지정할 수 있다.

class Car {
    @Value("red") String color;
    @Value("100") int oil;
    @Autowired    Engine engine;
    @Autowired    Door[] doors;
}
@Component
@PropertySource("setting.properties")
class SysInfo{
    @Value("#{systemProperties['user.timezone']}")
    String timeZone;

    @Value("#{systemEnvironment['PWD']}")
    String currDir;

    @Value("${autodaveDir}")
    String autosaveDir;
}

[src/main/resources/setting/properties]

autosaveDir=/autosave

 

댓글