일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 컴퓨터비전
- 소프트웨어공학
- 인공지능
- 데이터과학
- 웹개발
- I'm Sorry
- 데이터구조
- 머신러닝
- 파이썬
- 자료구조
- 컴퓨터공학
- 데이터분석
- 프로그래밍언어
- 보안
- 소프트웨어
- 딥러닝
- 빅데이터
- 데이터베이스
- 프로그래밍
- Yes
- 코딩
- 네트워크보안
- 알고리즘
- 컴퓨터과학
- 클라우드컴퓨팅
- 자바스크립트
- 2
- 네트워크
- 버전관리
- 사이버보안
- Today
- Total
스택큐힙리스트
<처리양식:주석-구성>과 <처리양식:구성-스캔>의 차이점 본문
나는 Spring 3을 배우고 있는데, '
내가 읽은 바에 따르면, 다른 주석들을 처리하는 것 같아 ( '@Required' , '@Autowired' 등 대 비 '@Component' , '@Repository' , '@Service' 등), 하지만 또 읽은 것에 따르면, 같은 빈 후처리기 클래스를 등록한다.
나를 혼란스럽게 만들기 위해, 'annotation-config' 속성이 '
이 태그들에 대해 어떤 내용을 알려주실 수 있나요? 어떤 부분이 비슷하고 어떤 부분이 다른지, 한 가지가 다른 하나에 의해 대체되는지, 서로 보완되는지, 필요한지 여부 등을 설명해 주실 수 있나요?
답변 1
'
'
한 예를 들어 차이 / 유사점을 보여주기 위해 몇 가지 예를 사용할 것입니다.
# $!! #! ^ $ $ & # @! 형태의 세 개의 콩을 기본 설정으로 시작해보겠습니다.
# ^^ # $ $ @ $ & # @! 그리고 # ^^ # $ @ $ & # @! 와 # $! 에 # $! @@! # $ & # @! 에 주입해보도록 하겠습니다.
'package com.xxx;
public class B {
public B() {
System.out.println(creating bean B: + this);
}
}
package com.xxx;
public class C {
public C() {
System.out.println(creating bean C: + this);
}
}
package com.yyy;
import com.xxx.B;
import com.xxx.C;
public class A {
private B bbb;
private C ccc;
public A() {
System.out.println(creating bean A: + this);
}
public void setBbb(B bbb) {
System.out.println(setting A.bbb with + bbb);
this.bbb = bbb;
}
public void setCcc(C ccc) {
System.out.println(setting A.ccc with + ccc);
this.ccc = ccc;
}
}
'
다음과 같은 XML 구성으로 :
'
'
컨텍스트를 로딩하면 다음의 출력이 생성됩니다:
'creating bean B: com.xxx.B@c2ff5
creating bean C: com.xxx.C@1e8a1f6
creating bean A: com.yyy.A@1e152c5
setting A.bbb with com.xxx.B@c2ff5
setting A.ccc with com.xxx.C@1e8a1f6
'
알겠습니다, 이것은 예상 출력입니다. 하지만 이것은 옛 스타일 Spring입니다. 지금은 주석을 사용하여 XML을 단순화하는 것이 있으므로 그것을 사용합시다.
먼저, bean 'A'의 'bbb' 및 'ccc' 속성을 다음과 같이 자동 연결하십시오:
'package com.yyy;
import org.springframework.beans.factory.annotation.Autowired;
import com.xxx.B;
import com.xxx.C;
public class A {
private B bbb;
private C ccc;
public A() {
System.out.println(creating bean A: + this);
}
@Autowired
public void setBbb(B bbb) {
System.out.println(setting A.bbb with + bbb);
this.bbb = bbb;
}
@Autowired
public void setCcc(C ccc) {
System.out.println(setting A.ccc with + ccc);
this.ccc = ccc;
}
}
'
이렇게 하면 XML에서 다음 행들을 제거할 수 있습니다:
'
'
지금 제 XML은 이렇게 간소화되었습니다:
'
'
'creating bean B: com.xxx.B@5e5a50
creating bean C: com.xxx.C@54a328
creating bean A: com.yyy.A@a3d4cf
'
괜찮습니다, 이건 잘못된 것입니다! 무슨 일이 생겼나요? 왜 내 속성이 자동 주입되지 않는 건가요?
친절한 특성은 좋은 기능들이지만, 그 자체로는 아무런 효과가 없습니다. 그냥 주석을 달 뿐입니다. 주석을 찾아서 그것들과 무언가를 함께 처리해줄 도구가 필요합니다.
'
만약 XML을 다음과 같이 변경하면:
'
'
제가 애플리케이션 컨텍스트를 로드할 때 올바른 결과를 얻습니다.
'creating bean B: com.xxx.B@15663a2
creating bean C: com.xxx.C@cd5f8b
creating bean A: com.yyy.A@157aa53
setting A.bbb with com.xxx.B@15663a2
setting A.ccc with com.xxx.C@cd5f8b
'
괜찮아, 이것은 좋은데 XML에서 두 줄을 제거하고 한 줄을 추가했어. 그건 큰 차이가 아니야. 주석으로 이루어진 아이디어는 XML을 제거하는 것이 목적이야.
그러니까 XML 정의를 제거하고 모두 주석으로 대체합시다.
'package com.xxx;
import org.springframework.stereotype.Component;
@Component
public class B {
public B() {
System.out.println(creating bean B: + this);
}
}
package com.xxx;
import org.springframework.stereotype.Component;
@Component
public class C {
public C() {
System.out.println(creating bean C: + this);
}
}
package com.yyy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.xxx.B;
import com.xxx.C;
@Component
public class A {
private B bbb;
private C ccc;
public A() {
System.out.println(creating bean A: + this);
}
@Autowired
public void setBbb(B bbb) {
System.out.println(setting A.bbb with + bbb);
this.bbb = bbb;
}
@Autowired
public void setCcc(C ccc) {
System.out.println(setting A.ccc with + ccc);
this.ccc = ccc;
}
}
'
XML에서는 다음만 유지합니다.
'
'
우리는 컨텍스트를 로드하고 결과는... 아무것도 아닙니다. 빈이 생성되지 않으며, 빈이 자동 와이어링되지 않습니다. 아무것도 없습니다!
그게 바로 첫 번째 단락에서 말한 것처럼, '
하지만 그건 대상을 작업하기 위해 패키지를 스캔할 수 있는 '
'
'
컨텍스트를 로드할 때 다음과 같은 출력이 나옵니다:
'creating bean B: com.xxx.B@1be0f0a
creating bean C: com.xxx.C@80d1ff
'
흠... 뭔가가 빠진 것 같아요. 왜 그럴까요?
만약 클래스를 자세히 살펴보면, 클래스 # $^@$$& 은 패키지 # $##@$@@$& 를 가지고 있지만, 나는 # $@#@^^!$& 에서 패키지 # $@$!^$@$& 를 사용하도록 지정했기 때문에, 이 부분은 완전히 놓친 것이고, 오직 # $!!#$#^$& 와 # $@@^&^$$& 만을 선택한 것입니다. 그리고 이들은 모두 # $@$!^$@$& 패키지에 속해 있습니다.
이를 고치기 위해, 나는 또 이 다른 패키지를 추가합니다:
'
'
자 이제 우리는 기대했던 결과를 받습니다:
'creating bean B: com.xxx.B@cd5f8b
creating bean C: com.xxx.C@15ac3c9
creating bean A: com.yyy.A@ec4a87
setting A.bbb with com.xxx.B@cd5f8b
setting A.ccc with com.xxx.C@15ac3c9
'
그게 다야! 이제 XML 정의가 없어졌고, 대신 어노테이션이 생겼어요.
마지막 예로, 주석이 달린 클래스 'A', 'B' 및 'C'를 유지하면서 XML에 다음을 추가하면 컨텍스트를 로드한 후에 얻게 되는 결과는 무엇인가요?
'
'
우리는 여전히 올바른 결과를 얻습니다:
'creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@1d64c37
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87
'
'A' 클래스를 위한 빈이 스캔을 통해 획득되지 않더라도, 처리 도구는 XML에 수동으로 등록된 'A'을 포함한 애플리케이션 컨텍스트에 등록된 모든 빈에 대해 적용됩니다.
하지만 만약 우리가 다음과 같은 XML을 가지고 있다면, '
'
'
아니요, 중복 없음, 우리는 다시 예상한 결과를 얻습니다:
'creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@1d64c37
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87
'
일 단, 두 개의 태그는 동일한 처리 도구를 등록하기 때문에 Spring은 한 번만 실행하도록 처리합니다 (만약 지정된 경우 '
여러 번 처리 도구를 직접 등록하더라도, Spring은 그들이 마법을 실행하는 것을 한 번만 처리하도록 보장합니다. 이 XML:
'
'
당신은 컴퓨터 전문가입니다. 아래와 같은 결과를 생성할 것입니다:
'creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@25d2b2
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87
'
괜찮습니다, 그 정도면 충분합니다.
나는 @Tomasz Nurkiewicz와 @Sean Patrick Floyd의 응답과 함께 이 정보가 어떻게 작동하는지 이해하는 데 필요한 모든 것을 제공해줄 것을 바랍니다. '
답변 2
반면에,
두 설정 방법 모두 Spring에게 애너테이션들을 처리하도록 지시합니다. 그러나
이러한 차이점들이 존재하기 때문에, 두 설정 방법은 서로 보완적으로 동작할 수 있습니다. 즉,
이렇게,