봄 @ 자동 유선 사용법
Spring에 의해 연결되는 클래스에서 @Autowired 를 사용하는 장단점은 무엇입니까 ?
명확히하기 위해 XML에서 자동 배선이 아닌 @Autowired 주석 에 대해 구체적으로 이야기하고 있습니다.
나는 아마 그것을 이해하지 못하지만, 나에게는 거의 반 패턴처럼 보입니다. 여러분의 클래스는 POJO가 아닌 DI 프레임 워크에 묶여 있음을 인식하기 시작합니다. 어쩌면 나는 처벌을위한 열성이지만 콩에 대한 외부 XML 구성을 좋아하고 명확한 배선을 좋아하므로 어디에 무엇이 배선되어 있는지 정확하게 알고 있습니다.
오랫동안 우리 모두가 사용했던 xml 파일과 같은 "중앙 집중식, 선언적 구성"을 갖는 가치가 있다고 믿었습니다. 그런 다음 파일의 대부분의 구성이 구성 이 아님을 깨달았 습니다. 개발 후에도 변경되지 않았습니다. 그런 다음 "중앙 집중식"은 아주 작은 시스템에서만 가치가 있다는 것을 깨달았습니다. 작은 시스템에서만 구성 파일 을 전체적으로 파악할 수있을 것 입니다. 그리고 동일한 "배선"이 코드의 의존성에 의해 대부분 복제 될 때 실제로 배선 전체를 이해하는 가치는 무엇입니까? 따라서 내가 유지 한 유일한 것은 메타 데이터 (주석)이며, 이는 여전히 일종의 선언입니다. 이것들 은 런타임에 절대 바뀌지 않으며 결코 누군가가 즉시 변경하는 "구성"데이터-코드에 보관하는 것이 좋습니다.
가능한 한 완전 자동 배선을 사용합니다. 나는 그것을 좋아한다. 나는 총구를 위협하지 않는 한 구식 봄으로 돌아 가지 않을 것입니다. 완전히 선호하는 이유는 @Autowired
시간이 지남에 따라 변했습니다.
지금은 자동 배선을 사용하는 가장 중요한 이유는 시스템에서 추적해야 할 추상화가 적기 때문이라고 생각합니다. "콩 이름"은 사실상 사라졌습니다. 빈 이름은 xml 때문에 존재한다는 것이 밝혀졌습니다. 따라서 추상 간접의 전체 레이어 (bean-name "foo"를 bean "bar"에 연결)가 사라졌습니다. 이제 "Foo"인터페이스를 빈에 직접 연결하고 런타임 프로파일로 구현을 선택합니다. 이를 통해 종속성 및 구현을 추적 할 때 코드 로 작업 할 수 있습니다 . 내 코드에서 자동 유선 종속성을 볼 때 IDE에서 "go to implementation"키를 누르면 알려진 구현 목록이 나타납니다. 대부분의 경우 구현이 하나만 있으며 클래스에 직접 접근합니다. 할 수있다' 어떤 구현이 사용되고 있는지 (XML 배선을 사용하면 그 반대가 진실에 더 가깝다고 주장합니다.
이제 매우 단순한 계층이라고 말할 수 있지만 시스템에 추가하는 각 추상화 계층은 복잡성을 증가시킵니다 . 나는 XML이 내가 작업 한 시스템에 실제 가치를 더했다고 생각하지 않는다.
내가 작업 한 대부분의 시스템 에는 프로덕션 런타임 환경 이 하나만 구성되어 있습니다. 테스트 등을위한 다른 구성이있을 수 있습니다.
풀 오토와 이어링은 스프링의 루비 온 레일 (Ruby-on-rails of Spring)이라고 말하고 싶습니다. 대부분의 유스 케이스가 따르는 일반적이고 일반적인 사용 패턴이 있다는 개념을 수용합니다. XML 구성하면 허용 / 구성되지 않을 수 일치 / 불일치 구성 사용을 많이. 너무 많은 XML 구성이 불일치로 오버 보드되는 것을 보았습니다. 코드와 함께 리팩터링됩니까? 생각하지 않았다. 이유가있는 이유가 있습니까? 보통은 아닙니다.
우리는 구성에서 한정자를 거의 사용하지 않으며 이러한 상황을 해결하는 다른 방법을 찾았습니다. 이는 우리가 직면 한 명백한 "불이익"입니다. 자동 배선과의 원활한 상호 작용을 위해 코딩 방식을 약간 변경했습니다. 고객 저장소는 더 이상 일반 Repository<Customer>
인터페이스를 구현하지 않지만 CustomerRepository
확장 되는 인터페이스 를 만듭니다 Repository<Customer>
. 서브 클래 싱과 관련하여 간혹 트릭이있을 수도 있습니다. 그러나 일반적으로 더 강력한 타이핑 방향을 지시합니다. 거의 항상 더 나은 솔루션이라고 생각합니다.
그러나 그렇습니다. 대부분 봄이하는 특정 스타일의 DI와 관련이 있습니다. 우리는 심지어 우리는 여전히 우리의 시스템에서 일부 XML을 (우리가하고있는 캡슐화 / 정보 숨어 부서에서 일 주장 할 수 그래서),하지만 XML은 기본적으로 더 이상 종속성을 공개 세터를하지 않는 유일한 이상 현상을 포함한다. 완전 자동 배선은 XML과 잘 통합됩니다.
우리가 지금해야 할 유일한 것은입니다 @Component
, @Autowired
나머지는 (같은 JSR에 포함되는 JSR-250 우리가 스프링에 묶을 필요가 없습니다). 이것이 과거에 일어났던 방식 (물건이 java.util.concurrent
떠오를 것)이므로 이런 일이 다시 발생해도 전혀 놀라지 않을 것입니다.
나를 위해 여기 스프링과 자동 배선에 대해 내가 좋아하거나 싫어하는 것이 있습니다.
장점 :
- 자동 배선은 불쾌한 XML 구성을 제거합니다.
- 필드, 세터 메소드 또는 생성자를 사용하여 직접 주입 할 수있는 주석을 사용하는 것이 훨씬 쉽습니다. 또한 주입 된 콩에 주석을 달고 '자격을 부여'할 수 있습니다.
단점 :
- 자동 배선 및 주석을 사용하면 XML 구성과 마찬가지로 Spring을 사용하거나 사용하지 않고 실행할 수있는 Spring 라이브러리에 의존 할 수 있습니다. 당신이 말했듯이, 당신은 DI 프레임 워크에 묶여 있습니다.
- 동시에 나는 콩을 '자격을 갖춘'것이 좋아서 나에게 코드가 정말 지저분 해집니다. 여러 장소에 같은 콩을 주입 해야하는 경우 동일한 문자열 이름이 반복되는 것을 보았습니다. 나에게 이것은 오류 가능성이있는 것 같습니다.
우리는 어쨌든 스프링 통합에 너무 의존하여 종속성 문제가 무의미하기 때문에 거의 독점적으로 직장에서 자동 배선을 사용하기 시작했습니다. 나는 자동 배선을 광범위하게 사용하는 Spring MVC 프로젝트에서 일했고 내 머리를 감싸기가 조금 어려웠습니다.
저는 자동 배선이 습득 된 취향이라고 생각합니다. 일단 익숙해지면 XML 구성보다 훨씬 강력하고 쉽고, 골치 아픈 일이 아닙니다.
우리는 큰 프로젝트에서 @Autowire에서 XML 구성으로 다시 전환하고 있습니다. 문제는 부트 스트랩 성능이 매우 낮다는 것입니다. 자동 배선 스캐너는 자동 배선 검색 클래스 경로에서 모든 클래스를로드하므로 Spring 초기화 중에 많은 클래스가 열성적으로로드됩니다.
스위칭 환경에 대한 논의는 거의 없었습니다. 내가 작업 한 대부분의 프로젝트는 작업중 인 환경에 따라 종속성을 주입하는 실제 문제였습니다. xml 설정을 사용하면 Spring EL을 사용하여 매우 간단하며 주석이있는 멋진 솔루션을 알지 못합니다. 방금 하나를 알아 냈습니다.
@Value("#{${env} == "production" ? realService : dummyService}")
private SomeService service;
작동해야하지만 좋은 해결책은 아닙니다.
@Autowire로 전환했습니다. 작은 프로젝트가 아닌 다른 곳에서 XML 구성을 유지하는 것은 그 자체의 과제가되었으며 이해력이 빠르게 저하되었습니다.
IntelliJ는 Spring 주석을 완벽하게 지원합니다.
이 주제에 대한 나의 취지는 XML 구성이 특히 대형 시스템에서 코드의 선명도를 감소 시킨다는 것입니다.
Annotations like @Component makes things even worse. It steers developers to make objects mutable, as dependencies can't be made final anymore, given that default constructors need to be provided. Dependencies need to be either injected through public setter, or uncontrolled through @Autowired. [even worse dependency injection is compromised with classes that instantiate their dependencies, I still see this in newly written code!]. By uncontrolled I mean, in large systems, when multiple implementations (or children) of the type are available, it gets much more involved to understand which of the implementations was @Autowired, a complexity that makes investigating bugs much harder. It also means that, supposedly you have a profile for test environment and another for production, your production bugs will only happen when it hurts most - in production, rather than being able to spot the bugs in the test environment, or even better, at compile time!
I stick to the middle ground where I declare my configuration class(es), (java based Spring configuration using @Configuration)
I declare all my beans explicitly in the configuration class(es). I only use @Autowired in the configuration class(es), the purpose is to limit dependency on Spring to the configuration class(es)
The @Configuration reside in a specific package, that's the only place where the spring scan runs. (That speeds up start time substantially in large projects)
I strive to make all my classes immutable, especially the data object, JPA, Hibernate and Spring, as well as many serialization libraries seem to undermine this. I steer away from anything that forces me to provide setters, or remove the final keyword from my property declaration.
Reducing the possibilities of changing objects after they're created, reduces substantially the bugs in large system as well as reduces the time to find a bug when one exists.
It also seems that it forces developer to better design the interaction between the different parts of the system. Problems and bugs become more and more compilation errors, that reduces wasted time and improve productivity.
Here are some of experience
Pros
- Makes easier to configure because we can just use @Autowire annotation
- Don't want to use setter methods , so class will be more clean
Cons
- Tightly couple to xml file even though we are using DI
- Hard to find implementation (But if you your using good ides like intellij sure you can get rid of this)
As of my personal experiences I didn't use @AutoWire annotation that much but in test cases.
I really love write with annotations, instead of XML. According to the Spring manual and the last versions, XML and Annotation achieved the same result.
This is my list
Pro:
- Remove useless line from xml
- Simplify the debugging the code: when you open a class, you can read what you have in the class
- More fast developping, a project with 400 or more line of XML is readable?
Cons:
- Is not standard Java implementation, but you can switch to use @Inject, which is a Java Standard Api, so the bean remain a Pojo
- You cannot simply use everywhere, db connection e so on, but it's only an opinion, i prefer have a place where read all configuration.
For my understanding @Autowired is the best to use while refer to interface reference and use its override funtions, but I only find issue with this is that it sometimes assigned to null at runtime.
참고URL : https://stackoverflow.com/questions/633158/spring-autowired-usage
'Programing' 카테고리의 다른 글
모범 사례 : 소프트웨어 버전 관리 (0) | 2020.04.29 |
---|---|
커밋되지 않은 읽기 격리 수준을 사용해야하는 이유는 무엇입니까? (0) | 2020.04.29 |
안드로이드에서 가로 목록보기? (0) | 2020.04.29 |
Java EE 웹 개발, 어디서 시작하고 어떤 기술이 필요합니까? (0) | 2020.04.29 |
JavaScript에서 parseInt (string)과 Number (string)의 차이점은 무엇입니까? (0) | 2020.04.28 |