Programing

Google Guice 대 JSR-299 CDI / 용접

lottogame 2020. 12. 25. 08:49
반응형

Google Guice 대 JSR-299 CDI / 용접


JSR-299 컨텍스트 및 종속성 주입 참조 구현 인 Weld는 스스로를 Spring 및 Guice의 일종의 후속 제품으로 간주합니다.

CDI는 Seam, Guice 및 Spring을 포함한 기존의 여러 Java 프레임 워크의 영향을 받았습니다. 그러나 CDI는 고유하고 매우 뚜렷한 특성을 가지고 있습니다. Seam보다 유형이 더 안전하고 Spring보다 상태가 더 높고 XML 중심이 적고 Guice보다 웹 및 엔터프라이즈 애플리케이션이 더 많이 가능합니다. 그러나 언급 된 프레임 워크에서 영감을 얻지 못했고 JSR-299 전문가 그룹 (EG)의 많은 협력과 노력이 없었다면이 중 어떤 것도 될 수 없었을 것입니다.

http://docs.jboss.org/weld/reference/latest/en-US/html/1.html

Guice에 비해 Weld가 엔터프라이즈 애플리케이션에 더 적합한 이유는 무엇입니까? Guice에 비해 장점이나 단점이 있습니까? 용접 인터셉터와 비교하여 Guice AOP에 대해 어떻게 생각하십니까? 성능은 어떻습니까?

내 선택

결국 나는 기본적으로 @Inject 외에 주석이 거의없는 깨끗한 프로그래밍 모델을 좋아하기 때문에 Guice를 사용하기로 결정했습니다. CDI보다 Guice에서 외부 라이브러리를 사용하는 것이 훨씬 쉽습니다. AOP는 Guice에서도 매우 간단합니다.


귀하의 질문에 대답하기 전에, 내가 단지 정보의 중요한 부분을 추가 할 수 있습니다 : JSR 330를 ( @Inject) (Guice 및 봄 프로젝트에 의해 표준화 된 5 월 2009 년 발표 )와이되는 JSR 299에서 재사용 . 이것은 주입 지점을 선언하는 측면에서 기본적인 DI 메커니즘을 다룹니다.

이제 질문으로 돌아가서 Guice보다 Spring에 대해 훨씬 더 많은 경험을 가지고 있다는 면책 조항을 사용합니다.

Weld의 엔터프라이즈 기능

  • 대체 구성 메커니즘 은 JSR-299에서 매우 깔끔하게 디자인되었으며 Java 코드 외부의 구성 메커니즘을 허용합니다 ( beans.xml).
  • 이벤트 는 매우 강력한 기능이며 JMS와 잘 어울립니다. 방금 Guice이벤트 버스를 찾았 지만 비교 방법을 말할 수 없습니다.
  • 이식 가능한 확장 은 기존 기술과 통합하거나 기존 코드를 깔끔한 방식으로 래핑하는 데 사용할 수있는 SPI입니다.

장점 단점

참고 : 나중에 여기에 몇 가지 항목을 추가하려고하지만이 답변은 이미 예상보다 깁니다. 죄송합니다.

  • 용접 / CDI

    • 표준화 : 어떤 것이 표준화되어 있고 좋은 구현이 있다면 많은 사람들이 그것을 사용하게 될 것입니다. 예 : Weld의 내장 범위는 Guice 또는 Spring 보다 몇 가지 더 많은 범위를 제공합니다 . 이들 모두를 확장 할 수 있지만, 대규모 커뮤니티에서 사용하는 경우 애플리케이션 프레임 워크는 오히려 표준 범위에 의존합니다.
    • 컨테이너 지원 : 이것은 이전 항목과 유사하지만 채택에 대한 주요 논쟁입니다. Glassfish 및 JBoss 6과 같은 주요 오픈 소스 애플리케이션 서버는 CDI 지원을 제공합니다 ( 여기 참조 ).
  • Guice / Spring

    • 실제 적용 : 대부분의 기존 응용 프로그램은 이미 Guice / Spring을 사용합니다. Spring / Guice는 항상 표준을 기반으로 구축되었으며 표준이 없거나 사용할 수없는 새로운 기능을 제공했습니다. 각각의 모범 사례를 따르면 프레임 워크는 응용 프로그램을 표준 기반으로 깔끔하게 만드는 데 도움이됩니다.

AOP 및 인터셉터

이것은 매우 많이 논의되는 주제이며, 나는 다른 하나를 선호 할 수 없습니다. 두 메커니즘 모두 매우 강력하지만 애플리케이션 아키텍처에 대한 최소한의 이해가 필요합니다. 데코레이터 와 이전에 참조한 이벤트 도 살펴보십시오 . 올바른 도구를 사용하는 것이 가장 좋지만 개발자가 이러한 메커니즘 중 하나를 사용해야하는 경우 개념을 이해하면 좋은 것임을 잊지 마십시오.

공연

