programing

와의 차이점

projobs 2022. 8. 13. 11:38
반응형

와의 차이점

는 봄 봄 3의 을 잘 것 같아요.<context:annotation-config> ★★★★★★★★★★★★★★★★★」<context:component-scan>.

제가 읽은 바로는 그들은 다른 주석을 다루는 것 같습니다.@Required,@Autowired vs vs etc@Component,@Repository,@Service또, 같은 bean post processor 클래스를 등록하고 있습니다.

더 은, 「...」라는 것이 .annotation-config 으로 돌리다<context:component-scan>.

누가 이 꼬리표 좀 밝혀줄래요?비슷한 점, 다른 점, 하나는 다른 것으로 대체되고, 둘은 서로를 완성합니다. 둘 중 하나가 필요한가요?

<context:annotation-config>는 응용 프로그램콘텍스트에 이미 등록되어 있는 콩의 주석을 활성화하기 위해 사용됩니다(XML로 정의되어 있는지 패키지스캔으로 정의되어 있는지에 관계없이).

<context:component-scan> 수 있는 일도 할 수 <context:annotation-config>, ""<context:component-scan>는 패키지를 스캔하여 응용 프로그램콘텍스트 내에서 콩을 검색 및 등록합니다.

몇 가지 예를 들어 차이점/비슷함을 보여 드리겠습니다.

세 의 기본 설정부터 시작하겠습니다.A,B ★★★★★★★★★★★★★★★★★」C, 를 사용하여, 를 참조해 주세요.B ★★★★★★★★★★★★★★★★★」C 주입되다A.

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 구성:

<bean id="bBean" class="com.xxx.B" />
<bean id="cBean" class="com.xxx.C" />
<bean id="aBean" class="com.yyy.A">
  <property name="bbb" ref="bBean" />
  <property name="ccc" ref="cBean" />
</bean>

콘텍스트를 로드하면 다음 출력이 생성됩니다.

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

이것이 예상 출력입니다.하지만 이것은 "구식" 봄이다.이제 주석이 있으므로 이를 사용하여 XML을 단순화해 보겠습니다.

그럼 먼저 하겠습니다.bbb ★★★★★★★★★★★★★★★★★」cccA다음과 같이 합니다.

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에서 다음 행을 삭제할 수 있습니다.

<property name="bbb" ref="bBean" />
<property name="ccc" ref="cBean" />

내 XML은 다음과 같이 단순화되었습니다.

<bean id="bBean" class="com.xxx.B" />
<bean id="cBean" class="com.xxx.C" />
<bean id="aBean" class="com.yyy.A" />

콘텍스트를 로드하면, 다음의 출력이 표시됩니다.

creating bean B: com.xxx.B@5e5a50
creating bean C: com.xxx.C@54a328
creating bean A: com.yyy.A@a3d4cf

좋아, 이건 잘못됐어!무슨 일입니까?내 숙박업소에 자동 전원이 켜지지 않는 이유는 무엇입니까?

주석은 좋은 기능이지만, 그것만으로는 아무것도 할 수 없습니다.그냥 주석만 달아요주석을 찾아서 처리하려면 처리 도구가 필요합니다.

<context:annotation-config>구하러 왔어요.그러면 자신이 정의된 동일한 응용 프로그램 컨텍스트에서 정의된 빈에서 발견된 주석의 작업이 활성화됩니다.

XML을 다음과 같이 변경하는 경우:

<context:annotation-config />
<bean id="bBean" class="com.xxx.B" />
<bean id="cBean" class="com.xxx.C" />
<bean id="aBean" class="com.yyy.A" />

애플리케이션 콘텍스트를 로드하면 적절한 결과를 얻을 수 있습니다.

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에서는 다음 내용만 보관합니다.

<context:annotation-config />

콘텍스트를 로드하면 결과는...아무 것도 없어요.콩은 생성되지 않으며, 자동 전원 공급도 되지 않습니다.아무것도 아니예요!

