[Spring] 어노테이션 기반 설정

2020. 7. 1. 15:25 Spring Framework/Spring Core

어노테이션 기반 설정


1. XML에서의 <context:annotation-config/> 설정

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

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans",

http://www.springframework.org/schema/context"   

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/beans/spring-context-3.0.xsd">

<context:annotation-config/>

  <!-- <context:component-scan> 태그를 이용해서 스프링이 클래스를 검색할 패키지를 지정하면 된다. <context:component-scan> 태그를 추가하면 스프링은 지정한 패키지에서 @Component 어노테이션 등이 적용된 클래스를 검색하여 빈으로 등록하게 된다.

<context:component-scan base-package="mad.spring.ch4.HomeController"/>-->

...

</beans>


<context:annotation-config/> 태그는 어노테이션과 관련해서 다음의 BeanPostProcessor를 등록해 준다.

- RequredAnnotationBeanPostProcessor: @Required 어노테이션 처리

- AutowiredAnnotationBeanPostProcessor:@Autiwired 어노테이션 처리

- CommonAnnotationBeanPostProcessor: @Ressource, @PostConstruct, @PreDestroy 어노테이션 처리

- ConfigurationClassProcessor: @Configuration 어노테이션 처리


2. @Autowired 어노테이션을 이용한 자동 설정

org.springframework.beans.factory.annotation 패키지에 위치한 @Autowired 어노테이션은 의존관계를 자동으로 설정할 때 사용된다.

@Autowired 어노테이션은 스프링 2.5에 추가된 기능으로 타입을 이용하여 의존하는 객체를 삽입해준다.

@Autowired 어노테이션은 타입을 이용한 프로퍼티 자동 설정 기능을 제공한다.


(1) 프로퍼티 설정 메서드에 적용한 예

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


public class MonitorViewer implements Viewer{

private DisplayStrategy displayStrategy;

@Autowired

public void setDisplayStrategy(DisplayStrategy displayStrategy){

this.displayStrategy = displayStrategy;

}

}

위 코드는 displayStrategy 프로퍼티에 DisplayStrategy 타입의 빈 객체를 전달한다.


(2) 일반 메서드에 적용한 예

메서드 이름이 setXXX() 형식이 아니라도 @Autowired 어노테이션을 적용할 수 있다. 아래 코드는 prepare() 메서드에 @Autowired 어노테이션을 적용할 수 있는데,

이 경우 스프링은 HomeController 객체를 생성할 때 prepare() 메서드에 AlarmDevice 타입의 빈 객체와 Viewer 타입의 빈 객체를 전달한다.

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


public class HomeController{

private AlarmDevice alarmDevice;

private Viewer viewer;


@Autowired

public void prepare(AlramDevice alarmDevice, Viewer viewer){

this.alarmDevice = alarmDevice;

this.viewer viewer;

}

...

}


(3) 멤버 필드에 적용한 예

멤버 필드에 직접 @Autowired 어노테이션을 적용해도 된다.

public class MonitorViewer implements Viewer{

@Autowired

private DisplayStrategy displayStrategy;

...

}


(4) 배열에 적용한 예

@Autowired 어노테이션을 배열에 적용하게 되면, 해당 타입의 모든 빈 객체를 배열로 전달 받는다. 예를 들어, 아래 코드와 같이 @Autowired 어노테이션을 적용하면 InfraredRaySensor 타입의 빈 객체가 배열로

setSensor() 메서드에 전달된다. 메서드 뿐만 아니라 배열 타입의 멤버 필드에 @Autowired 어노테이션을 적용해도 동일하게 동작한다.

public class HomeController{

...

private InfraredRaySensor[ ] sensors;

@Autowired

public void setSensors(InfraredRaySensor[ ] sensors){

this.sensors = sensors;

}

...

}


(5) 제네릭이 적용된 컬렉션 타입을 적용한 예

제네릭이 적용된 컬렉션 타입을 사용하는 경우 List 타입이나 Set 타입을 이용해서 특정 타입의 빈 객체 목록을 전달 받을 수 있다.

public class HomeController{

private List<InfraredRaySensor> sensor;


@Autowired

public void setSensors(List<InfraredRaySensor> sensors){

this.sensors=sensors;

}

}


(6) @Autowired 어노테이션 적용 프로퍼티의 필수 여부 지정
@Autowired 어노테이션은 타입을 이용해서 자동적으로 프로퍼티 값을 설정하기 때문에, 해당 타입의 빈 객체가 존재하지 않거나 또는 빈 객체가 두 개 이상 존재할 경우
스프링은 @Autowired 어노테이션이 적용된 빈 객체를 생성할 때 예외를 발생시킨다.

@Autowired 어노테이션을 적용한 프로퍼티를 반드시 설정할 필요가 없는 경우도 있는데, 이런 경우에는 @Autowired 어노테이션에 required 속성의 값을 false로 지해주면 된다.
public class HomeController{
...
@Autowired(requred=false)
public void setSensors(List<InfraredRaySensor> sensors){
this.sensors = sensors;
}
...
}
required 속성의 값을 false로 지정할 경우, 해당 타입의 빈 객체가 존재하지 않더라도 스프링은 예외를 발생하지 않는다.
required 속성의 기본 값은 true이다.


3. @Resource 어노테이션을 이용한 프로퍼티 설정

@Resource 어노테이션은 어플리케이션에서 필요로 하는 자원을 자동 연결할 때 사용된다.

스프링에서는 의존하는 빈 객체를 전달할 때 사용된다.

import javax,annotation.Resource;


public class HomeController{

@Resource(name="camera1")

private Camera camera1;

private Camera camera4;

@Resource(name="camera4);

public void setcamera4(Camera camera4){

this.camera4 = camera4;

}

...

}

스프링에서 @Resource 어노테이션을 사용하려면 name 속성에 자동으로 연결할 빈 객체의 이름을 입력하면 된다.


<bean class="org.springframework.beans.factory.annotation.RequredAnnotationBeanPostProcessor"/>

<context:annotation-config/>를 사용해도 좋다.



출처: https://devbox.tistory.com/entry/Spring-어노테이션-기반-설정?category=574587 [장인개발자를 꿈꾸는 :: 기록하는 공간]

'Spring Framework > Spring Core' 카테고리의 다른 글

[Spring] 뷰 지정  (0) 2020.07.01
[Spring] 컨트롤러 메서드의 파라미터 타입  (0) 2020.07.01
[Spring] HTML 폼과 자바빈 객체  (0) 2020.07.01
[Spring] 자바 코드 기반 설정  (0) 2020.07.01
[Spring] 외부 설정 프로퍼티  (0) 2020.07.01
[Spring] iBatis 2  (0) 2020.07.01
[Spring] iBatis 1  (0) 2020.06.10
[Spring] web.xml 기본 설정  (0) 2020.06.10