오늘 저는 @configuration과 @bean의 조합을 사용하여 콩을 만들거나 @Service 및 기타 주석을 직접 사용하여 수업에 배치할지 동료들과 논의했습니다. 저자는 첫 번째 유형, 즉 @configuration과 @bean의 조합을 사용하는 경향이 있습니다.
먼저 예를 살펴 보겠습니다. 목표는 SearchService의 Bean을 만드는 것입니다.
@Service를 직접 사용하십시오 :
// searchService.javapackage li.koly.search; import java.util.list; public interface searchService {list <boodge> 검색 (string q);} // elasticsearchserviceimpl.javapackage li.koly.search; import org.springframework.stereotyp.service; import java.util.urrays; java.util.list; @servicecomponentpublic class elasticsearchserviceimpl은 searchService {@override public list <botorl> search (String q) {return arrays.aslist ( "hello", q); }} // application.javapackage li.koly.search; import org.springframework.bean.beans.annotation.autowired; import org.springframework.sboot.springApplication; import org.spramframework.autoconfigure.springBootapplication; org.springframework.web.bind.annotation.getmapping; import org.springframework.bind.annotation.restcontroller; import java.util.list;@springbootapplication@restControllerPublic Classplication {@autow private searchservice searchService; @GetMapping ( "/search") public list <bood> hello (String q) {return searchService.search (q); } public static void main (String [] args) {springApplication.run (application.class, args); }}응용 프로그램 시작, 브라우저 액세스 : http : // localhost : 8081/search? q = koly, page display : [ "hello", "koly"]
@Configuration 및 @Bean 사용 방법 :
// elasticsearchserviceimpl.javapackage li.koly.search; import java.util.arrays; import java.util.list; public class elasticsearchserviceimpl <@override public list <boodge> search (String q) {return arrays.aslist ( "hello", q); }} // appConfig.javapackage li.koly.search; import org.springframework.context.annotation.bean; import org.spramframework.context.annotation.configuration; @configurationPublic Clast AppConfig {@Bebean Searkice SearchService () {return return retonceorcserviceService (); }}@Service를 직접 사용하는 코드와 비교하여 AppConfig 클래스가 있으며 ElasticsearchServiceImpl에 배치 된 @Service 주석이 제거됩니다. 언뜻보기에는 더 많은 코드와 클래스가 있습니다. 그렇다면 후자를 사용하면 어떤 이점이 있습니까?
저자는 이점이 다음과 같이 믿습니다.
우려의 분리
@Configuration 및 @Bean을 사용하여 콩 생성은 한 곳에 배치되며 인터페이스와 구현은 콩 생성과 관련이 없습니다.
Bean의 생성을 변경 해야하는 경우 해당 구성 클래스를보고 수정하면 해당 Java Bean으로 이동할 필요가 없습니다. 예를 들어, 때로는 Bean을 생성하려면 @Scope 또는 @Profile과의 협력이 필요하며 현재 구성 클래스 만 수정하면됩니다.
단일 책임
@Service 주석 자체는 두 가지 책임을 가정합니다.
하나는 콩을 만드는 것입니다.
두 번째는 클래스를 서비스로 식별하는 것입니다.
주석이 달린 클래스는 원래 도메인 구동에 의해 정의 된 "서비스"임을 나타냅니다.
Design (Evans, 2003)은 "캡슐화 된 상태가없는 모델에서 단독으로 서있는 인터페이스로 제공되는 작업"으로서.
위는 @Service 주석에 대한 Spring의 설명입니다. 즉, @Service는 실제로 DDD에서 제공되는 무국적, 독립적 인 작업을 나타냅니다.
@bean 및 @configuration의 방법을 사용하여 Bean의 생성은 별도의 클래스로 넘겨지고 서비스 ID는 Java의 인터페이스 및 클래스 이름으로 넘겨집니다. 이것은 또한 스프링 데이터에 반영됩니다. 예를 들어, 저장소는 Crudrepository와 같은 이름으로 식별됩니다. 따라서 서비스는 또한 그 이름에 반영됩니다. Spring이 제공 한 주석에 의존하지 않고 이름을 통해 특정 계층 구조 정의는 Mapper 레이어, 유효성 검사기 계층 등과 같은 프로젝트에 따라 더 많은 계층 구조를 제공하기 편리합니다.
또한 콩과 서비스는 두 차원입니다. 하나는 구체적인 구현에 관한 것이고 다른 하나는 DDD의 개념에 관한 것입니다.
더 유연합니다
@Bean을 사용하면 라이브러리에서 클래스 인스턴스를 만들 수 있습니다. @Service를 사용하는 경우 라이브러리의 해당 클래스에 @Service 주석을 추가 할 수 없습니다.
최소 지식 (최소 지식 원칙)
최소 지식 원칙은 다음을 의미합니다.
기능을 완성하는 데 필요한 기술이나 지식이 적을수록 프로젝트가 간단한 지 확인하고 프로젝트 학습의 어려움을 줄일 수 있습니다.
@Service를 사용하면 클래스 라이브러리에서 클래스 인스턴스를 만들 수 없으므로 유사한 요구 사항을 만나면 @Configuration 및 @Bean의 형태를 사용해야합니다. 현재 @Service, @Configuration 및 @Bean과 같은 주석이 전체 프로젝트에 동시에 존재하며, 이러한 주석이하는 일은 동일합니다.
@Service를 사용하면 @Service, @Component, @Configuration 및 @Bean이 동시에 존재할 가능성이 높습니다.
@Configuration 및 @Bean을 사용하는 경우 최소 지식의 원칙을 준수하는 @Service 및 @Component를 완전히 무시할 수 있습니다.
마지막으로, Spring 's Bean은 이전 XML로 만들어졌으며 Java는 나중에 구성에 사용되었습니다. XML을 사용하지 않는 주된 이유는 XML이 충분히 간결하지 않으며 콩의 생성을 다양한 클래스로 흩어지는 대신 컴파일 시간 점검과 같은 기능이 없기 때문입니다.
요약하면 저자는 @configuration과 @bean을 사용하는 것을 선호합니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.