첫 '아까부터'는요<context:annotation-config />는 어플리케이션 컨텍스트 내에 등록된 콩에서만 작동합니다.에 대한 되지 않으며 3개의 콩은 XML로 작성되지 않았습니다.<context:annotation-config />'무엇을' 하다'

그것은 것입니다.<context:component-scan>패키지에서 동작하는 「스캔」을 스캔 할 수 있습니다.XML을 사용합니다.

<context:component-scan base-package="com.xxx" />

콘텍스트를 로드하면, 다음의 출력이 표시됩니다.

creating bean B: com.xxx.B@1be0f0a
creating bean C: com.xxx.C@80d1ff

음...뭔가 빠진 것 같아. 왜?

보면 class if 。A가 .com.yyy하지만, 제가 지정한 것은<context:component-scan>com.xxx.A.B ★★★★★★★★★★★★★★★★★」C에 있습니다.com.xxx★★★★★★★★★★★★★★★★★★.

이 문제를 해결하기 위해 다음 패키지도 추가합니다.

<context:component-scan base-package="com.xxx,com.yyy" />

이제 예상한 결과를 얻을 수 있습니다.

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 ★★★★★★★★★★★★★★★★★」CXML에 다음 항목을 추가하면 컨텍스트를 로드한 후 무엇을 얻을 수 있습니까?

<context:component-scan base-package="com.xxx" />
<bean id="aBean" class="com.yyy.A" />

여전히 올바른 결과를 얻을 수 있습니다.

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해서 것이 처리 가 그대로 .을 사용하다<context:component-scan> 콩에 , 「」의 경우도 .AXML 에 .

XML이 XML을 된 빈을 수 요?<context:annotation-config /> ★★★★★★★★★★★★★★★★★」<context:component-scan>

<context:annotation-config />
<context:component-scan base-package="com.xxx" />
<bean id="aBean" class="com.yyy.A" />

아니요, 중복되지 않습니다. 다시 예상된 결과를 얻을 수 있습니다.

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

는 두 가 동일한 도구를 <context:annotation-config />할 수 <context:component-scan>지정된 경우)이지만 스프링은 이러한 실행을 1회만 처리합니다.

직접 프로세싱 툴을 여러 번 등록해도 Spring에서는 마법이 한 번만 실행됩니다.이 XML은 다음과 같습니다.

<context:annotation-config />
<context:component-scan base-package="com.xxx" />
<bean id="aBean" class="com.yyy.A" />
<bean id="bla" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean id="bla1" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean id="bla2" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean id="bla3" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

는 다음 결과를 계속 생성합니다.

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의 답변만 있으면 .<context:annotation-config> ★★★★★★★★★★★★★★★★★」<context:component-scan>을 하다

나는 어떤 선언에 의해 어떤 주석이 선택되는지에 대한 멋진 요약을 발견했다.그것을 연구하면 알 수 있다.<context:component-scan/> recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn recogn로 인식되는 의 상위 집합을 합니다.<context:annotation-config/>아,아,아,아,아,아,아,아,아,아.

  • @Component,@Service,@Repository,@Controller,@Endpoint
  • @Configuration,@Bean,@Lazy,@Scope,@Order,@Primary,@Profile,@DependsOn,@Import,@ImportResource

바와 같이요.<context:component-scan/>논리적으로 확장되다 <context:annotation-config/>CLASSPATH는 Java @Configuration @CLASSPATH의 경우 Java @Configuration의 경우.

봄에는 두 가지 일을 할 수 있습니다.

  1. 콩 자동배선
  2. 콩 자동 검출

