Sự khác biệt giữa <bối cảnh: chú thích-config> và <bối cảnh: quét thành phần>


690

Tôi đang học Mùa xuân 3 và dường như tôi không nắm bắt được chức năng đằng sau <context:annotation-config><context:component-scan>.

Từ những gì tôi đã đọc họ dường như xử lý khác nhau chú thích ( @Required, @Autowiredvv vs @Component, @Repository, @Servicevv), nhưng cũng từ những gì tôi đã đọc họ đăng ký cùng một bài đậu xử lý các lớp học.

Để làm tôi bối rối hơn nữa, có một annotation-config thuộc tính trên <context:component-scan>.

Ai đó có thể làm sáng tỏ những thẻ này? Cái gì giống nhau, có gì khác nhau, cái này được thay thế bởi cái kia, chúng hoàn thiện lẫn nhau, tôi có cần một trong hai không?


5
techidiocy.com/annotation-config-vs-component-scan-spring-core đây là lời giải thích tuyệt vời
VdeX

để tóm tắt: sử dụng component-scanbất cứ khi nào có thể.
Jerry Chin

Câu trả lời:


1419

<context:annotation-config> được sử dụng để kích hoạt các chú thích trong các bean đã được đăng ký trong ngữ cảnh ứng dụng (bất kể chúng được xác định bằng XML hay bằng cách quét gói).

<context:component-scan>cũng có thể làm những gì <context:annotation-config><context:component-scan>còn quét các gói để tìm và đăng ký đậu trong ngữ cảnh ứng dụng.

Tôi sẽ sử dụng một số ví dụ để hiển thị sự khác biệt / tương đồng.

Hãy bắt đầu với một thiết lập cơ bản của ba đậu các loại A, BC, với BCđược tiêm vàoA .

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; 
  }
}

Với cấu hình XML sau:

<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>

Tải bối cảnh tạo ra đầu ra sau:

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

OK, đây là đầu ra dự kiến. Nhưng đây là "kiểu cũ" mùa xuân. Bây giờ chúng tôi có các chú thích vì vậy hãy sử dụng các chú thích để đơn giản hóa XML.

Đầu tiên, hãy tự động xác định bbbccccác thuộc tính trên bean Anhư vậy:

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;
  }
}

Điều này cho phép tôi xóa các hàng sau khỏi XML:

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

XML của tôi giờ đã được đơn giản hóa để:

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

Khi tôi tải bối cảnh tôi nhận được đầu ra sau:

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

OK, điều này là sai! Chuyện gì đã xảy ra? Tại sao tài sản của tôi không được tự động?

Chà, chú thích là một tính năng hay nhưng bản thân chúng không làm gì cả. Họ chỉ chú thích công cụ. Bạn cần một công cụ xử lý để tìm các chú thích và làm một cái gì đó với chúng.

<context:annotation-config>để giải cứu. Điều này kích hoạt các hành động cho các chú thích mà nó tìm thấy trên các bean được xác định trong cùng bối cảnh ứng dụng nơi chính nó được xác định.

Nếu tôi thay đổi XML của mình thành này:

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

Khi tôi tải bối cảnh ứng dụng, tôi nhận được kết quả thích hợp:

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

OK, điều này thật tuyệt, nhưng tôi đã xóa hai hàng khỏi XML và thêm một hàng. Đó không phải là một sự khác biệt quá lớn. Ý tưởng với các chú thích là nó nên xóa XML.

Vì vậy, hãy xóa các định nghĩa XML và thay thế tất cả chúng bằng các chú thích:

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;
  }
}

Trong khi trong XML, chúng tôi chỉ giữ điều này:

<context:annotation-config />

Chúng tôi tải bối cảnh và kết quả là ... Không có gì. Không có đậu được tạo ra, không có đậu được tự động. Không có gì!

Đó là bởi vì, như tôi đã nói trong đoạn đầu tiên, <context:annotation-config />chỉ hoạt động trên các hạt đậu được đăng ký trong bối cảnh ứng dụng. Bởi vì tôi đã loại bỏ cấu hình XML cho ba bean, không có bean nào được tạo và <context:annotation-config />không có "mục tiêu" nào để làm việc.

