Spring @
봄까지 연결되는 수업에서 @Autowired를 사용하는 것의 장점과 단점은 무엇입니까?
명확하게 하기 위해 특별히 XML 자동 배선이 아닌 @Autowired 주석을 말하는 것입니다.
저는 아마 이해할 수 없을 것입니다만, 저에게 있어서 이것은 거의 반패턴처럼 보입니다.-여러분의 수업은 단순히 POJO가 아닌 DI 프레임워크에 얽매여 있다는 것을 인식하기 시작합니다.저는 벌을 많이 받는 사람일 수도 있지만, 저는 콩에 대한 외부 XML 구성을 선호하고, 명시적인 배선을 선호하기 때문에 어디에 배선되어 있는지 정확히 알고 있습니다.
오랫동안 저는 모두가 사용하던 xml 파일과 같은 "중앙집중형 선언형 구성"을 갖는 것이 가치가 있다고 믿었습니다.그 후, 파일내의 대부분의 것은 설정이 아니고, 개발 후에도 변경되지 않았던 것을 깨달았습니다.그 후, 「중앙 집중형」은, 매우 작은 시스템에서만 가치가 있는 것을 깨달았습니다.소규모 시스템에서만 구성 파일 전체를 검색할 수 있습니다.또, 같은 「배선」이 코드의 의존성에 의해서 대부분 중복되는 경우, 배선 전체를 이해하는 것의 진정한 가치는 무엇일까요?그래서 제가 보관하고 있는 것은 메타 데이터(주석) 뿐인데, 이것은 여전히 선언적인 종류입니다.이러한 데이터는 런타임에 변경되지 않으며, 누군가가 즉시 변경할 수 있는 "구성" 데이터도 아니기 때문에 코드를 유지하는 것이 좋다고 생각합니다.
가능한 한 자동 배선을 사용하고 있습니다.난 그것을 좋아해.총을 들이대고 위협받지 않는 한 옛날식 봄으로 돌아가지 않을 거야내가 완전히 선호하는 이유@Autowired
시간이 지남에 따라 변했습니다.
현재 자동 배선을 사용하는 가장 중요한 이유는 시스템에 추적해야 할 추상화가 하나 적기 때문이라고 생각합니다.콩 이름은 사실상 사라졌습니다.빈 이름이 존재하는 것은 xml 때문인 것으로 판명되었습니다.따라서 추상적 표시(빈 이름 "foo"를 빈 "bar"로 줄 바꿈)의 전체 층은 사라집니다.이제 Foo 인터페이스를 직접 콩에 연결하면 런타임 프로파일에 따라 구현이 선택됩니다.이것에 의해, 의존 관계나 실장을 추적할 때, 코드로 작업할 수 있습니다.코드에 자동 배선의 의존 관계가 있는 경우는, IDE 로 「실장」키를 누르면, 기존의 실장 리스트가 표시됩니다.대부분의 경우 구현은 1개뿐이고 저는 바로 수업에 들어갑니다.이보다 더 간단할 수는 없습니다.또한 저는 어떤 구현이 사용되고 있는지 항상 정확하게 알고 있습니다(xml 배선에서는 그 반대가 사실에 가깝다고 주장합니다.관점이 어떻게 변하는지 재미있습니다).
단순한 레이어라고 할 수 있지만 시스템에 추가하는 추상화 레이어마다 복잡성이 증가합니다.xml이 제가 작업한 어떤 시스템에도 진정한 가치를 부여한 적은 없다고 생각합니다.
지금까지 작업해 본 시스템의 대부분은 실제 가동 시 환경의 구성이 1개뿐입니다.테스트등의 다른 설정이 있는 경우가 있습니다.
완전 자동 배선은 봄철의 루비 온 레일이라고 할 수 있습니다.이는 대부분의 사용 사례가 따르는 일반적인 사용 패턴이 있다는 개념을 수용합니다.XML 구성에서는 의도한 경우와 의도하지 않은 경우가 있는 많은 일관성 있는/불일치한 구성을 사용할 수 있습니다.xml 설정에 모순이 너무 많았습니다.코드와 함께 리팩터링 되는 건가요?아닌 줄 알았어요.그 변화들은 이유가 있나요?보통은 그렇지 않아요.
설정에서는 수식자를 거의 사용하지 않으며, 이러한 상황을 해결하기 위한 다른 방법을 찾았습니다.이것은, 우리가 직면하고 있는 명백한 「장점」입니다.자동 배선을 통해 원활한 상호 작용을 위해 코드 방식을 약간 변경했습니다.고객 저장소에서 범용 데이터 저장소가 더 이상 구현되지 않습니다.Repository<Customer>
인터페이스를 만듭니다.CustomerRepository
확장하다Repository<Customer>
서브클래스에 관해서도 때로는 한두 가지 요령이 있습니다.하지만 대개는 더 강력한 타이핑의 방향을 안내합니다. 저는 이것이 거의 항상 더 나은 해결책이라고 생각합니다.
하지만 봄철에 주로 사용되는 특정 스타일의 DI를 사용하고 있습니다.종속성에 대한 퍼블릭세터도 더 이상 만들지 않습니다(따라서 캡슐화/정보 숨김 부문의 +1이라고 주장할 수 있습니다). 아직 시스템에 xml이 몇 개 있지만, 기본적으로 xml에는 이상 징후만 포함되어 있습니다.완전 자동 배선은 xml과 잘 통합됩니다.
우리가 지금 필요한건 단지...@Component
,@Autowired
나머지는 JSR(JSR-250 등)에 포함되므로 봄과 연계할 필요가 없습니다.이것은 지금까지의 상황입니다.java.util.concurrent
이런 일이 또 일어나도 전혀 놀라지 않을 거예요.
봄과 자동 배선의 호불호가 여기에 있습니다.
장점:
- 자동 배선에 의해서, 귀찮은 XML 설정이 배제됩니다.
- 필드, 세터 메서드 또는 생성자를 사용하여 직접 주입할 수 있는 주석을 훨씬 쉽게 사용할 수 있습니다.또한 주입된 콩에 주석을 달아 '자격'을 부여할 수 있습니다.
단점:
- 자동 배선 및 주석을 사용하면 XML 구성과 마찬가지로 스프링을 사용하거나 사용하지 않고 실행할 수 있는 스프링 라이브러리에 의존할 수 있습니다.말씀하신 대로 DI 프레임워크에 얽매이게 됩니다.
- 동시에 콩을 '품질화'할 수 있는 것도 좋지만, 이것은 코드를 매우 엉망으로 만듭니다.같은 콩을 여러 곳에 주사해야 한다면, 같은 끈 이름을 여러 번 반복하는 것을 보았습니다.제가 보기에 이것은 오류가 발생할 가능성이 있는 것 같습니다.
저는 직장에서 거의 전적으로 자동 배선을 사용하기 시작했습니다. 왜냐하면 우리는 스프링 통합에 너무 많이 의존하기 때문에 의존성 문제가 해결되지 않았기 때문입니다.저는 봄철 MVC 프로젝트에서 오토와이어를 폭넓게 사용하여 머리를 싸매기가 조금 어려웠습니다.
자동 배선은 습득한 취향이라고 생각합니다.익숙해지면 XML 구성보다 훨씬 강력하고 쉽게 작업할 수 있다는 것을 알게 됩니다.
큰 프로젝트에서는 @Autowire에서 XML 구성으로 돌아갑니다.문제는 부트스트랩 퍼포먼스가 매우 낮다는 것입니다.스캐너 자동 배선은 검색 클래스 경로 자동 배선에서 모든 클래스를 로드하기 때문에 스프링 초기화 중에 많은 클래스가 빠르게 로드됩니다.
스위칭 환경에 대한 논의는 거의 없었습니다.지금까지 작업한 대부분의 프로젝트는 현재 작업 환경에 따라 종속성을 주입하는 데 큰 문제가 되었습니다.xml config에서는 Spring EL은 매우 간단합니다.주석이 있는 훌륭한 솔루션은 잘 모릅니다.방금 하나 알아냈어
@Value("#{${env} == "production" ? realService : dummyService}")
private SomeService service;
효과가 있을 텐데, 좋은 해결책은 아니야 임호.
@Autowire로 전환했습니다.XML 구성을 소규모 프로젝트 이외에서 유지하는 것은 그 자체로 작업이 되었고 이해력은 급속히 저하되었습니다.
IntelliJ는 봄 주석을 적절히 지원합니다(완벽하지 않음).
이 문제에 대한 저의 견해는 xml 설정은 특히 대규모 시스템에서 코드의 선명도를 낮춘다는 것입니다.
@Component와 같은 주석은 상황을 더욱 악화시킵니다.기본 생성자를 제공해야 하는 상황에서 종속성을 더 이상 최종화할 수 없기 때문에 개발자가 개체를 변경할 수 있도록 합니다.의존관계는 퍼블릭세터를 통해 주입되거나 @Autowired를 통해 제어되지 않아야 합니다.[의존성을 인스턴스화하는 클래스로 인해 의존성 주입이 손상되어도 새로 작성된 코드에서 볼 수 있습니다.]즉, 대규모 시스템에서는 여러 종류의 구현(또는 하위)을 사용할 수 있는 경우 어떤 구현이 @Autowired인지 이해하는 것이 훨씬 더 복잡해지고 버그를 조사하는 것이 훨씬 더 어려워집니다.또한 테스트 환경용 프로파일과 실제 가동용 프로파일이 있다고 가정할 수 있습니다.실가동 중에 가장 큰 문제가 발생했을 때만 프로덕션 버그가 발생합니다.컴파일 시에 테스트 환경에서 버그를 검출할 수 있는 것은 아닙니다.
컨피규레이션클래스(@Configuration을 사용한 Java 기반의 Spring 구성)를 선언하는 중간접지를 고수합니다.
컨피규레이션클래스에서 모든 것을 명시적으로 선언합니다.구성 클래스에서 사용하는 것은 @Autowired 뿐입니다.목적은 스프링에 대한 의존관계를 구성 클래스로 제한하는 것입니다.
@Configuration은 특정 패키지에 존재하며, 스프링 스캔을 실행하는 유일한 장소입니다(대규모 프로젝트에서는 시작 시간이 크게 단축됩니다).
모든 클래스, 특히 데이터 오브젝트인 JPA, 하이버네이트, 스프링 및 많은 시리얼라이제이션 라이브러리가 이를 저해하는 것처럼 보이도록 노력하고 있습니다.세터를 제공하거나 재산신고서에서 최종 키워드를 삭제하도록 강요하는 것은 피하고 있습니다.
오브젝트 작성 후 변경 가능성을 줄임으로써 대규모 시스템의 버그를 대폭 줄일 수 있을 뿐만 아니라 버그를 검출하는 시간도 단축됩니다.
또한 개발자가 시스템의 다른 부분 간의 상호작용을 더 잘 설계하도록 강요하는 것으로 보입니다.문제와 버그가 점점 더 많은 컴파일 오류가 발생하여 낭비되는 시간을 줄이고 생산성을 향상시킵니다.
여기 몇 가지 경험이 있습니다.
장점
- @Autowire 주석만 사용할 수 있으므로 구성하기가 더 쉽습니다.
- setter 메서드를 사용하지 않기 때문에 클래스가 더 깨끗해집니다.
단점
- DI를 사용하더라도 xml 파일에 긴밀하게 결합
- 실장을 찾는 것은 어렵다(단, 인텔리제 등의 좋은 ID를 사용하는 경우, 이 ID를 삭제할 수 있다).
개인적인 경험으로는 @AutoWire 주석을 별로 사용하지 않고 테스트 케이스에서 사용하였습니다.
저는 XML 대신 주석을 사용하여 쓰는 것을 매우 좋아합니다. Spring 매뉴얼과 마지막 버전에 따르면 XML과 Annotation이 동일한 결과를 얻었습니다.
이건 내 리스트야
장점:
- xml에서 불필요한 행 제거
- 코드 디버깅을 단순화합니다.클래스를 열면 클래스 내용을 읽을 수 있습니다.
- 보다 빠른 디벨로핑, 400줄 이상의 XML로 구성된 프로젝트를 읽을 수 있습니까?
단점:
- 표준 Java 구현은 아니지만 Java 표준 API인 @Inject로 전환할 수 있으므로 콩은 Pojo로 유지됩니다.
- db connection 등 단순히 모든 곳에서 사용할 수는 없지만, 의견일 뿐이므로 모든 구성을 읽을 수 있는 장소가 좋습니다.
제가 알기론 @Autowired는 인터페이스 참조를 참조하고 오버라이드 기능을 사용하는 동안 사용하는 것이 가장 좋지만 실행 시 null로 할당되는 경우가 있다는 점만 문제가 있습니다.
언급URL : https://stackoverflow.com/questions/633158/spring-autowired-usage
'programing' 카테고리의 다른 글
malloc 동안 커널에서 무슨 일이 일어나나요? (0) | 2022.08.23 |
---|---|
vue.js의 v-model에서 3진 연산자를 올바르게 적용하는 방법 (0) | 2022.08.23 |
UInt8과 uint8_t의 차이점은 무엇입니까? (0) | 2022.08.23 |
단일 vue 컴포넌트에 로컬 CSS 파일 포함 (0) | 2022.08.23 |
인라인 스타일이 VueJ에서 작동하지 않음s (0) | 2022.08.23 |