ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 4.0 - DI : 의존성주입 자동 연결
    웹프로그래밍/spring 2018. 7. 10. 21:13

    어노테이션을 이용한 객체 의존 자동연결

    스프링 빈 객체의 간단한 의존 관계 설정을 아래 어노테이션으로 간단히 한다.

    먼저, XML 설정 파일에 아래 코드로 전처리기 빈을 등록한다.


    <context:annotation-config>


    ※위 코드가 등록해주는 자동 연결과 관련 된 스프링 빈

    org.springframework.beans.factory.AutowiredAnnotationBeanPostProcessor

    org.springframework.beans.factory.annotation.QuailifierAnnotationAutowireCandidateResolver

    org.springframework.context.annotation.CommonAnnotationBeanPostProcessor


    @Autowired org.springframework.beans.factory.annotation.Autowired

    생성자, 필드(변수), 메서드(set,일반)에 사용가능

    어노테이션이 적용되어 있다면 해당하는 bean 객체 클래스 타입을 스프링컨테이너 안에서 검색하고 자동으로 DI 한다.


    스프링 컨테이너 안에 해당 객체 타입이 없을 경우, BeanCreationException 발생

    -> @Autowired(required=false)로 해결. null 값을 리턴한다.


    같은 클래스 타입의 bean이 2개 이상일 경우, NoUniqueBeanDefinitionException 발생

    -> 번거롭지만 @Qualifier("")으로 해결, XML에서 bean을 정의할때 <qualifier value=""> 속성을 추가하고 클래스에서 @Qualifier을 적용한다.



    @Resource - javax.annotation.Resource

    이름(bean "id")를 기준으로 bean 객체를 선택한다. @Resource(name="")에 일치하는 bean 객체가 없을 경우 익셉션 발생

    어노테이션의 name이 없을 경우, 필드 이름이나 프로퍼티 이름을 사용한다. 없을 경우 역시 익셉션 발생



    @Inject

    pom.xml에 아래 메이븐 의존 설정 추가


    <dependency>

    <groupId>javax.inject</groupId>

    <artifactId>javax.inject</artifactId>

    <version>1</version>

    </dependency>


    @Named 어노테이션으로 bean 이름으로 객체를 불러올 수 있다.

    반드시 xml 설정에서 bean 객체가 존재해야 한다.




    컴포넌트 스캔을 이용한 빈 자동 등록

    특정 패키지(하위 패키지 포함)에 위치한 클래스를 어노테이션을 기준으로 스프링 bean으로 자동 등록해주는 기능.

    <context:component-scan base-package="패키지 경로"> 태그로 패키지 지정


    <context:component-scan base-package="com"></context:component-scan>



    클래스를 스프링 빈으로 등록하면서 의존 객체를 전달하려면 @Resource,@Autowired 등을 추가로 적용한다.

    자동으로 검색한 클래스의 맨 앞글자를 소문자로 바꿔서 빈에 등록한다. 특정한 이름을 지정하려면 @Component("")


    @Controller

    public class OrderController {

    @Resource(name="orderService")

    private OrderService orderService;

    .

    .

    .



    -스캔 대상인 어노테이션

    @Component - org.springframework.stereotype.Component

    @Service - org.springframework.stereotype.Service

    @Repository - org.springframework.stereotype.Repository

    @Controller - org.springframework.stereotype.Controller