Nhưng đó sẽ không phải là vấn đề <context:component-scan>có thể quét một gói để "mục tiêu" hoạt động. Hãy thay đổi nội dung của cấu hình XML thành mục sau:

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

Khi tôi tải bối cảnh tôi nhận được đầu ra sau:

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

Hmmmm ... thiếu một cái gì đó. Tại sao?

Nếu bạn nhìn gần các lớp, lớp Acó gói com.yyynhưng tôi đã chỉ định trong <context:component-scan>gói sử dụng, com.xxxvì vậy lớp này hoàn toàn bỏ lỡ Alớp của tôi và chỉ được chọn BCnằm trong lớpcom.xxx gói gói.

Để sửa lỗi này, tôi cũng thêm gói khác này:

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

và bây giờ chúng tôi nhận được kết quả mong đợi:

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

Và đó là nó! Bây giờ bạn không còn định nghĩa XML nữa, bạn có chú thích.

Như một ví dụ cuối cùng, giữ lớp chú thích A, BCvà thêm những điều sau đây để XML, những gì chúng ta sẽ nhận được sau khi tải bối cảnh?

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

Chúng tôi vẫn nhận được kết quả chính xác:

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

Ngay cả khi bean cho lớp Akhông thu được bằng cách quét, các công cụ xử lý vẫn được áp dụng bởi <context:component-scan>trên tất cả các bean được đăng ký trong ngữ cảnh ứng dụng, ngay cả đối vớiA khi được đăng ký thủ công trong XML.

Nhưng nếu chúng ta có XML sau đây, chúng ta sẽ nhận được các bản sao trùng lặp vì chúng ta đã chỉ định cả hai <context:annotation-config /><context:component-scan>?

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

Không, không trùng lặp, chúng tôi lại nhận được kết quả như mong đợi:

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

Đó là bởi vì cả hai thẻ đều đăng ký cùng một công cụ xử lý ( <context:annotation-config />có thể được bỏ qua nếu <context:component-scan>được chỉ định) nhưng Spring chỉ quan tâm đến việc chạy chúng một lần.

Ngay cả khi bạn tự đăng ký các công cụ xử lý nhiều lần, Spring vẫn sẽ đảm bảo chúng chỉ thực hiện phép thuật của chúng một lần; XML này:

<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" />

vẫn sẽ tạo ra kết quả sau:

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

OK, đó là về rap nó lên.

Tôi hy vọng thông tin này cùng với phản hồi từ @Tomasz Nurkiewicz và @Sean Patrick Floyd là tất cả những gì bạn cần để hiểu cách thức <context:annotation-config><context:component-scan>hoạt động.


8
Trích dẫn: "<bối cảnh: chú thích-config /> có thể được bỏ qua nếu <bối cảnh: quét thành phần> được chỉ định". Tại sao bao giờ sử dụng chú thích-config sau đó? Tại sao nó tồn tại?
CodeClimber

2
Câu trả lời chính xác! Không có gì giống như một ví dụ rõ ràng ngắn với mô tả ngắn gọn. Hiểu toàn bộ điều trong một lần đọc.
Jigish

19
Tôi muốn bạn viết toàn bộ hướng dẫn mùa xuân! Phần giải thích tốt nhất về bất cứ điều gì liên quan đến Spring Framework khó hiểu. Cảm ơn.
eskalera

7
Vì vậy, giải thích đơn giản và nổi bật. Bên cạnh nhận được câu trả lời, tôi cũng học được cách hay để nói mọi thứ :)
Amir Al

2
Phong cách viết của bạn rất dễ dàng cho người mới bắt đầu hiểu. Tôi hy vọng bạn có thể viết một cuốn sách về mùa xuân cơ bản. Tôi hứa sẽ mua nó.
emeraldhieu

167

Tôi tìm thấy bản tóm tắt tốt đẹp này trong đó chú thích được chọn bởi khai báo nào. Bằng cách nghiên cứu nó, bạn sẽ thấy rằng <context:component-scan/>nhận ra một siêu chú thích được công nhận bởi <context:annotation-config/>, cụ thể là:

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