안타깝게도 아직이 부분을 살펴볼 수 없었지만, 특히 사용자가 알지 못하는 사이에 많은 기능을 제공하는 프레임 워크를 사용할 때 따라야 할 몇 가지 규칙이 있습니다.

  • 가능하면 런타임에 여러 조회보다 단일 배선 단계를 선호하십시오.
  • 가능하면 애플리케이션 초기화시 모든 배선을 수행하십시오.
  • 모든 인터 셉션 단계 또는 AOP 프록시는 스택에 몇 가지 메서드 호출을 추가합니다.

CDI (Weld)는 아직 널리 사용되지 않아 비교가 어렵습니다. 몇 가지 사항 :

  • CDI는 EJB3, JSF 및 기타 JavaEE 표준과의 통합을 염두에두고 설계되었습니다. CDI에는 타사 라이브러리가 CDI 구현의 수명주기 및 내부 기능과 통합 될 수 있도록하는 소위 이식 가능한 확장이 있습니다.
  • CDI는 가능한 모든 코너 케이스를 염두에두고 설계되었으므로 필요한 모든 것을 다룰 수 있습니다. Spring, Guice 및 Seam은 이러한 상태로 진화했으며 CDI는이 세 가지 경험을 사용합니다.
  • 제 생각에 CDI 인터셉터는 Spring AOP가 충족 한 모든 요구를 충족시킬 수 없습니다. Guice AOP도 마찬가지입니다. AspectJ 구문을 사용하여 인터셉터를 정의 할 수 없습니다.
  • xml 정의가 없다는 것은 장점이자 단점이며 어떤 사람들은 (어떤 경우에는 옳은) xml 구성을 선호합니다.
  • 한정자 주석의 확장 된 사용은 신중하게 사용하지 않으면 (내 의견으로는) 큰 혼란을 일으킬 것입니다.

Guice 사용자를위한 CDI 는 좋은 비교입니다.


CDI가 Guice에 반대하는 가장 중요한 기능 은 Java EE 6 표준 부분 이라는 것입니다 .

CDI가 웹 애플리케이션을 코딩 할 때 사용해야하는 DI 표준임을 의미하므로 이것의 중요성은 과소 평가할 수 없습니다.

얼마 전에 저는 표준 코어 배포판 (적절하게 준비된)을 확보 할 수있는 기술을 살펴 보았습니다. 여기서 코어 모듈을 변경하지 않고도 기존 기능을 재정의 할 수있는 추가 모듈을 마음대로 추가 할 수 있습니다. 즉, 항아리를 추가하면 기능이 자동으로 활성화됩니다.

데스크톱과 웹 애플리케이션 모두에서 사용되는 코드베이스에 대해이 작업을 수행하는 가장 좋은 방법은 코드에 JSR-330 주석을 사용한 다음 CDI 또는 Guice (SVN, 곧 출시 될 예정)를 사용하는 것입니다. 3.0) 엔진으로.

몇 가지 프로젝트를 거쳐 Weld에서 발생하는 불투명 한 마법 대신 Guice 구성이 가장 마음에 든다는 것을 알게되었습니다. 또한 Weld를 사용하여 위에서 설명한대로 원하는 작업을 수행하는 방법은 여분의 jar에있는 클래스를 @Alternative로 표시 한 다음 beans.xml에 대체 클래스를 적용하고 싶다고 언급해야 함을 발견했습니다. 리팩토링에 강함).

그러나 대체로 JSR-330을 사용하면 이전에는 매우 지루하고 깨지기 쉬운 작업을 수행 할 수 있습니다 ( new매우 단단히 묶여 있기 때문에 ). 그것은 큰 승리입니다. 이와 같은 필요가 있으면 DI를 조사하는 것이 좋습니다.


또 다른 차별화 요소는 CDI가 매우 Java EE 지향적이라는 것입니다. 그것은 할 수있는 메커니즘 제공 접착제 다른 자바 EE 서브 시스템을 함께합니다.

즉. Bean에를 주석으로 추가 @Named("book")하면 통합 EL (Expression Language)에서 Bean이 ' book' 로 알려집니다 .

그런 다음 예를 들어 JSF 페이지에서 사용할 수 있습니다.

    <h:outputLabel value="Book title:" for="bookTitle"/>
    <h:outputText id="bookTile" value="#{book.title}"/>

AWS Lambda 서버리스 애플리케이션에서 Guice를 사용했습니다. AWS는 Lambda 함수에서 Spring보다 Guice 또는 Dagger를 사용할 것을 권장합니다. 참조 AWS 람다 모범 사례를

주된 이유는 Guice와 Dagger가 더 작은 프레임 워크이고 시작 시간이 더 빠르기 때문에 Lambda에서 필수적입니다.

OP는 Spring에 대해 언급하지 않았지만 Spring과 CDI / weld는 모두 이러한 프레임 워크가 제공하는 추가 기능을 필요로하는 엔터프라이즈 수준 애플리케이션을위한 것입니다. 따라서 DI, Guice 또는 Dagger 만 필요한 소규모 애플리케이션의 경우 최적입니다.

참조 URL : https://stackoverflow.com/questions/2652126/google-guice-vs-jsr-299-cdi-weld

반응형