자동 1. 자동 배선
보통 application Context에 있습니다.xml 사용자가 정의하는 bean 및 기타 bean은 컨스트럭터 또는 setter 메서드를 사용하여 배선됩니다.XML 또는 주석을 사용하여 콩을 배선할 수 있습니다.주석을 사용하는 경우 주석을 활성화하고 다음을 추가해야 합니다.<context:annotation-config />applicationContext.xml로 이동합니다.콩(컨스트럭터 또는 세터)을 수동으로 배선할 필요가 없기 때문에 applicationContext.xml에서 태그 구조가 단순해집니다.사용할 수 있습니다.@Autowire주석과 콩은 유형별로 배선됩니다.

수동 XML 설정을 회피하기 위한 스텝은 다음과 같습니다.

자동 2. 자동 검출
을 한 더 하고 있습니다.즉, XML을 너무 .<bean>applicationContext.xml다음 주석 중 하나로 특정 콩을 표시하면 스프링이 표시된 콩과 그 종속성을 스프링 용기에 자동으로 연결합니다.주석은 @Controller, @Service, @Component, @Repository 입니다.사용방법<context:component-scan>기본 패키지를 가리키면 스프링이 부품을 자동으로 검출하여 스프링 컨테이너에 배선합니다.


결론:

  • <context:annotation-config />@Autowired 주석을 사용하기 위해 사용됩니다.
  • <context:component-scan />특정 콩 검색 및 자동 배선 시행에 사용됩니다.

<context:annotation-config>는 XML에서 정의되어 있는지 컴포넌트 스캔을 통해 정의되어 있는지 여부에 관계없이 콩 내의 여러 주석을 활성화합니다.

<context:component-scan>는 XMLXML을 사용하지하기 위한 입니다.

상세한 것에 대하여는, 다음의 URL 로 참조해 주세요.

<context:annotation-config>: spring config xml에 이미 등록된 콩의 주석을 스캔하여 활성화합니다.

<context:component-scan>: 콩 등록 +<context:annotation-config>


@Autowired@Required타겟 속성 수준이므로 이러한 주석을 사용하기 전에 spring IOC에 bean을 등록해야 합니다.이러한 주석을 사용하려면 각 콩을 등록하거나 다음을 포함해야 합니다.<context:annotation-config />.예.<context:annotation-config />등록된 콩에서만 작동합니다.

@Required 활성화RequiredAnnotationBeanPostProcessor가공 공구
@Autowired를 유효하게 하다AutowiredAnnotationBeanPostProcessor가공 공구

주의: 주석 자체는 할 일이 없습니다.핵심 프로세스를 담당하는 처리 도구가 필요합니다.


@Repository, @Service@Controller는 @Component이며 클래스 레벨을 대상으로 합니다.

<context:component-scan>그것은 패키지를 스캔하고, 콩을 찾고 등록하고, 그것은 그것에 의해 수행된 작업을 포함합니다.<context:annotation-config />.

XML에서 주석으로의 이행

그 둘의 차이는 정말 간단해요!

<context:annotation-config /> 

속성 및 콩 생성자만 배선하도록 제한된 주석을 사용할 수 있습니다.

반면에.

<context:component-scan base-package="org.package"/> 

모든 것을 유효하게 합니다.<context:annotation-config />고정관념을 더해서 할 수 있다. @Component,@Service,@Repository컨스트럭터나 속성에만 국한되지 않고 콩 전체를 배선할 수 있습니다.

<context:annotation-config>

해결만 하면 됩니다.@Autowired그리고.@Qualifer주석, 그게 다입니다. 의존성 주입에 대한 것입니다. 같은 작업을 수행하는 다른 주석도 있습니다. 제 생각에는 어떻게 해야 할까요?@Inject주석을 통해 DI를 해결하려고 합니다.

주의하세요, 심지어 당신이 선언한<context:annotation-config>요소, 어쨌든 당신은 당신의 클래스를 Bean이라고 선언해야 합니다. 우리는 세 가지 가능한 옵션이 있습니다.

  • XML:<bean>
  • @주: @Component, @Service, @Repository, @Controller
  • JavaConfig: @Configuration, @Bean

이제 와 함께

<context:component-scan>

