진이의 Developer Story

스트레오타입 애노테이션 정리 (16. 01. 12) 본문

Java/Spring

스트레오타입 애노테이션 정리 (16. 01. 12)

JIN3260 2016. 1. 12. 17:11

@Autowired와 @Resource
위의 2가지 애노테이션은 모두 의존성 주입을 하는 애노테이션입니다.

 

 @Autowired

@Resource 

 패키지

org.springframework.beans
.factory.annotation.Autowired 

javax.annotation.Resource 

우선순위

ByType -> ByName 

ByName -> ByType 

 비고

@Qualifier와 함께 사용 가능 

name 어트리뷰트 

public class Person {
    String name;
    String job;

    getter/setter...
}

<bean id="person1" class="com.spring.Person">
    <constructor-arg>
        <value>person1</value>
        <value>programmer</value>
     </constructor-arg>
</bean>
<bean id="person2" class="com.spring.Person">
    <constructor-arg>
        <value>person2</value>
        <value>teacher</value>
     </constructor-arg>
</bean>

(1) @Autowired
@Autowired 애노테이션은 IoC 컨테이너에 만들어져있는 bean 을 검색하여 자동으로 주입해주는 애노테이션입니다.
따라서 같은 타입의 빈이 2개 이상 존재한다면 에러가 발생합니다.
이럴 경우 @Qualifier 애노테이션을 사용하여 사용할 빈의 이름을 지정해줄 수 있습니다.

@Autowired
@Qualifier("person1")


설정은 생성자, 필드, 메소드에 적용할 수 있습니다.

(2) @Resource
@Resource 애노테이션은 빈 이름이 일치하는 빈을 주입을 해줍니다.

@Resource(name="person1")
private Person person1;
@Resource(name="person2")
private Person person2;

여기서 name 속성을 적지 않을 경우, 변수이름에서 첫글자를 소문자로 변경하여 지정됩니다.
현재 소스 코드에서는 각각 person1과 person2 로 지정해주었습니다.

(3) @Controller, @Repository, @Service

애노테이션

특징 

@Controller

  프레젠테이션 계층의 MVC 컨트롤러에 사용됩니다.
  스프링 웹 서블릿에 의해 웹 요정을 처리하는 컨트롤러 빈으로 선정됩니다.
  클라이언트 요청을 받으면 해당 컨트롤러에서 받아 처리를 합니다.

 @Service

  서비스 계층의 클래스에 사용됩니다.

 @Repository   데이터 액세스 계층의 DAO 또는 리포지토리 클래스에 사용됩니다.
  DataAccessException 자동변환과 같은 AOP의 적용 대상을 선정하기 위해서도 사용됩니다.

@Controller
public class PersonController {
    protected static Logger logger = Logger.getLogger("controller");

    @Resource(name="personService")
    private PersonService personService;

    // controller methods
}

@Service("personService")
public class PersonService {
    protected static Logger logger = Logger.getLogger("PersonService");
    // service methods here
}

위의 코드에서 personService 클래스를 빈으로 만들고 빈의 이름을 personService로 지정합니다.
그리고 컨트롤러에서는 personService 빈을 @Resource를 사용하여 주입하고 있습니다.

반드시 빈의 이름이 같아야지만 정상적으로 의존성 주입
이 되며, 다를 경우는 Error!

@Repository의 경우도 마찬가지입니다.
해당 DAO를 빈으로 만들어주고 이를 Service 클래스에서 주입을 해줘야 합니다.

Error creating bean with name 'personController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'personService' is defined
Comments