Như bạn có thể thấy một <context:component-scan/>cách hợp lý mở rộng một <context:annotation-config/> với tính năng quét thành phần CLASSPATH và các tính năng Java @Configuration.


16
@Tomasz liên kết xuống :(
Anand Rockzz 2/12/2015

95

Mùa xuân cho phép bạn làm hai điều:

  1. Tự động đậu
  2. Tự động phát hiện đậu

1. Tự động kích hoạt
Thông thường trong applicationContext.xml bạn xác định các bean và các bean khác được nối dây bằng cách sử dụng các phương thức constructor hoặc setter. Bạn có thể nối dây bằng cách sử dụng XML hoặc chú thích. Trong trường hợp bạn sử dụng các chú thích, bạn cần kích hoạt các chú thích và bạn phải thêm <context:annotation-config />vào applicationContext.xml . Điều này sẽ đơn giản hóa cấu trúc của thẻ từ applicationContext.xml , bởi vì bạn sẽ không phải nối dây thủ công (hàm tạo hoặc setter) theo cách thủ công. Bạn có thể sử dụng @Autowirechú thích và các hạt sẽ được nối theo loại.

Một bước tiến để thoát khỏi cấu hình XML thủ công là

2. Tự động phát hiện Tự động phát
hiện đang đơn giản hóa XML thêm một bước nữa, theo nghĩa là bạn thậm chí không cần thêm <bean>thẻ trong applicationContext.xml . Bạn chỉ cần đánh dấu các hạt cụ thể bằng một trong các chú thích sau và Spring sẽ tự động nối các hạt được đánh dấu và các phụ thuộc của chúng vào thùng chứa Spring. Các chú thích như sau: @Controll , @Service , @Component , @Rep repository . Bằng cách sử dụng <context:component-scan>và trỏ gói cơ sở, Spring sẽ tự động khám phá và nối các thành phần vào thùng chứa Spring.


Là một kết luận:

  • <context:annotation-config />được sử dụng để có thể sử dụng chú thích @Autowired
  • <context:component-scan /> được sử dụng để xác định việc tìm kiếm các loại đậu cụ thể và cố gắng tự động.

1
Có thể sử dụng quét thành phần nhưng không phải chú thích-config bằng cách nào đó?
Koray Tugay

Sử dụng annotation-config = "false" trong ngữ cảnh: thẻ annotation-config.
Sara

38

<context:annotation-config> kích hoạt nhiều chú thích khác nhau trong các bean, cho dù chúng được định nghĩa trong XML hoặc thông qua quét thành phần.

<context:component-scan> là để xác định các bean mà không sử dụng XML

Để biết thêm thông tin, đọc:


Bạn có thể vui lòng giải thích thêm? Nếu tôi sử dụng, <context:component-scan>tôi sẽ không thể ghi đè định nghĩa bean bằng XML?
user938214097

@ user938214097 bạn có thể định nghĩa các bean trong XML hoặc thông qua các chú thích với quét thành phần
Sean Patrick Floyd

Có đủ để sử dụng <context:component-scan>? Tôi có mất một cái gì đó nếu tôi không sử dụng <context:annotation-config>?
user938214097

@Tomasz dường như đã trả lời rằng
Sean Patrick Floyd

31

Sự khác biệt giữa hai là rất đơn giản!.

<context:annotation-config /> 

Cho phép bạn sử dụng các chú thích được giới hạn để nối các thuộc tính và hàm tạo chỉ của các hạt!.

Trong khi

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

Cho phép tất cả những gì <context:annotation-config />có thể làm, với việc bổ sung các kiến sử dụng ví dụ .. @Component, @Service, @Repository. Vì vậy, bạn có thể nối toàn bộ đậu và không chỉ giới hạn ở các hàm tạo hoặc thuộc tính!.


31

<context:annotation-config>: Quét và kích hoạt các chú thích cho các bean đã đăng ký trong spring config xml.

<context:component-scan>: Đăng ký đậu +<context:annotation-config>


@Autowired và @Requiredcác thuộc tính mục tiêu vì vậy bean nên đăng ký vào mùa xuân IOC trước khi sử dụng các chú thích này. Để kích hoạt các chú thích này hoặc phải đăng ký các loại đậu tương ứng hoặc bao gồm <context:annotation-config />. tức là chỉ <context:annotation-config />làm việc với đậu đã đăng ký.

@Required phép RequiredAnnotationBeanPostProcessor chế biến công cụ
@Autowired cho phép AutowiredAnnotationBeanPostProcessorcông cụ chế biến

Lưu ý: Bản thân chú thích không có gì để làm, chúng tôi cần một Công cụ xử lý , một lớp bên dưới, chịu trách nhiệm cho quy trình cốt lõi.


@Rep repository, @Service và @Controll là @Component và chúng nhắm mục tiêu cấp lớp .

<context:component-scan>nó quét gói và tìm và đăng ký các hạt, và nó bao gồm các công việc được thực hiện bởi <context:annotation-config />.

Di chuyển XML sang chú thích


15

Các <context:annotation-config> thẻ nói mùa xuân để quét codebase cho tự động giải quyết các yêu cầu phụ thuộc của các lớp có chứa chú thích @Autowired.

Spring 2.5 cũng bổ sung hỗ trợ cho các chú thích JSR-250 như @Resource, @PostConstruct và @ PreDestroy.Use của các chú thích này cũng yêu cầu một số BeanPostProcessors nhất định phải được đăng ký trong bộ chứa Spring. Như mọi khi, chúng có thể được đăng ký dưới dạng các định nghĩa bean riêng lẻ, nhưng chúng cũng có thể được đăng ký ngầm bằng cách bao gồm<context:annotation-config> thẻ trong cấu hình mùa xuân.

Lấy từ tài liệu mùa xuân của cấu hình dựa trên chú thích


Spring cung cấp khả năng tự động phát hiện các lớp 'rập khuôn' và đăng ký BeanDefDefs tương ứng với ApplicationContext.

Theo javadoc của org.springframework.stereotype :

Các bản mẫu là Chú thích biểu thị vai trò của các loại hoặc phương thức trong kiến ​​trúc tổng thể (ở mức độ khái niệm, thay vì thực hiện, mức độ). Ví dụ: @Controll @Service @Rep repository, v.v ... Những thứ này được sử dụng cho các công cụ và các khía cạnh (tạo một mục tiêu lý tưởng cho các điểm cắt).

Để tự động phát hiện các lớp 'rập khuôn' như vậy, <context:component-scan> cần có thẻ.

Các <context:component-scan>thẻ cũng cho mùa xuân để quét mã cho đậu tiêm dưới gói (và tất cả các gói con của nó) quy định.


14
<context:annotation-config>

Chỉ giải quyết các chú thích @Autowired@Qualifertất cả, đó là về Tiêm phụ thuộc , Có những chú thích khác làm cùng một công việc, tôi nghĩ làm thế nào @Inject, nhưng tất cả đều giải quyết DI thông qua các chú thích.

Hãy lưu ý, ngay cả khi bạn đã khai báo <context:annotation-config>phần tử, bạn vẫn phải khai báo lớp của mình như thế nào là Bean, hãy nhớ rằng chúng tôi có ba tùy chọn khả dụng

  • XML: <bean>
  • @ Chú thích: @Component, @Service, @Rep repository, @Controll
  • JavaConfig: @Configuration, @Bean

Bây giờ với

<context:component-scan>

Nó làm hai việc:

  • Nó quét tất cả các lớp được chú thích bằng @Component, @Service, @Rep repository, @Contoder và @Configuration và tạo Bean
  • Nó làm công việc tương tự như thế nào <context:annotation-config>.

Do đó, nếu bạn khai báo <context:component-scan>, không cần thiết nữa tuyên bố <context:annotation-config>quá.

Đó là tất cả

Ví dụ, một kịch bản phổ biến là chỉ khai báo một bean thông qua XML và giải quyết DI thông qua các chú thích, ví dụ

<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" />

Chúng tôi chỉ khai báo các bean, không có gì về <constructor-arg><property>, DI được cấu hình trong các lớp riêng của chúng thông qua @Autowired. Điều đó có nghĩa là Dịch vụ sử dụng @Autowired cho các thành phần Kho lưu trữ của chúng và Kho lưu trữ sử dụng @Autowired cho JdbcTemplate, DataSource, v.v.


1
lời giải thích tuyệt vời Cảm ơn. @Manuel Jordan
BALS

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

hãy thử với <context:component-scan base-package="..." annotation-config="false"/>, trong cấu hình của bạn @Service, @Rep repository, @Component hoạt động tốt, nhưng @ Autowired, @ Resource@Inject không hoạt động.

Điều này có nghĩa là AutowiredAnnotationBeanPostProcessor sẽ không được bật và Spring container sẽ không xử lý các chú thích Autowires.


Điều này giúp tôi hiểu rằng <bối cảnh: quét thành phần /> hoàn toàn cho phép <bối cảnh: chú thích-config />; đó là quét định nghĩa đậu cũng như tiêm cần thiết. Tôi đã thử nghiệm với annotation-config = "false" và phép tiêm không hoạt động trừ khi tôi đặt rõ ràng bằng cách sử dụng <bối cảnh: annotation-config />. Cuối cùng sự hiểu biết của tôi tốt hơn trước!
CuriousMind

5
<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. -->

Điểm quan trọng khác cần lưu ý là context:component-scangọi ngầm context:annotation-configđể kích hoạt các chú thích trên đậu. Chà, nếu bạn không muốn context:component-scanngầm kích hoạt các chú thích cho mình, bạn có thể tiếp tục cài đặt phần tử chú thích-config của context:component-scanto false.

Để tóm tắt:

<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 -->

1

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

Điều này được sử dụng để nói với container rằng có các lớp bean trong gói của tôi quét các lớp bean đó. Để quét các lớp bean bằng container trên đầu bean, chúng ta phải viết một trong các chú thích loại âm thanh nổi như sau.

@Component, @Service, @Repository,@Controller

<context:annotation-config />:

Nếu chúng ta không muốn viết thẻ bean một cách rõ ràng bằng XML thì làm sao container biết nếu có một hệ thống dây tự động trong bean. Điều này có thể bằng cách sử dụng @Autowiredchú thích. chúng ta phải thông báo cho container rằng có dây tự động trong bean của tôi bằng cách context:annotation-config.


0

Một <context:component-scan/>thẻ tùy chỉnh đăng ký cùng một tập hợp các định nghĩa bean như được thực hiện bởi, ngoài trách nhiệm chính của nó quét các gói java và đăng ký các định nghĩa bean từ classpath.

Nếu vì lý do nào đó, việc tránh đăng ký định nghĩa bean mặc định này phải tránh, cách để làm điều đó là chỉ định một thuộc tính "annotation-config" bổ sung trong quét thành phần, theo cách này:

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

Tham khảo: http://www.java-allandsundry.com/2012/12/contextcomponent-scan-contextannotation.html


0

<context:annotation-config>:

Điều này nói với Spring rằng tôi sẽ sử dụng đậu được chú thích làm đậu mùa xuân và chúng sẽ được nối qua @Autowiredchú thích, thay vì khai báo trong tệp xml cấu hình mùa xuân.

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

Điều này cho biết Spring container, nơi bắt đầu tìm kiếm những hạt đậu có chú thích. Ở đây mùa xuân sẽ tìm kiếm tất cả các gói phụ của gói cơ sở.


0

bạn có thể tìm thêm thông tin trong tập tin lược đồ ngữ cảnh mùa xuân. sau đây là trong spring-bối cảnh-4.3.xsd

<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.

0

Là một bổ sung, bạn có thể sử dụng @ComponentScanđể sử dụng <context:component-scan>theo cách chú thích.

Nó cũng được mô tả tại spring.io

Định cấu hình các lệnh quét thành phần để sử dụng với các lớp @Configuration. Cung cấp hỗ trợ song song với phần tử Spring XML.

Một điều cần lưu ý, nếu bạn đang sử dụng Spring Boot, @Configuration và @ComponentScan có thể được ngụ ý bằng cách sử dụng chú thích @SpringBootApplication.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.