다음 두 가지 작업을 수행합니다.

  • @Component, @Service, @Repository, @Controller 및 @Configuration으로 주석이 달린 모든 클래스를 스캔하여 Bean을 만듭니다.
  • 어떻게 하면 같은 일을 할 수 있다.<context:annotation-config>한다.

그러므로 당신이 선언한다면<context:component-scan>, 는 불필요하게 되었습니다.<context:annotation-config>너무.

이상입니다

일반적인 시나리오는 예를 들어 XML을 통해 빈만 선언하고 주석을 통해 DI를 해결하는 것입니다.

<bean id="serviceBeanA" class="com.something.CarServiceImpl" />
<bean id="serviceBeanB" class="com.something.PersonServiceImpl" />
<bean id="repositoryBeanA" class="com.something.CarRepository" />
<bean id="repositoryBeanB" class="com.something.PersonRepository" />

우리는 단지 비밀을 공표했을 뿐이지, 그것에 대해서는 아무것도 말하지 않았다.<constructor-arg>그리고.<property>DI는 @Autowired를 통해 자체 클래스로 설정됩니다.즉, 서비스에서는 저장소 컴포넌트에 대해 @Autowired를 사용하고, 저장소는 JdbcTemplate, DataSource 등에 대해 @Autowired를 사용합니다.구성 요소들

<context:annotation-config>tag는 Spring에게 @Autowired 주석을 포함하는 클래스의 종속성 요건을 자동으로 해결하기 위해 코드베이스를 스캔하도록 지시합니다.

Spring 2.5에서는 @Resource, @PostConstruct, @PreDestroy 등의 JSR-250 주석도 지원됩니다.이러한 주석을 사용하려면 특정 BeanPostProcessor를 스프링 컨테이너 내에 등록해야 합니다.항상 그렇듯이 개별 빈 정의로 등록할 수 있지만 다음을 포함하여 암묵적으로 등록할 수도 있습니다.<context:annotation-config>태그를 지정합니다.

주석 기반 구성의 스프링 문서에서 가져온 내용


Spring은 자동으로 '스테레오타입' 클래스를 감지하고 ApplicationContext에 대응하는 BeanDefinitions를 등록하는 기능을 제공합니다.

org.springframework.steetype의 javadoc에 따르면:

고정관념은 전체 아키텍처에서 유형 또는 방법의 역할을 나타내는 주석입니다(구현 수준이 아닌 개념 수준에서).예: @Controller @Service @Repository 등도구와 측면에서 사용하기 위한 것입니다(포인트 컷의 이상적인 표적이 됩니다).

스테레오타이프' 클래스를 자동 감지하려면<context:component-scan>태그는 필수입니다.

<context:component-scan>또한 tag는 지정된 패키지(및 그 모든 서브패키지) 아래에 있는 주입 가능한 콩 코드를 스캔하도록 스프링에게 지시합니다.

<context:component-scan /> implicitly enables <context:annotation-config/>

로 시험해 보다.<context:component-scan base-package="..." annotation-config="false"/>@Service, @Repository, @Component는 정상적으로 동작하지만 @Autowired,@Resource@Inject는 동작하지 않습니다.

즉, AutoowiredAnnotationBeanPostProcessor는 활성화되지 않으며 Spring 컨테이너는 자동 배선 주석을 처리하지 않습니다.

<context:annotation-config/> <!-- is used to activate the annotation for beans -->
<context:component-scan base-package="x.y.MyClass" /> <!-- is for the Spring IOC container to look for the beans in the base package. -->

또 하나 주목해야 할 중요한 점은context:component-scan를 암묵적으로 호출하다context:annotation-config콩에 대한 주석을 활성화합니다.네가 원하지 않는다면context:component-scan는 주석 할 수 .context:component-scan로로 합니다.false.

요약:

<context:annotation-config/> <!-- activates the annotations --> 
<context:component-scan base-package="x.y.MyClass" /> <!-- activates the annotations + register the beans by looking inside the base-package -->

<context:component-scan base-package="package name" />:

