@Named / @Inject (ft. CDI)

2023. 5. 31. 16:11기술 창고/어노테이션 창고

728x90
반응형
SMALL

@Named / @Inject

CDI (Context and Dependency Injection) 에서는 기존의 스프링에서 사용했던 어노테이션 일부를 대체할 수 있습니다.

그 중에서 대표적인 것이 @Named 와 @Inject 인데, @Named 는 @Component 를 대체할 수 있고, @Inject 는 @Autowired 를 대체할 수 있습니다.

 

각 대체되는 어노테이션의 용도와 뜻도 유사합니다.

@Named : @Component 와 유사하게 Bean객체로 지정하는 어노테이션.

@Inject : @Autowired 와 유사하게 의존성 주입 받은 객체를 자동 주입 시켜주는 어노테이션.

 

// CDI 에서는 @Component 대신 @Named 를 대체로 사용할 수 있다.
@Named
class BusinessService{
    private DataService dataService;

    public DataService getDataService(){
        return dataService;
    }

    @Inject // setter 의존성 주입. CDI 에서는 @Autowired 대신에 @Inject 를 대체해서 사용할 수 있다.
    public void setDataService(DataService dataService){
        System.out.println("Setter Injection");
        this.dataService = dataService;
    }
}

@Named
class DataService{

}

@Configuration
@ComponentScan // Component로 선언된 객체가 있는 경로로 가서 해당 객체를 자동으로 Bean 객체 생성 주입
public class CdiContextLauncherApplication {

    public static void main(String[] args) {

        try (var context = new AnnotationConfigApplicationContext(CdiContextLauncherApplication.class)) {
            Arrays.stream(context.getBeanDefinitionNames()).forEach(System.out::println);
            System.out.println("어플리케이션 실행");
            System.out.println(context.getBean(BusinessService.class).getDataService());
        }

    }
}

 

위의 예시 코드에서 보이는 것처럼 기존에 사용했던 @Autowired, @Component 랑 동일하게 사용되고 역할도 유사합니다.

 

<!-- https://mvnrepository.com/artifact/jakarta.inject/jakarta.inject-api -->
<dependency>
    <groupId>jakarta.inject</groupId>
    <artifactId>jakarta.inject-api</artifactId>
    <version>2.0.1</version>
</dependency>

CDI 를 사용하려면 jakarta.inject 디펜던시를 import 해서 반영시켜야 합니다.

저는 maven 을 사용하기 때문에 위와 같은 형식으로 pom.xml에 디펜던시를 import 해주었습니다.

 

728x90
반응형
LIST

'기술 창고 > 어노테이션 창고' 카테고리의 다른 글

@Controller / @Service / @Repository  (0) 2023.06.06
@PostConstruct / @PreDestroy  (0) 2023.05.30
@Scope  (0) 2023.05.30
@Lazy  (0) 2023.05.30
@Primary  (0) 2023.05.30