스택큐힙리스트

<처리양식:주석-구성>과 <처리양식:구성-스캔>의 차이점 본문

카테고리 없음

<처리양식:주석-구성>과 <처리양식:구성-스캔>의 차이점

스택큐힙리스트 2023. 9. 3. 18:29
반응형

나는 Spring 3을 배우고 있는데, ''와 ''의 기능을 전혀 이해하지 못하는 것 같다.

내가 읽은 바에 따르면, 다른 주석들을 처리하는 것 같아 ( '@Required' , '@Autowired' 등 대 비 '@Component' , '@Repository' , '@Service' 등), 하지만 또 읽은 것에 따르면, 같은 빈 후처리기 클래스를 등록한다.

나를 혼란스럽게 만들기 위해, 'annotation-config' 속성이 '' 에 있습니다.

이 태그들에 대해 어떤 내용을 알려주실 수 있나요? 어떤 부분이 비슷하고 어떤 부분이 다른지, 한 가지가 다른 하나에 의해 대체되는지, 서로 보완되는지, 필요한지 여부 등을 설명해 주실 수 있나요?

답변 1

''는 XML로 정의되거나 패키지 스캔으로 정의된 애플리케이션 컨텍스트에 이미 등록된 빈들에 대한 주석을 활성화하는 데 사용됩니다.

'' 는 n-config>' does but #$!#@@^&$& 하는 것도 할 수 있지만, '' 는 또한 애플리케이션 컨텍스트 내에서 빈을 찾고 등록하기 위해 패키지를 스캔합니다.

한 예를 들어 차이 / 유사점을 보여주기 위해 몇 가지 예를 사용할 것입니다.

# $!! #! ^ $ $ & # @! 형태의 세 개의 콩을 기본 설정으로 시작해보겠습니다.

# ^^ # $ $ @ $ & # @! 그리고 # ^^ # $ @ $ & # @! 와 # $! 에 # $! @@! # $ & # @! 에 주입해보도록 하겠습니다.

'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에서는 다음만 유지합니다.

'

'

우리는 컨텍스트를 로드하고 결과는... 아무것도 아닙니다. 빈이 생성되지 않으며, 빈이 자동 와이어링되지 않습니다. 아무것도 없습니다!

그게 바로 첫 번째 단락에서 말한 것처럼, '' 는 애플리케이션 컨텍스트 내에 등록된 빈들에 대해서만 작동합니다. 세 개의 빈에 대한 XML 구성을 제거했기 때문에 빈이 생성되지 않고 ''는 작업할 대상이 없습니다.

하지만 그건 대상을 작업하기 위해 패키지를 스캔할 수 있는 ''에게는 문제가 되지 않을 것입니다. 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 프레임워크에서 사용되며, 주요한 차이점들을 살펴볼 것입니다.

는 Spring 컨테이너에게 애너테이션을 처리하도록 지시합니다. 이 애너테이션은 자바 소스 코드에서 특정한 역할을 하는 주석으로 볼 수 있습니다. 주로 컴포넌트 스캔, 자동 와이어링, AOP(관점 지향 프로그래밍) 등을 설정하는 데 사용됩니다. 이는 컴포넌트와 빈들을 찾아 등록하는 것이 아니라, 애너테이션들을 바탕으로 Spring의 다른 기능들을 활성화하는 역할을 합니다.

반면에, 은 자동으로 컴포넌트와 빈을 검색하고 등록하는 데 사용됩니다. 이는 base-package 속성을 통해 패키지의 경로를 지정하고, 해당 경로 아래에 있는 모든 클래스들을 스캔하여 애너테이션이 적용된 클래스들을 찾아냅니다. 그리고 이렇게 검색된 클래스들은 Spring 컨테이너에 등록되어 DI(의존성 주입)나 AOP와 같은 기능들을 사용할 수 있게 됩니다.

두 설정 방법 모두 Spring에게 애너테이션들을 처리하도록 지시합니다. 그러나 는 클래스들을 찾아 등록하는 것이 아니라, 애너테이션을 기반으로 Spring의 다른 기능들을 활성화하는 데 사용됩니다. 반면에 은 클래스들을 검색하여 컴포넌트나 빈으로 등록하며, 이를 통해 Spring의 다양한 기능을 활용할 수 있게 됩니다.

이러한 차이점들이 존재하기 때문에, 두 설정 방법은 서로 보완적으로 동작할 수 있습니다. 즉, 로 애너테이션 기능을 활성화 시킨 후, 을 통해 컴포넌트들을 자동으로 등록하는 것이 보다 효과적인 방법이 될 수 있습니다.

이렇게, 은 Spring 프레임워크에서 애너테이션을 활용하는데 사용되며, 각각의 차이점을 살펴보았습니다. 이러한 설정 방법들을 통해 더욱 효율적인 프로그래밍을 할 수 있으며, Spring의 다양한 기능들을 활용할 수 있습니다.

반응형
Comments