이것은 내 패키지에 콩 클래스가 있다는 것을 컨테이너에 알리기 위해 사용됩니다.빈 위에 컨테이너별로 빈 클래스를 스캔하기 위해서는 다음과 같은 스테레오 형식의 주석을 작성해야 합니다.

@Component,@Service,@Repository,@Controller

<context:annotation-config />:

XML로 bean 태그를 명시적으로 쓰지 않으면 컨테이너가 bean에 자동 배선이 있는지 여부를 어떻게 알 수 있습니까? 하면 될 것 같아요.@Autowired이렇게 콩에 있다는 알려줘야 합니다.context:annotation-config.

A <context:component-scan/>커스텀 태그는 Java 패키지를 스캔하여 클래스 경로에서 bean 정의를 등록하는 주요 업무와는 달리 에서와 동일한 bean 정의 세트를 등록합니다.

어떤 이유로 이 기본 bean 정의의 등록을 피할 필요가 있는 경우 component-scan에서 추가 "notation-config" 속성을 지정하는 방법은 다음과 같습니다.

<context:component-scan basePackages="" annotation-config="false"/>

참고 자료: http://www.java-allandsundry.com/2012/12/contextcomponent-scan-contextannotation.html

<context:annotation-config>:

은 내가 은 봄콩을 통해 .@Autowiredspring config xml은 spring config xml입니다.

<context:component-scan base-package="com.test...">

이것은 Spring 컨테이너에 주석이 달린 콩의 검색을 어디서 시작해야 하는지 알려 줍니다.이 봄에는 기본 패키지의 모든 하위 패키지를 검색합니다.

자세한 내용은 spring context schema 파일을 참조하십시오.다음은 spring-1994-4.3.xd의 경우입니다.

<conxtext:annotation-config />
Activates various annotations to be detected in bean classes: Spring's @Required and
@Autowired, as well as JSR 250's @PostConstruct, @PreDestroy and @Resource (if available),
JAX-WS's @WebServiceRef (if available), EJB 3's @EJB (if available), and JPA's
@PersistenceContext and @PersistenceUnit (if available). Alternatively, you may
choose to activate the individual BeanPostProcessors for those annotations.

Note: This tag does not activate processing of Spring's @Transactional or EJB 3's
@TransactionAttribute annotation. Consider the use of the <tx:annotation-driven>
tag for that purpose.
<context:component-scan>
Scans the classpath for annotated components that will be auto-registered as
Spring beans. By default, the Spring-provided @Component, @Repository, @Service, @Controller, @RestController, @ControllerAdvice, and @Configuration stereotypes    will be detected.

Note: This tag implies the effects of the 'annotation-config' tag, activating @Required,
@Autowired, @PostConstruct, @PreDestroy, @Resource, @PersistenceContext and @PersistenceUnit
annotations in the component classes, which is usually desired for autodetected components
(without external configuration). Turn off the 'annotation-config' attribute to deactivate
this default behavior, for example in order to use custom BeanPostProcessor definitions
for handling those annotations.

Note: You may use placeholders in package paths, but only resolved against system
properties (analogous to resource paths). A component scan results in new bean definitions
being registered; Spring's PropertySourcesPlaceholderConfigurer will apply to those bean
definitions just like to regular bean definitions, but it won't apply to the component
scan settings themselves.

「이행」을할 수 .@ComponentScan<context:component-scan>주석 방식으로.

봄에도 묘사되어 있습니다.이오

@Configuration 클래스에서 사용하는 컴포넌트스캔 디렉티브를 설정합니다.Spring XML 요소와 병행하여 지원을 제공합니다.

주의할 점은 Spring Boot을 사용하는 경우 @Configuration 및 @ComponentScan은 @Spring Boot Application 주석을 사용하여 암시할 수 있습니다.

언급URL : https://stackoverflow.com/questions/7414794/difference-between-contextannotation-config-and-contextcomponent-scan

반응형